Python Django CSRF令牌身份验证失败
我正在尝试编写一个网页,允许用户输入一个“想法”,并将其保存到数据库中。我想使用表单的Post方法。我尝试按照上的说明操作,但身份验证仍然失败 这是我的表格代码:Python Django CSRF令牌身份验证失败,python,django,csrf,Python,Django,Csrf,我正在尝试编写一个网页,允许用户输入一个“想法”,并将其保存到数据库中。我想使用表单的Post方法。我尝试按照上的说明操作,但身份验证仍然失败 这是我的表格代码: <form action="/" method="post"> {% csrf_token %} <p> Title: </p> <input type="text" name="title"> </br> <p> Details: &l
<form action="/" method="post">
{% csrf_token %}
<p> Title: </p> <input type="text" name="title"> </br>
<p> Details: </p> <input type="text" name="details">
<input type="submit" value="Post">
</form>
这一观点本身是错误的
from django.shortcuts import render, render_to_response
from django.http import HttpResponse
from django.template import loader, Template, Context, RequestContext
from django.core.context_processors import csrf
from Ideas.models import Idea
# Create your views here.
def home(request):
if request.method == 'POST':
submitted = Idea.objects.create(title=request.POST['title'], detail=request.POST['details'], votes=0)
submitted.save()
m = RequestContext(request, {"passed_ideas": Idea.objects.all()})
return render_to_response('basic.html', m)
我也尝试过这样做:
from django.shortcuts import render, render_to_response
from django.http import HttpResponse
from django.template import loader, Template, Context, RequestContext
from django.core.context_processors import csrf
from Ideas.models import Idea
# Create your views here.
def home(request):
c = {}
c.update(csrf(request))
if request.method == 'POST':
submitted = Idea.objects.create(title=request.POST['title'], detail=request.POST['details'], votes=0)
submitted.save()
c['passed_ideas'] = Idea.objects.all()
return render_to_response('basic.html', c)
我如何让CSRF认证工作 几周前我也遇到过类似的问题。似乎重定向到带有“/”的url会导致它删除CSRF令牌。如果这是问题所在,请在路由器中添加尾随的_slash=False:
# urls.py
router = DefaultRouter(trailing_slash=False)
urlpatterns = patterns('',
url(r'^$', views.IndexView.as_view(), name='home'),
#all of your urls go here
)
这将消除重定向,CSRF令牌应该通过。我认为在呈现模板时需要添加
context\u instance=RequestContext(request)
,以便处理CSRF令牌
return render_to_response('basic.html', c, context_instance=RequestContext(request))
感谢所有帮助过我的人,但我还是从
return render_to_response(...)
到
最后修复了它是的,您必须使用render,或者您必须将crsf添加到render以响应,如下所示:
render_to_response('basic.html', add_csrf(request, ***other context***))
from django.core.context_processors import csrf
def add_csrf(request, ** kwargs):
"""Add CSRF and user to dictionary."""
d = dict(user=request.user, ** kwargs)
d.update(csrf(request))
return d
并不是说我喜欢这个选项,而是我就是这样做的。我认为RequestContext是一个更好的选择。尝试@csrf\u empture decorator以您的观点来看,这消除了csrf令牌验证,如果它有效,您可以挖掘更多…@MartinM谢谢,至少我现在可以继续开发!没问题,看看克拉斯克的回答对不起,我是Django n00b。这在settings.py文件中吗?对于我来说,它在url.py文件中。它看起来是这样的:router=DefaultRouter(trailing_slash=False)urlpatterns=patterns(“”,…)是这样的,当我使用我提供的第二个代码时(使用c.update(crsf(request)))是的,你可以从中删除
c.update(csrf(request))
。在这之后,我发现了一个类似的帖子(尽管不完全相同):
return render(request, ...)
render_to_response('basic.html', add_csrf(request, ***other context***))
from django.core.context_processors import csrf
def add_csrf(request, ** kwargs):
"""Add CSRF and user to dictionary."""
d = dict(user=request.user, ** kwargs)
d.update(csrf(request))
return d