簡體   English   中英

Django CSRF令牌認證失敗

[英]Django CSRF token authentication failing

我正在嘗試編寫一個網頁,允許用戶輸入“想法”並將其保存到數據庫。 我想使用表單的Post方法。 我嘗試按照django頁面上的說明進行操作,但是身份驗證仍然失敗。

這是我的表單代碼:

<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令牌。 如果那是問題,請在您的路由器上添加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令牌應通過。

我認為您在渲染模板時需要添加context_instance=RequestContext(request)以便處理CSRF令牌

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

謝謝大家的幫助,但從

return render_to_response(...) 

return render(request, ...) 

終於解決了

是的,您必須使用render,或者必須向渲染中添加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是更好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM