我的自定义中间件返回呈现的响应(使用RequestContext
)。
这似乎导致csrf_token
上下文var设置为NOTPROVIDED
(Djangos sentinel value for not provided),而{% csrf_token %}
没有输出the CSRF middleware is called on process_view
,我假设在这种情况下我们永远不会跑。
中间件呈现的响应并不复杂,并且它是一种很少使用的特殊情况,但是更改语言需要CSRF令牌,因为这是对Djangos内置set_language
视图的POST请求
解决这个问题的最佳方法是什么?
答案 0 :(得分:2)
为什么在process_request中没有csrf令牌的原因是,在csrf中间件的process_view
中设置了令牌,该中间件在每个中间件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)
答案 1 :(得分:0)
来自1.5 docs:
process_request()应返回None或HttpResponse对象。
尝试:
class FooMiddleware():
def process_request(self, request):
if some_clause:
return render(request, 'foo.html', {'foo': 'bar'})
return None