首页 > 解决方案 > 在 Django / Python 中从头到尾跟踪单个请求

问题描述

Django 中有没有办法从头到尾唯一地跟踪单个请求?具体来说。我想知道 BeforeViewMiddleware 中的请求与 ResponseMiddleware 中的请求相同。

目前我使用request.session:

# executes at start of processing
class BeforeViewMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        id = insert_data_into_table()
        request.session["id"] = id

# executes when all processing is done
class ResponseMiddleware(object):
    def process_response(self, request, view_func, view_args, view_kwargs):
        # Match the request with the request in BeforeViewMiddleware
        id = request.session["id"]
        update_table(id)

但是,如果大约在同一时间从同一会话发出两个或多个请求,则此操作会失败。然后它变成了竞争条件,首先开始的可能最后完成,并且 ID 混淆了。

标签: pythondjango

解决方案


为什么不在请求本身上使用具体属性:

class BeforeViewMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        id = ...
        request._unik_attr = id

class ResponseMiddleware(object):
    def process_response(self, request, view_func, view_args, view_kwargs):
        id = request._unik_attr
        # ...

与会话不同,请求对象仅存在于单个请求-响应-周期。


推荐阅读