代码之家  ›  专栏  ›  技术社区  ›  RudziankoÅ­

Tornado:获取请求参数

  •  5
  • RudziankoÅ­  · 技术社区  · 7 年前

    我有以下代码:

    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': ''}

    2 回复  |  直到 7 年前
        1
  •  11
  •   xyres    4 年前

    (.*) 在正则表达式中匹配所有内容。所以这个 (r"/get(.*)", GetHandler) –将匹配后面的任何内容 /get ,示例:

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

    假设一个请求在 localhost:port/get/something ,然后是 key 中的参数 GetHandler.get(self, key) /something (是的,包括斜杠,因为 .* 匹配所有内容)。

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


    有两种方法可以更改代码:

    1. 如果你想这样访问你的视图- localhost:port/get?键=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 (.*) ,因为否则键的值将为 /python 而不是 python .

      application = tornado.web.Application([
          (r"/get/(.*)", GetHandler), # note the slash
      ])
      
        2
  •  0
  •   Ickerday Argus Malware    6 年前

    我希望你能自己发现自己做错了什么——这是你的任务。

    您的工作代码:

    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()