Django 1.11添加{% csrf_token %}仍遇403 CSRF验证失败求助
解决Django 1.11 CSRF验证失败(403 Forbidden)的问题
嘿,我看你在开发评论页面时遇到了这个头疼的403错误——明明已经在模板里加了{% csrf_token %},却还是过不了CSRF验证。从你给出的代码片段来看,问题大概率出在render_to_response的使用上!
Django 1.11里的render_to_response默认不会自动把请求上下文(RequestContext)传给模板,这就导致模板里的CSRF token没法和当前请求关联起来,自然会触发验证失败。下面给你几个靠谱的解决办法:
方法1:改用render函数(强烈推荐)
其实Django早就不推荐用render_to_response了,取而代之的render函数会自动帮你处理请求上下文,省心又不容易出错。把你的视图代码改成这样:
from django.shortcuts import render # 替换原来的render_to_response from restapp.models import Restaurant, Food from django.http import HttpResponseRedirect from django.utils import timezone # 假设你的视图函数是这个名字,根据实际情况调整 def comment_view(request): if request.method == 'POST': # 这里写你的表单提交处理逻辑 return HttpResponseRedirect('/comment-success/') # 其他业务逻辑,比如获取需要展示的数据 restaurants = Restaurant.objects.all() # 用render函数返回模板,自动带上请求上下文 return render(request, 'your_comment_template.html', {'restaurants': restaurants})
方法2:手动给render_to_response传入RequestContext
如果你实在不想改render_to_response,那一定要记得手动把请求上下文传进去,这样模板里的CSRF token才能正常工作:
from django.shortcuts import render_to_response from restapp.models import Restaurant, Food from django.http import HttpResponseRedirect from django.utils import timezone from django.template import RequestContext def comment_view(request): if request.method == 'POST': # 表单处理逻辑 return HttpResponseRedirect('/comment-success/') restaurants = Restaurant.objects.all() # 关键:传入context_instance=RequestContext(request) return render_to_response( 'your_comment_template.html', {'restaurants': restaurants}, context_instance=RequestContext(request) )
额外排查点
除了上面的核心问题,你还可以检查这几点:
- 确认
{% csrf_token %}是放在<form>标签内部的,别不小心写到表单外面去了 - 检查浏览器是否禁用了Cookie——CSRF验证依赖Cookie来存储token,禁用Cookie肯定会失败
- 如果是用AJAX提交评论(看描述应该是普通表单,这条可以先忽略),要确保请求头里带上了
X-CSRFToken字段
按照上面的方法调整后,应该就能顺利解决这个403错误啦!
内容的提问来源于stack exchange,提问作者naturlich
相关产品推荐
相关产品推荐

