Python Tornado获取URL参数

the*_*ons 3 tornado

我正在尝试在get()调用之前检查请求的参数。我有一条路线描述如下:

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

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

def prepare(self):
    # inspect request arguments
    print(self.request.arguments) # prints "{}"
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我无法从中访问参数prepare()。最后一条语句输出一个空字典。我get()成功使用了像这样在函数中传递的参数:

def get(self, key):
      print(key) #works
Run Code Online (Sandbox Code Playgroud)

如何访问中的参数prepare()?我也尝试过self.argument('key')给出错误“ 400 GET .... Missing arguments key”,但是请求的URL中确实包含key自变量。

小智 5

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

tornado.web.RequestHandler具有RequestHandler.path_argsRequestHandler.path_kwargs,其中包含来自的位置和关键字参数URLSpec。这些可用的prepare方法:

def prepare(self):
    # inspect request arguments
    print(self.path_kwargs) # prints {"key": "something"}
Run Code Online (Sandbox Code Playgroud)


afx*_*ios 5

key正如 Gennady Kandaurov 提到的,您将作为 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)
Run Code Online (Sandbox Code Playgroud)

如果您还有任何疑问,请告诉我。