Django的CsrfViewMiddleware与中间件生成的响应一起失败

时间:2012-03-19 23:19:35

标签: django

我的Django应用程序使用的是包含CsrfViewMiddleware和自己的中间件的中间件堆栈:

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.transaction.TransactionMiddleware',
'myapp.OwnMiddleware'
)

基本思想是,如果找不到URL,即没有找到视图函数,OwnMiddleware.process_response()将捕获此错误,如果HTTP状态为404(以及其他一些),则返回自己的响应条件得到满足。)

这很好,只有一个问题:因为当提供了无效的URL(根据URLconf)时没有调用视图函数,所以永远不会调用CsrfViewMiddleware.process_view(),因此不会生成CSRF cookie。

因此整个CSRF系统不起作用,并且OwnMiddleware.process_response中的CSRF令牌仍然设置为“NOTPROVIDED”(这意味着{%csrf_token%}生成一个空字符串而不是通常的隐藏表单字段)。

解决此问题的最佳方法是什么,即让OwnMiddleware捕获404并返回另一个(非404)响应,同时仍能在这些响应中使用CSRF令牌?

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以手动运行以下内容:

CsrfViewMiddleware.process_view(request, lambda: your_response, [], {})

P.S。我认为最好使用handler404来捕获404的