Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用self.finish()完成Tornado中的RequestHandler_Tornado - Fatal编程技术网

无法使用self.finish()完成Tornado中的RequestHandler

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

这是我使用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
并结束我的请求。但它仍在运行下一个代码。我做错什么了吗

注:我试过在
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
装饰器,但这只是一个示例。