0

我一直在尝试使用 Tornado 框架创建 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

研究 Tornado 来解决这个问题,我找到了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),   
])

但发送 URLIP:Port/user=5返回:

404:未找到

我也试过:

application = tornado.web.Application([
    (r"/(\w+)", WService2),   
])

并且:

application = tornado.web.Application([
    (r"/([^/]+)", WService2),   
])

没有任何效果。

我在阅读带有“?”的 URL 时做错了什么?标记并且 Tornado 没有读取带有参数的 URL 是否有原因user?有什么遗漏吗?

我已将 Tornado 更新到最新版本,但效果不佳。

如果您需要更多信息或不清楚的地方,请告诉我。

提前致谢,

4

1 回答 1

5

您没有看到整个字符串的原因是 Tornado 已经对其进行了解析并将其放入请求对象中。如果您想查看包括查询字符串在内的整个路径,请查看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()
于 2013-10-20T17:58:26.153 回答