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

时间:2018-10-09 12:18:23

标签: python python-3.x tornado

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

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

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

ChildRequestHandler还具有prepare()方法,该方法执行一些参数验证,但在此之前它调用prepare()的{​​{1}}方法。

现在,如果验证失败,则两个类的BaseRequestHandler方法都将调用prepare()的{​​{1}}方法。

以下是这两个类的示例。

基本类

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()的东西来标识请求是否已经完成?我检查了文档,找不到任何这样的方法。

1 个答案:

答案 0 :(得分:2)

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