问题
我的应用程序的所有路由都是通过flask-restful资源定义的。如何找到正在处理当前请求的资源对象/类?
为什么我需要这个
我想记录处理请求时引发的所有异常。我连接到flask.got_request_exception
,如http://flask.pocoo.org/docs/1.0/api/#signals所述,类似于下面的代码可以很好地工作:
from flask import got_request_exception, request
def log_exception(sender, exception, **extra):
logger.info("URL: {}, Exception: {}".format(request.url, type(exception).__name__))
got_request_exception.connect(log_exception, app)
唯一的问题是我想记录一些请求数据,但不是所有数据 - 例如,我想隐藏密码。我认为将日志数据逻辑与请求处理逻辑放在一起是个好主意,就像这样:
from flask import request
import flask_restful
class SomeResource(flask_restful.Resource):
def get(self):
# ... GET processing
def log_data(self):
# log all body params
return request.get_json()
class Login(flask_restful.Resource):
def post(self):
# ... authentication
def log_data(self):
# log selected body params
return {'login': request.get_json()['login'], 'password': 'HIDDEN!'}
然后在我的log_exception
函数中使用它:
from flask import got_request_exception, request
def log_exception(sender, exception, **extra):
resource_class = # THIS IS THE THING I'M MISSING
logger.info("URL: {}, Exception: {}, Data: {}".format(request.url, type(exception).__name__),
resource_class.log_data())
got_request_exception.connect(log_exception, app)
但也许这件事情应该用其他方式完成?
dispatch_request
,不再使用try/except
和setattr
,而是在调用super().dispatch_request
之前使用from flask import g
,g.processed_by = self
。我认为这是更干净的解决方案,并且在请求没有异常时也可以正常工作。 - jbet