龙卷风:获取请求参数

时间:2017-11-13 17:23:23

标签: python json tornado

我有以下代码:

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 个答案:

答案 0 :(得分:4)

(r"/get(.*)", GetHandler)这将匹配/get后跟的所有内容,例如:

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

所以,让我们说localhost:port/get/something发出请求,然后keyGetHandler.get(self, key)参数的值为/something(是的,包括斜线,因为你匹配.*,这意味着匹配所有东西)。

但如果请求出现在localhost:port/get?key=python,则keyGETHandler.get(self, key)参数的值将为空字符串。这是因为包含?key=python的部分称为Query String。它不是网址路径的一部分。龙卷风(或几乎所有其他Web框架)都不会将此作为参数传递给视图。

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

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

    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. 如果您不想更改自己的应用网址配置和视图,则需要按照以下方式发出请求 - localhost:port/get/python
    但是你仍然需要对你的url配置进行一些小改动。在/get之间添加斜杠 - (.*),否则密钥的值将为/python而不是python

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

答案 1 :(得分:1)

我希望你能弄明白你自己做错了什么 - 这对你来说是一项任务。

您的工作代码:

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