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



我的龙卷风应用程序中有两个类。

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

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

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

现在,如果验证失败,这两个类prepare()方法都会调用finish()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')

当基类中的验证失败时,会出现此问题。然后它抛出运行时错误finish() called twice因为无论基类的验证结果如何prepare()子类的方法也会被执行。

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

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

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

最新更新