无法使用self.finish()完成Tornado中的RequestHandler
这是我使用Tornado的Facebook Messenger平台的代码。
class IndexHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
try:
mode = self.get_argument("hub.mode")
token = self.get_argument("hub.verify_token")
challenge = self.get_argument("hub.challenge")
except tornado.web.MissingArgumentError:
self.set_status(400)
self.write("Bad request")
self.finish()
if mode == "subscribe" and token == "secretgarden":
self.set_status(200)
self.write(challenge)
self.finish()
else:
self.set_status(403)
self.write("GTFO")
self.finish()
问题是当我运行它(缺乏hub.mode
arg)时,它会捕获MissingArgumentError
并抛出:
File "index.py", line 20, in get
if mode == "subscribe" and token == "secretgarden":
UnboundLocalError: local variable 'mode' referenced before assignment
我期望它捕获到我的MissingArgumentError
异常,它将返回400
并结束我的请求。 但它仍然运行下一代码。 我做错了什么吗?
Ps:我尝试过在self.finish()
之后添加return
,但它工作正常,但我从来没有见过任何人这样做。 文档说:
RequestHandler.finish(chunk = None)完成此响应,结束HTTP请求。
我也读过这个问题:龙卷风:我可以在异步RequestHandler中调用self.finish()之后运行代码吗?
我的代码有问题。
调用finish
不会从您的方法返回。 你必须添加一个return
语句,否则你的方法中的下一个语句会被执行。
其实,你并不需要调用finish
所有:龙卷风请求处理程序自动调用finish
一次协同程序一样get
完成。
因此,要解决您的问题,请使用return
语句替换self.finish()
调用。
这个答案是相关的。
在端点方法结束时返回是一个很好的解决方案,但是如果您需要完成(例如,通过重定向)其他方法(如prepare
, initialize
和get_current_user
,它们不会工作,因为它们不一定在调用堆栈中最后一次。 “官方”方法是引发tornado.web.Finish
异常,这会在代码中的任何地方冒泡并破坏执行。 我一直在广泛地使用这样的东西:
class SomeHandler(SomeMoreGenericHandler):
def prepare(self):
super().prepare()
if not self.current_user:
self.redirect('/login')
raise tornado.web.Finish
链接地址: http://www.djcxy.com/p/27855.html
上一篇: Can not finish a RequestHandler in Tornado with self.finish()