2016-12-14 159 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