Python Tornado获取URL参数

9

在调用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参数。

3个回答

6
在你的代码中,key 不是 GET 参数,而是 path 的一部分。 tornado.web.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"}

5
正如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)

如果您有任何进一步的问题,请告知我。


1
以上解决方案对我来说似乎更合适,但还是谢谢您的正确回答。 - theQuestions

2

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

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

或将其转换为适当的查询参数。
`r"/users/\?key=(?P<key>\w+)"`

否则对于维护者来说,很难弄清楚您打算使用哪个方案(您真的想路由一个名为/key%3D\w+的路径片段吗?还是您真的忘记了?并且想要一个查询参数?)

无论如何,对于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也会检查请求体中是否有www-url编码的参数(例如,如果你POST))。


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