美味派。如何为响应添加执行时间?
Tastypie. How to add time of execution to responses?
我想测量某些查询的执行时间并将此数据添加到响应中,例如:{"meta": {"execution_time_in_ms": 500 ...}}
我知道如何将字段添加到 tastypie 的响应中,但我不知道如何测量其中的时间,我应该在哪里初始化计时器以及我应该在哪里停止它。有什么想法吗?
我不知道是否有通过设置直接执行此操作的方法,但我可以建议重写 get_list 方法并将此额外字段添加到元中,如下所示:
import json
from django.http import HttpResponse
class MyResource(ModelResource):
def get_list(self, request, **kwargs):
start = time.time()
resp = super(MyResource, self).get_list(request, **kwargs)
data = json.loads(resp.content)
data['meta']['execution_time_in_ms'] = time.time() - start
data = json.dumps(data)
return HttpResponse(data, content_type='application/json', status=200)
如果你想将它用于多个 ModelResource,你可以创建一个基础 class 来覆盖所有需要的方法,然后从这个基础 class.
继承
不过这仅适用于列表端点。我的建议是使用中间件来添加 X- headers,这是一个更干净、更通用的解决方案。
我找到了答案,自定义中间件在这种情况下很有用。它不仅适用于tastypie,也适用于DRF,以及任何其他框架。
middleware.py:
from datetime import datetime
class AddMetaMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
def process_request(self, request):
request._request_start_time = datetime.now()
def process_template_response(self, request, response):
if not hasattr(response, 'data'):
return response
response.data = {
'data': response.data,
'meta': {
'current_time' : datetime.now(),
'benchmark': {
'time': datetime.now() - request._request_start_time,
}
}
}
return response
我想测量某些查询的执行时间并将此数据添加到响应中,例如:{"meta": {"execution_time_in_ms": 500 ...}}
我知道如何将字段添加到 tastypie 的响应中,但我不知道如何测量其中的时间,我应该在哪里初始化计时器以及我应该在哪里停止它。有什么想法吗?
我不知道是否有通过设置直接执行此操作的方法,但我可以建议重写 get_list 方法并将此额外字段添加到元中,如下所示:
import json
from django.http import HttpResponse
class MyResource(ModelResource):
def get_list(self, request, **kwargs):
start = time.time()
resp = super(MyResource, self).get_list(request, **kwargs)
data = json.loads(resp.content)
data['meta']['execution_time_in_ms'] = time.time() - start
data = json.dumps(data)
return HttpResponse(data, content_type='application/json', status=200)
如果你想将它用于多个 ModelResource,你可以创建一个基础 class 来覆盖所有需要的方法,然后从这个基础 class.
继承不过这仅适用于列表端点。我的建议是使用中间件来添加 X- headers,这是一个更干净、更通用的解决方案。
我找到了答案,自定义中间件在这种情况下很有用。它不仅适用于tastypie,也适用于DRF,以及任何其他框架。
middleware.py:
from datetime import datetime
class AddMetaMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
def process_request(self, request):
request._request_start_time = datetime.now()
def process_template_response(self, request, response):
if not hasattr(response, 'data'):
return response
response.data = {
'data': response.data,
'meta': {
'current_time' : datetime.now(),
'benchmark': {
'time': datetime.now() - request._request_start_time,
}
}
}
return response