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

How to check whether request is finished in Python Tornado?

我的 Tornado 应用程序中有两个 classes。

第一个 class 是 BaseRequestHandler,它扩展了 tornado.web.RequestHandler 并覆盖了它的 prepare() 方法,用于 API 所有传入请求的密钥验证。

第二个是特定于路由的 class ChildRequestHandler,它扩展了 BaseRequestHandler.

ChildRequestHandler 也有 prepare() 方法进行一些参数验证,但在此之前它调用 BaseRequestHandler.

prepare() 方法

现在,如果验证失败,classes 的 prepare() 方法会调用 tornado.web.RequestHandlerfinish() 方法。

以下是 classes 的示例。

基础Class

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']

Child class

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')

在 Base class 中验证失败时出现问题。然后它抛出运行时错误 finish() called twice,因为 child class 的 prepare() 方法也会被执行,而不管 Base class.

的验证结果如何

这可以通过从 class 的 prepare() 方法返回布尔值来识别验证是否通过,然后相应地允许执行 [=58] 的 prepare() 方法来解决=] class.

但是有没有像self.finished()这样的东西来识别请求是否已经完成?我查看了文档,找不到任何这样的方法。

没有 public finished() 方法(尽管没有理由不能添加)。我建议引发 tornado.web.HTTPError 的子类而不是直接调用 write_error,这样 prepare() 不会在产生错误后正常 return。