【问题标题】:Tastypie. How to add time of execution to responses?好吃。如何为响应添加执行时间?
【发布时间】:2016-01-30 19:03:57
【问题描述】:

我想测量一些查询的执行时间并将这些数据添加到响应中,例如:{"meta": {"execution_time_in_ms": 500 ...}} 我知道如何向美味派的响应中添加字段,但我不知道如何在其中测量时间,我应该在哪里初始化计时器以及我应该在哪里停止它。有什么想法吗?

【问题讨论】:

    标签: python django tastypie


    【解决方案1】:

    我不知道是否可以通过设置直接执行此操作,但我可以建议覆盖 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,您可以创建一个基类来覆盖所有需要的方法,然后从该基类继承。

    【讨论】:

      【解决方案2】:

      这仅适用于列表端点。我的建议是使用中间件来添加 X- 标头,这是一种更简洁、更通用的解决方案。

      【讨论】:

        【解决方案3】:

        我找到了答案,自定义中间件在这种情况下很有帮助。它不仅适用于 sweetpie,还适用于 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
        

        【讨论】:

          猜你喜欢
          • 2016-04-19
          • 2020-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-05
          相关资源
          最近更新 更多