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 ....缺少参数键”,但请求 URL 确实有一个关键参数。
在您的代码中 key
不是 GET 参数,它是 path
的一部分。 tornado.we.URLSpec 将正则表达式中的任何捕获组作为参数传递给处理程序的 get/post/etc
方法。
tornado.web.RequestHandler
有 RequestHandler.path_args and RequestHandler.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+
的路径片段吗?或者您的意思是您真的想要一个查询参数和忘了 ?
?)
无论如何,对于 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
)).
我正在尝试在调用 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 ....缺少参数键”,但请求 URL 确实有一个关键参数。
在您的代码中 key
不是 GET 参数,它是 path
的一部分。 tornado.we.URLSpec 将正则表达式中的任何捕获组作为参数传递给处理程序的 get/post/etc
方法。
tornado.web.RequestHandler
有 RequestHandler.path_args and RequestHandler.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+
的路径片段吗?或者您的意思是您真的想要一个查询参数和忘了 ?
?)
无论如何,对于 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
)).