这些是我项目中的中间件:
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才能到达视图。
请帮助我,谢谢
答案 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 /有效的问题,答案是:我还没有线索,抱歉;)
最后,如果您想要识别瓶颈,那么正确的分析器可能是更好的工具。