【问题标题】:Tornado: get request argumentsTornado:获取请求参数
【发布时间】:2018-04-26 11:21:23
【问题描述】:

我有以下代码:

application = tornado.web.Application([
    (r"/get(.*)", GetHandler),
])

class GetHandler(tornado.web.RequestHandler):
    def get(self, key):
        response = {'key': key}
        self.write(response)

当我转到localhost:port/get?key=python 时,我收到空键值{'key': ''}。这里有什么问题?

【问题讨论】:

标签: python json tornado


【解决方案1】:
正则表达式中的

(.*) 匹配所有内容。所以这个——(r"/get(.*)", GetHandler)——将匹配后面跟/get的任何东西,例如:

/get
/getsomething
/get/something
/get.asldfkj%5E&(*&fkasljf

假设有一个请求来自localhost:port/get/something,那么GetHandler.get(self, key)key 参数的值将是/something(是的,包括斜线,因为.* 匹配所有内容)。

但是如果一个请求来自localhost:port/get?key=pythonGETHandler.get(self, key) 中的key 参数的值将是一个空字符串。这是因为包含?key=python 的部分被称为Query String。它不是 url path 的一部分。 Tornado(或几乎所有其他 Web 框架)不会将此作为参数传递给视图。


您可以通过两种方式更改代码:

  1. 如果您想像这样访问您的视图 - localhost:port/get?key=python,您需要更改您的 url 配置和视图:

    application = tornado.web.Application([
        (r"/get", GetHandler),
    ])
    
    class GetHandler(tornado.web.RequestHandler):
        def get(self):
            key = self.get_argument('key', None)
            response = {'key': key}
            self.write(response)
    
  2. 如果您不想更改应用 url 配置和视图,则需要发出这样的请求 - localhost:port/get/python
    但是您仍然需要对您的 url 配置进行一些小的更改。在 get(.*) 之间添加一个斜杠 - /,否则 key 的值将是 /python 而不是 python

    application = tornado.web.Application([
        (r"/get/(.*)", GetHandler), # note the slash
    ])
    

【讨论】:

    【解决方案2】:

    我希望你能自己弄清楚你做错了什么——这是你的任务。

    你的工作代码:

    import tornado.ioloop
    import tornado.web
    
    class GetHandler(tornado.web.RequestHandler):
        def get(self):
            response = self.get_arguments("key")
            if len(response) == 0:
                # Handle me
                self.set_status(400)
                return self.finish("Invalid key")
            self.write({"key":self.get_argument("key")})
    
    
    def make_app():
        return tornado.web.Application([
            (r"/", GetHandler),
        ])
    
    if __name__ == "__main__":
        app = make_app()
        app.listen(8888)
        tornado.ioloop.IOLoop.current().start()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2011-03-07
      • 2019-03-05
      • 2016-05-04
      • 1970-01-01
      相关资源
      最近更新 更多