【问题标题】:Django CSRF token authentication failingDjango CSRF 令牌认证失败
【发布时间】:2014-10-21 11:31:07
【问题描述】:

我正在尝试编写一个网页,允许用户输入“想法”并将其保存到数据库中。我想使用表单的 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>

我的 URLconf 重定向 /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 身份验证正常工作?

【问题讨论】:

  • 尝试@csrf_exempt装饰器到你的视图,这消除了csrf令牌验证,如果它有效,你可以挖掘更多......
  • @MartinM 谢谢,至少我现在可以继续开发!
  • 没问题,看看klasske的回答

标签: python django csrf


【解决方案1】:

几周前我遇到了类似的问题。似乎使用“/”重定向到 url 会导致它丢弃 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 令牌应该通过。

【讨论】:

  • 对不起,我是 Django n00b。是在 settings.py 文件中吗?
  • 对于我来说,它在 urls.py 中。它看起来像这样:路由器 = DefaultRouter(trailing_slash=False) urlpatterns = patterns('', ...)
【解决方案2】:

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

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

【讨论】:

  • 是当我使用第二个代码时我提出的(使用 c.update(crsf(request)))
  • 是的,您可以从中删除c.update(csrf(request))
【解决方案3】:

感谢所有提供帮助的人,但要从这里切换

return render_to_response(...) 

return render(request, ...) 

终于解决了

【讨论】:

【解决方案4】:

是的,您必须使用渲染,或者您必须将 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 是一个更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2020-08-07
    • 2020-09-19
    • 2021-07-14
    • 2012-05-16
    • 2018-09-07
    相关资源
    最近更新 更多