我有以下代码:
application = tornado.web.Application([
(r"/get(.*)", GetHandler),
])
class GetHandler(tornado.web.RequestHandler):
def get(self, key):
response = {'key': key}
self.write(response)
当我转到localhost:port/get?key=python
时,我收到空键值{'key': ''}
。这有什么不对?
答案 0 :(得分:4)
(r"/get(.*)", GetHandler)
这将匹配/get
后跟的所有内容,例如:
/get
/getsomething
/get/something
/get.asldfkj%5E&(*&fkasljf
所以,让我们说localhost:port/get/something
发出请求,然后key
中GetHandler.get(self, key)
参数的值为/something
(是的,包括斜线,因为你匹配.*
,这意味着匹配所有东西)。
但如果请求出现在localhost:port/get?key=python
,则key
中GETHandler.get(self, key)
参数的值将为空字符串。这是因为包含?key=python
的部分称为Query String。它不是网址路径的一部分。龙卷风(或几乎所有其他Web框架)都不会将此作为参数传递给视图。
您可以通过两种方式更改代码:
如果您想要访问这样的视图 - localhost:port/get?key=python
,您需要更改您的网址配置和视图:
application = tornado.web.Application([
(r"/get", GetHandler),
])
class GetHandler(tornado.web.RequestHandler):
def get(self):
key = self.get_argument('key', None)
response = {'key': key}
self.write(response)
如果您不想更改自己的应用网址配置和视图,则需要按照以下方式发出请求 - localhost:port/get/python
。
但是你仍然需要对你的url配置进行一些小改动。在/
和get
之间添加斜杠 - (.*)
,否则密钥的值将为/python
而不是python
。
application = tornado.web.Application([
(r"/get/(.*)", GetHandler), # note the slash
])
答案 1 :(得分:1)
我希望你能弄明白你自己做错了什么 - 这对你来说是一项任务。
您的工作代码:
import tornado.ioloop
import tornado.web
class GetHandler(tornado.web.RequestHandler):
def get(self):
response = self.get_arguments("key")
if len(response) == 0:
# Handle me
self.set_status(400)
return self.finish("Invalid key")
self.write({"key":self.get_argument("key")})
def make_app():
return tornado.web.Application([
(r"/", GetHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()