龙卷风:获取请求参数

5

I have following code:

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

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

当我访问 localhost:端口号/get?key=python 时,我收到了空的键值 {'key': ''}。这里出了什么问题?

看看这个,应该会有帮助:https://dev59.com/CFsW5IYBdhLWcg3wk4Aq#34819282 - luantkow
2个回答

12
(.*)在正则表达式中匹配任何内容。因此,(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=python,则 GETHandler.get(self, key) 中的 key 参数将为空字符串。这是因为包含 ?key=python 的部分被称为查询字符串,它不是url路径的一部分。 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)
    
    如果您不想更改您的应用程序URL配置和视图,您需要像这样进行请求:localhost:port/get/python
    但是,仍然需要对您的URL配置进行小的更改。在get(.*)之间添加斜杠/,否则键的值将为/python而不是python
    application = tornado.web.Application([
        (r"/get/(.*)", GetHandler), # note the slash
    ])
    

0

我希望你能自己找出你做错了什么 - 这是你的任务。

你的工作代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接