我一直在尝试使用Tornado Framework创建一个Web服务。该系统应该处理如下URL:
IP:Port/?user=1822&catid=48&skus=AB1,FS35S,98KSU1
首先我创建了这段代码来阅读网址:
#!/usr/bin/env python
from datetime import date
import tornado.httpserver
import tornado.escape
import tornado.ioloop
import tornado.web
class WService(tornado.web.RequestHandler):
def get(self, url):
self.write("value of url: %s" %(url))
application = tornado.web.Application([
(r"/([^/]+)", WService)])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(9000)
tornado.ioloop.IOLoop.instance().start()
并输入网址:
IP:Port/hello_world
导致:
value of url: hello_world
除了“?”之外,URL中使用的任何字符都有效。更改代码时,例如:
application = tornado.web.Application([
(r"/?([^/]+)", WService)])
并发送带有“?”的网址标记(IP:Port/?hello_world
)结果是:
404: Not Found
研究龙卷风来解决这个问题我找到了get_argument
方法并尝试应用它,例如:
class WService2(tornado.web.RequestHandler):
def get(self):
user = self.get_argument('user', None)
respose = { 'user': user }
self.write(response)
和
application = tornado.web.Application([
(r"/", WService2),
])
但是发送了网址IP:Port/user=5
:
404:未找到
我也尝试过:
application = tornado.web.Application([
(r"/(\w+)", WService2),
])
还有:
application = tornado.web.Application([
(r"/([^/]+)", WService2),
])
并没有任何效果。
使用“?”读取网址时,我做错了什么标记并且有没有理由说Tornado没有使用user
这样的参数读取URL?有什么遗失的吗?
我已经将Tornado更新为最新版本,但它不能正常工作。
如果您需要更多信息或有些不明确的地方,请告知我们。
提前致谢,
答案 0 :(得分:5)
您没有看到整个字符串的原因是Tornado已经解析了它并将其放入request object。如果要查看包含查询字符串的整个路径,请查看 request.uri 。
在您的示例中,如果您要转到http://localhost:9000/hello_world?x=10&y=33
,则 request.uri 将设置为/hello_world?x=10&y=33
。
但是,正如您所说,最好使用get_argument(或get_arguments)来检查参数。这是你的例子,增加了以展示你如何阅读它们。
尝试前往http://localhost:9000/distance?x1=0&y1=0&x2=100&y2=100
,看看你得到了什么。
同样,试试http://localhost:9000/?user=1822&catid=48&skus=AB1,FS35S,98KSU1
。现在应该按预期工作了。
#!/usr/bin/env python
import math
import tornado.httpserver
import tornado.escape
import tornado.ioloop
import tornado.web
class DistanceService(tornado.web.RequestHandler):
def get(self):
x1 = float(self.get_argument('x1'))
y1 = float(self.get_argument('y1'))
x2 = float(self.get_argument('x2'))
y2 = float(self.get_argument('y2'))
dx = x1 - x2
dy = y1 - y2
magnitude = math.sqrt(dx * dx + dy * dy)
self.write("the distance between the points is %3.2f" % magnitude)
class WService(tornado.web.RequestHandler):
def get(self):
self.write("value of request.uri: %s" % self.request.uri)
self.write("<br>")
self.write("value of request.path: %s" % self.request.path)
self.write("<br>")
self.write("value of request.query: %s" % self.request.query)
application = tornado.web.Application([
(r"/distance", DistanceService),
(r"/", WService),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(9000)
tornado.ioloop.IOLoop.instance().start()