Это мой код для Facebook Messenger Platform с использованием Tornado.Не удалось закончить RequestHandler в Tornado с self.finish()
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
арг), он будет ловить MissingArgumentError
и выбросить:
File "index.py", line 20, in get
if mode == "subscribe" and token == "secretgarden":
UnboundLocalError: local variable 'mode' referenced before assignment
я ожидаю, когда это поймать мой MissingArgumentError
исключение, он будет возвращать 400
и завершите мой запрос. Но он все еще запускает следующий код. Я сделал что-то неправильно?
P.s: Я пробовал добавить return
после self.finish()
, это сработало, но я не видел, чтобы кто-то это делал. И документы, сказал:
RequestHandler.finish (порция = None) Завершает этот ответ, заканчиваясь запрос HTTP.
И я также прочитал этот вопрос: Tornado: Can I run code after calling self.finish() in an asynchronous RequestHandler?
Что-то случилось с моим кодом.
Спасибо, это имеет смысл. И спасибо за подсказку. :) –