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

这个答案是相关的。


在端点方法结束时返回是一个很好的解决方案,但是如果您需要完成(例如,通过重定向)其他方法(如prepareinitializeget_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()

下一篇: Using python generators at the same time as Tornado