Python Django CSRF令牌身份验证失败

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

我正在尝试编写一个网页,允许用户输入一个“想法”,并将其保存到数据库中。我想使用表单的Post方法。我尝试按照上的说明操作,但身份验证仍然失败

这是我的表格代码:

<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