我正在尝试在Flask中间件中记录数据。我使用process_response
函数来记录响应数据。
我有一个代码块,试图将持续时间注入响应的头部。但是X-Time-Taken
并没有被添加到标头中。响应标头为request header: Content-Type: text/plain; charset=utf-8
。
为什么X-Time-Taken
没有添加到标头中?
仅供参考,我的代码基于这一点,这表明我所做的应该有效。
class SampleWSGI():
def __init__(self, app, config=None):
self.app = app
self.app_id = config["app_id"]
self.secret_key = config["secret_key"]
def __call__(self, environ, start_response):
request = Request(environ)
resp = Response(start_response)
self._process_response(self.app_id, resp)
apikey = request.args.get("apikey")
if "favicon.ico" in request.path:
return
x = self.authorize_user(apikey=apikey, client_path=request.path)
if x.status_code < 400:
##Injects duration into response time
start_time = datetime.utcnow().timestamp()
def injecting_start_response(status, headers, exc_info=None):
end_time = datetime.utcnow().timestamp()
time_taken = str(end_time - start_time)
headers.append(('X-Time-Taken', time_taken))
return start_response(status, headers, exc_info)
return self.app(environ, injecting_start_response)
res = Response(u'Authorization failed', mimetype= 'text/plain', status=x.status_code)
return res(environ, start_response)
@staticmethod
def _process_response(app_id, response, request):
#req = Request(environ, shallow=True)
print(f'request header: {response.headers}')
尝试以下操作:
class SampleWSGI():
def __init__(self, app, config=None):
self.app = app
self.app_id = config["app_id"]
self.secret_key = config["secret_key"]
def __call__(self, environ, start_response):
request = Request(environ)
resp = Response(start_response)
# This line changed:
self._process_response(self.app_id, resp, request)
apikey = request.args.get("apikey")
if "favicon.ico" in request.path:
return
x = self.authorize_user(apikey=apikey, client_path=request.path)
if x.status_code < 400:
##Injects duration into response time
start_time = datetime.utcnow().timestamp()
def injecting_start_response(status, headers, exc_info=None):
end_time = datetime.utcnow().timestamp()
time_taken = str(end_time - start_time)
headers.append(('X-Time-Taken', time_taken))
return start_response(status, headers, exc_info)
return self.app(environ, injecting_start_response)
res = Response(u'Authorization failed', mimetype= 'text/plain', status=x.status_code)
return res(environ, start_response)
@staticmethod
def _process_response(app_id, response, request):
#req = Request(environ, shallow=True)
print(f'request header: {response.headers}')
如您所见,您没有将request
传递给_process_response()
。不幸的是,简单的错误会让一切变得糟糕。。。