如何在Python Tornado中检查请求是否完成?

如何在Python Tornado中检查请求是否完成?,python,python-3.x,tornado,Python,Python 3.x,Tornado,我的Tornado应用程序中有两个类 第一个类是BaseRequestHandler,它扩展了tornado.web.RequestHandler,并重写了它的prepare()方法,用于对所有传入请求进行API密钥验证 第二个是路由特定类ChildRequestHandler,它扩展了BaseRequestHandler ChildRequestHandler还有一个prepare()方法,该方法执行一些参数验证,但在此之前它调用BaseRequestHandler的prepare()方法 现

我的Tornado应用程序中有两个类

第一个类是
BaseRequestHandler
,它扩展了
tornado.web.RequestHandler
,并重写了它的
prepare()
方法,用于对所有传入请求进行API密钥验证

第二个是路由特定类
ChildRequestHandler
,它扩展了
BaseRequestHandler

ChildRequestHandler
还有一个
prepare()
方法,该方法执行一些参数验证,但在此之前它调用
BaseRequestHandler的
prepare()
方法

现在,如果验证失败,两个类的
prepare()
方法调用
tornado.web.RequestHandler的
方法

下面是这两个类的示例

基类

class BaseRequestHandler(RequestHandler):
    # Override Write Error method
    def write_error(self, status_code, chunk):
        self.set_status(status_code)
        self.finish({'message': chunk})

    # Prepare method to validate API Key
    def prepare(self):
        # Send Unauthorized error
        if 'X-API-KEY' not in self.request.headers:
            self.write_error(401, 'API Key {X-API-KEY} Required')
            return None

        # Set API Key from header
        self.apikey = self.request.headers['X-API-KEY']
class ChildRequestHandler(BaseRequestHandler):

    # Check for required parameters
    def prepare(self):
        # Call Prepare of base class
        super(ChildRequestHandler, self).prepare()

        username = self.get_query_argument('username', None)
        if username is None:
            self.write_error(400, 'Username {username} Required')
儿童班

class BaseRequestHandler(RequestHandler):
    # Override Write Error method
    def write_error(self, status_code, chunk):
        self.set_status(status_code)
        self.finish({'message': chunk})

    # Prepare method to validate API Key
    def prepare(self):
        # Send Unauthorized error
        if 'X-API-KEY' not in self.request.headers:
            self.write_error(401, 'API Key {X-API-KEY} Required')
            return None

        # Set API Key from header
        self.apikey = self.request.headers['X-API-KEY']
class ChildRequestHandler(BaseRequestHandler):

    # Check for required parameters
    def prepare(self):
        # Call Prepare of base class
        super(ChildRequestHandler, self).prepare()

        username = self.get_query_argument('username', None)
        if username is None:
            self.write_error(400, 'Username {username} Required')
当基类中的验证失败时,就会出现问题。然后它抛出运行时错误
finish(),调用两次
,因为子类的
prepare()
方法也会执行,而不管基类的验证结果如何

这可以通过从基类的
prepare()
方法返回布尔值来解决,以确定验证是否通过,然后相应地允许执行子类的
prepare()
方法


但是是否有类似于
self.finished()
的方法来标识请求是否已经完成?我检查了文档,没有找到任何这样的方法。

没有公共的
finished()
方法(尽管没有理由不能添加)。我建议提升一个子类
tornado.web.HTTPError
,而不是直接调用
write\u error
,这样
prepare()
在产生错误后不会正常返回

没有公共的
finished()
方法(尽管没有理由不能添加)。我建议提升一个子类
tornado.web.HTTPError
,而不是直接调用
write\u error
,这样
prepare()
在产生错误后不会正常返回

哦,是的。。。我怎么会错过这个!!非常感谢。现在,我提出了
HTTPError
,并覆盖了
write\u error
方法来发送
application/json
响应。哦,是的。。。我怎么会错过这个!!非常感谢。现在,我提出了
HTTPError
,并重写了
write\u error
方法来发送
application/json
响应。