繁体   English   中英

Python Tornado 获取 URL 参数

[英]Python Tornado get URL arguments

我试图在调用get()之前检查请求的参数。 我有一条这样描述的路线:

user_route = r"/users/key=(?P<key>\w+)"
app = web.Application([
        web.URLSpec(user_route, user_manager.UserHandler), ..])

接下来,(在处理程序中) prepare()用于在get()之前检查请求。

def prepare(self):
    # inspect request arguments
    print(self.request.arguments) # prints "{}"

我遇到的问题是我无法从prepare()访问参数。 最后一条语句打印一个空的字典。 我的get()成功地使用了在函数中传递的参数,如下所示:

def get(self, key):
      print(key) #works

如何访问prepare()参数? 我也试过self.argument('key')它给出了一个错误“400 GET .... Missing argument key”,但请求的 URL 确实有一个关键参数。

在您的代码中, key不是 GET 参数,而是path的一部分。 tornado.we.URLSpec将正则表达式中的任何捕获组作为参数传递到处理程序的get/post/etc方法中。

tornado.web.RequestHandlerRequestHandler.path_argsRequestHandler.path_kwargs ,它们包含来自URLSpec的位置和关键字参数。 这些在prepare方法中可用:

def prepare(self):
    # inspect request arguments
    print(self.path_kwargs) # prints {"key": "something"}

正如 Gennady Kandaurov 提到的,您将key作为 we.URLSpec 路径的一部分传递,您可以使用 Tornado 的self.path_kwargs访问它。 如果你想将它作为参数传递,你可以使用RequestHandler.get_argument来获取你的get方法的参数,并在你的prepare方法上使用self.request.arguments来访问它作为你的初始意图。

您的代码可能如下所示:

class Application(tornado.web.Application):
    def __init__(self):
        user_route = r"/users"
        app = tornado.web.Application([
            tornado.web.url(user_route, user_manager.UserHandler), ..])

class UserHandler(tornado.web.RequestHandler):
    def get(self):
        key = self.get_argument('key')
        print(key)

    def prepare(self):
        # inspect request arguments
        print(self.request.arguments)

如果您有任何其他问题,请告诉我。

在 URL路径片段中使用像=这样的字符通常是不好的,因为它们通常用于查询参数。 要么不要使用它:

`r"/users/(?P<key>\w+)"`

或将其转换为适当的查询参数

`r"/users/\?key=(?P<key>\w+)"`

否则,维护人员试图弄清楚您打算使用哪种方案会令人困惑(您真的想路由一个名为/key%3D\\w+的路径片段吗?或者您真的是说您想要一个查询 arg 而忘记了? ? )

在任何情况下,对于 URL 路径片段匹配(“slug-matching”),使用参数解包也可以让您在处理程序中访问它们,而无需调用path_kwargs

# `r"/users/(?P<key>\w+)"`
class Handler(RequestHandler):
    def get(self, **kwargs):
        key = kwargs.get('key')
        # I prefer dict.get() here, since if you change the `+` to a `*`,
        # it's possible that no key was supplied, and kwargs['key']
        # will throw a KeyError exception

如果您打算对key使用查询参数,那么@afxentios 的答案是合适的。 (您也可以使用self.get_query_argument('key') ,它只会在 URL 中明确查找查询参数(而get_argument还会在请求 BODY 中检查 www-url-encoded 参数(例如,如果您POST ))。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM