Django CSRF令牌认证失败

时间:2014-08-27 18:35:08

标签: python django csrf

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

这是我的表单代码:

<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>

我的网址会使用

行将/重定向到Ideas.views.home
url(r'^$', 'Ideas.views.home' , name='home')

视图本身是

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身份验证生效?

4 个答案:

答案 0 :(得分:0)

几个星期前我遇到了类似的问题。似乎用&#39; /&#39;重定向到网址导致它丢弃CSRF令牌。如果这是问题,请将trailing_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令牌应该通过。

答案 1 :(得分:0)

我认为您需要在渲染模板时添加context_instance=RequestContext(request)以处理csrf令牌

 return render_to_response('basic.html', c, context_instance=RequestContext(request))  

答案 2 :(得分:0)

感谢所有帮助过的人,但是从

切换
return render_to_response(...) 

return render(request, ...) 

终于修好了

答案 3 :(得分:0)

是的,您必须使用渲染,或者您必须将crsf添加到渲染中以进行响应,如下所示:

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是一个更好的选择。