Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 塔斯皮耶。如何向响应添加执行时间?_Python_Django_Tastypie - Fatal编程技术网

Python 塔斯皮耶。如何向响应添加执行时间?

Python 塔斯皮耶。如何向响应添加执行时间?,python,django,tastypie,Python,Django,Tastypie,我想测量一些查询的执行时间,并将这些数据添加到响应中,比如:{“meta”:{“execution\u time\u in_ms”:500…}我知道如何向tastypie的响应中添加字段,但我不知道如何测量其中的时间,应该在哪里初始化计时器,应该在哪里停止计时器。有什么想法吗?我不知道是否有一种直接的方式通过设置来实现这一点,但我可以建议覆盖get\u list方法,并将此额外字段添加到meta中,如下所示: import json from django.http import HttpRes

我想测量一些查询的执行时间,并将这些数据添加到响应中,比如:
{“meta”:{“execution\u time\u in_ms”:500…}
我知道如何向tastypie的响应中添加字段,但我不知道如何测量其中的时间,应该在哪里初始化计时器,应该在哪里停止计时器。有什么想法吗?

我不知道是否有一种直接的方式通过设置来实现这一点,但我可以建议覆盖get\u list方法,并将此额外字段添加到meta中,如下所示:

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使用它,则可以创建一个基类,该基类覆盖所有需要的方法,然后从该基类继承。

但这只适用于列表端点。我的建议是使用中间件添加X-Header,这是一个更干净、更通用的解决方案。

我找到了一个答案,定制中间件在这种情况下很有用。它不仅适合tastype,还适合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