2016-12-14 579 views
1

我试图在调用get()之前检查请求的参数。我有其被描述为这样的路径:Python Tornado获取URL参数

user_route = r"https://stackoverflow.com/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()成功使用的参数,因为它们是在传递这样的功能:在prepare()

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

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

回答

2

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

由于根纳季Kandaurov提到的,你通过了key作为we.URLSpec路径的一部分,你可以使用龙卷风的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