2

我的自定义中间件返回呈现的响应(带有RequestContext)。

似乎这会导致csrf_token上下文变量设置为NOTPROVIDEDDjangos sentinel value for not provided),并且{% csrf_token %}没有输出,因为调用了 CSRF 中间件process_view,我假设在这种情况下我们永远不会运行。

中间件渲染的响应并不复杂,而且它是一个很少使用的特殊情况,但是更改语言需要 CSRF 令牌,因为这是对 Django 内置set_language视图的 POST 请求。

解决这个问题的最佳方法是什么?

4

2 回答 2

2

之所以在 process_request 中没有可用的 csrf 令牌,是因为该令牌是在process_viewcsrf 中间件中设置的,该中间件在每个中间件之后运行process_request,因此您需要将代码移入process_view

def process_view(self, request, view_func, view_args, view_kwargs):
    if some_clause:
        return render(request, 'foo.html', {'foo': 'bar'})

    return view_func(request, view_args, view_kwargs)
于 2013-10-15T13:57:03.993 回答
0

1.5 文档

process_request() 应该返回 None 或 HttpResponse 对象。

尝试:

class FooMiddleware():
    def process_request(self, request):
        if some_clause:
            return render(request, 'foo.html', {'foo': 'bar'})
        return None
于 2013-10-15T10:26:48.270 回答