Django自定义中间件呈现没有csrf令牌

时间:2013-10-15 10:07:25

标签: python django middleware django-csrf

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

这似乎导致csrf_token上下文var设置为NOTPROVIDEDDjangos sentinel value for not provided),而{% csrf_token %}没有输出the CSRF middleware is called on process_view,我假设在这种情况下我们永远不会跑。

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

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

2 个答案:

答案 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