Django - 403 禁止。 CSRF 令牌丢失或不正确
Posted
技术标签:
【中文标题】Django - 403 禁止。 CSRF 令牌丢失或不正确【英文标题】:Django - 403 Forbidden. CSRF token missing or incorrect 【发布时间】:2015-10-15 14:11:39 【问题描述】:我尝试为我的模型添加 ModelForm,但每次 POST 尝试都以“403 Forbidden。CSRF 验证失败。请求中止。失败原因:CSRF 令牌丢失或不正确”结束。我没有 render_to_response() 方法,所以我无法通过添加 RequestContext 来解决这个问题。这是我的模型:
from django.db import models
from django.forms import ModelForm
.
.
.
class Text(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
def __str__(self):
return self.title
class TextForm(ModelForm):
class Meta:
model = Text
fields = '__all__'
这是我的观点.py:
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Text, TextForm
.
.
.
def text_new(request):
if request.method == 'POST':
form = TextForm(request.POST)
if form.is_valid():
return HttpResponse('Test')
else:
form = TextForm()
return render(request, 'projectname/new.html', 'form': form)
这是 new.html 的一部分:
<form method="post" action="">
% csrf_token %
form
<input type="submit" value="Submit" />
</form>
还有一个问题:“text_name”方法名可以吗?非常感谢!
【问题讨论】:
【参考方案1】:将 csrf_exempt 添加到您的 views.py 中,如下所示:
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Text, TextForm
from django.views.decorators.csrf import csrf_exempt,csrf_protect #Add this
.
.
.
@csrf_exempt #This skips csrf validation. Use csrf_protect to have validation
def text_new(request):
if request.method == 'POST':
form = TextForm(request.POST)
if form.is_valid():
return HttpResponse('Test')
else:
form = TextForm()
return render(request, 'projectname/new.html', 'form': form)
【讨论】:
【参考方案2】:在导入中添加
from django.shortcuts import redirect
替换
return HttpResponse('Test')
与
return redirect('/') # or some other url of your URLconf
另外,在settings.py
中将'django.middleware.csrf.CsrfViewMiddleware'
添加到MIDDLEWARE_CLASSES
。
【讨论】:
以上是关于Django - 403 禁止。 CSRF 令牌丢失或不正确的主要内容,如果未能解决你的问题,请参考以下文章
部署到 AWS 服务器时 django 应用程序的 CSRF 令牌错误
Django - 使用 ExtJS 发布 ajax 请求禁止 403