无法使用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()
