无法使用self.finish()完成Tornado中的RequestHandler
这是我使用Tornado为Facebook Messenger平台编写的代码无法使用self.finish()完成Tornado中的RequestHandler,tornado,Tornado,这是我使用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
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
并结束我的请求。但它仍在运行下一个代码。我做错什么了吗
注:我试过在self.finish()
之后添加return
,它成功了,但我没有看到有人这样做。文件说:
finish(chunk=None)完成此响应,结束
HTTP请求
我还读到了这个问题:
我的代码有问题。调用
finish
不会从您的方法返回。必须添加return
语句,否则将执行方法中的下一条语句
实际上,您根本不需要调用finish
:一旦像get
这样的协同程序完成,Tornado请求处理程序就会自动调用finish
因此,要解决您的问题,请将您的self.finish()
调用替换为return
语句
在端点结束时返回方法是一个很好的解决方案,但是如果您需要从其他方法(如
prepare
、initialize
和get\u current\u user
)完成(例如通过重定向),它将不起作用,因为它们不一定是调用堆栈中的最后一个。“官方”方法是引发异常,异常将在代码中的任何位置冒泡并中断执行。我一直在广泛使用这样的东西:
class SomeHandler(SomeMoreGenericHandler):
def prepare(self):
super().prepare()
if not self.current_user:
self.redirect('/login')
raise tornado.web.Finish
谢谢,这很有道理。谢谢你的提示。:)是的,我知道这本质上等同于使用
@tornado.web.authenticated
装饰器,但这只是一个示例。