Python Tornado获取URL参数

时间:2016-12-14 17:56:12

标签: tornado

我正在尝试在调用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确实有一个关键参数。

3 个答案:

答案 0 :(得分:3)

在您的代码中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"}

答案 1 :(得分:1)

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

您的代码如下:

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)

如果您有任何进一步的问题,请与我们联系。

答案 2 :(得分:0)

在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编码的参数(例如{{1} }}))。