在使用Django提交Post表单时遇到如下错误:
- Forbidden
(403) - CSRF
verification failed. Request aborted.
原因在"帮助"中已经写的很清楚了。
一般而言,这可以发生时,有一个真正的跨站请求伪造,或当Django的CSRF的机制还没有正确使用。 对于POST表单,您需要确保:
*该视图功能使用模板RequestContext的。
*在模板中,有{%csrf_token%}(模板网址标记在每个邮局形式的内部目标。
*如果您不使用CsrfViewMiddleware,那么你必须在view中使用csrf_protect,
您看到此页面的帮助部分,因为你在settings中设置了
所以,解决方法:
1、在表单Form里加上{%
csrf_token %}
2、在Settings里的
MIDDLEWARE_CLASSES增加配置:(一般默认就有)
'django.middleware.csrf.CsrfViewMiddleware',
#'django.middleware.csrf.CsrfResponseMiddleware',
1.2.X示例:
- MIDDLEWARE_CLASSES
= ( -
'django.middleware.common.CommonMiddleware', -
'django.contrib.sessions.middleware.SessionMiddleware', -
'django.middleware.csrf.CsrfViewMiddleware', -
'django.middleware.csrf.CsrfResponseMiddleware', -
'django.contrib.auth.middleware.AuthenticationMiddleware ' , -
'django.contrib.messages.middleware.MessageMiddleware', - )
3、在view中的方法上面加上@csrf_protect注解。同时使用RequestContext代替Context。示例:
----------------------------------------------------------------------------------------------------------------------------------
from django.template.context import RequestContext
from django.views.decorators.csrf import csrf_protect
@csrf_protect
def login(request):
...
returnrender_to_response('index.html',context_instance=RequestContext(request))
----------------------------------------------------------------------------------------------------------------------------------
详情:
https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf
扩展阅读:
django.contrib.csrf
在设置文件中将