如何在django中间件中向请求主体添加字段

时间:2018-09-01 10:13:20

标签: django python-3.x django-middleware

我想在中间件的请求正文中添加新字段,并在视图中使用它。

我用谷歌搜索,但结果不起作用。

我该怎么办?

Django v2 python 3.6

2 个答案:

答案 0 :(得分:0)

尝试以下代码:

class SimpleMiddleware:
def __init__(self, get_response):
    self.get_response = get_response

def __call__(self, request):
    my_request  = request.GET.copy()
    my_request['foo']='bar'
    request.GET = my_request
    response = self.get_response(request)
    return response

我为您尝试过:将以上代码添加到example.py中,然后将'example.SimpleMiddleware',添加到MIDDLEWARE

我的view方法:

def index(request):
    for key in request.GET:
         print (key, '--->', request.GET[key])
    return render(request, 'example.html')

能够打印foo ---> bar的浏览器发送请求。

答案 1 :(得分:0)

您需要添加单独的自定义中间件,该中间件将在着陆到特定视图之前处理请求。以下是自定义中间件的代码:

class ProcessRequestMiddleware(MiddlewareMixin):
    """
    This middleware appends new payload in request body
    """

    def process_view(self, request, view_func, *view_args, **view_kwargs):
        request_data = getattr(request, '_body', request.body)
        request_data = json.loads(request_data)
        # here you can write the logic to append the payload to request data
        request._body = json.dumps(request_data)
        return None

注意-中间件位于通用应用程序内(common / middleware / custommiddleware.py)

现在将此中间件添加到settings.MIDDLEWARE列表:

"common.middleware.custommiddleware.ProcessRequestMiddleware"

现在,您只需调用json.loads(request.body),即可在所需的任何视图内检索已添加到custommiddleware中的有效负载。