为什么在Django中穿越中间件后需要更多时间才能到达视图?

时间:2017-09-22 09:18:48

标签: django django-rest-framework

这些是我项目中的中间件:

MIDDLEWARE_CLASSES = [ 
  'django.middleware.security.SecurityMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.middleware.csrf.CsrfViewMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
  'django.contrib.messages.middleware.MessageMiddleware',
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  'simple_history.middleware.HistoryRequestMiddleware',
  'apps.quiz.totaltimemid.TimeCalculateMiddleware',
  ]

我的自定义中间件,用于测量到达目标视图的最后一个中间件的process_view的时间(类QuizFetchView(APIView)):

class TimeCalculateMiddleware(object):

    def process_view(self, request, callback, callback_args, 
        callback_kwargs):
        self.req_start_time = time.time()


    def process_response(self,request, response):
        try :
            response['vreach_time'] = float(response['tt_start']) - self.req_start_time
            return response
        except :
            return response 

目标视图:

class QuizFetchView(APIView):
    permission_classes = [IsAuthenticated, IsAuthenticatedForRunningQuiz]
    def get(self, request: Request, key: str) -> Response:
        tt_start = time.time()
        .............. 
        .............. 
        ............
        Response['tt_start'] = tt_start
        return Response

对于要查看的登录请求中间件需要花费很少的时间,但是除了登录之外的后续请求需要25-35ms才能到达视图。

请帮助我,谢谢

1 个答案:

答案 0 :(得分:0)

注意:这些都不是一个合适的答案,但这对评论来说有点太长而且复杂。

第一点:异常处理程序在触发异常时不会免费提供,因此您确实希望使用包含测试替换try / except块,即:

if "tt_start" in response:
   response['vreach_time'] = float(response['tt_start']) - self.req_start_time

return response

第二点:中间件在进程启动时进行一次实例化,并在整个进程生命周期中重用,因此您不应过多依赖中间件的实例变量。这可能或多或少地在“多单线程进程”配置上工作,但保证在多线程环境中打破。 IOW,您最好将start_time存储在请求本身上。

第三点:在响应中存储tt_start是值得商榷的,但是你确定你想让它成为一个响应标题吗?

编辑:应该给自己喝杯咖啡并再次阅读你的片段,然后再说你正在录制整个视图执行时间。所以wrt /有效的问题,答案是:我还没有线索,抱歉;)

最后,如果您想要识别瓶颈,那么正确的分析器可能是更好的工具。