簡體   English   中英

Python Tornado 獲取 URL 參數

[英]Python Tornado get URL arguments

我試圖在調用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不是 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"}

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

如果您有任何其他問題,請告訴我。

在 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-encoded 參數(例如,如果您POST ))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM