2014-08-27 124 views
0

我正在嘗試編寫一個允許用戶輸入「Idea」並將其保存到數據庫的網頁。我想使用表單的Post方法。我試圖按照django page上的說明進行操作,但驗證仍然失敗。Django CSRF令牌認證失敗

這是我的表單代碼:

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

我的URL配置重定向/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身份驗證的工作?

+1

嘗試@csrf_exempt裝飾器到您的視圖,這消除了csrf標記驗證,如果它的工作,您可以挖掘更多... – MartinM 2014-08-27 18:42:44

+0

@MartinM謝謝,至少我現在可以繼續發展! – elder4222 2014-08-27 18:52:44

+0

沒問題,看看klasske的回答 – MartinM 2014-08-27 18:56:08

回答

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是一個更好的選擇。

0

幾周前我有類似的問題。似乎用'/'重定向到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令牌應該通過。

+0

對不起,我是Django n00b。這是在settings.py文件中?我的 – elder4222 2014-08-27 18:45:56

+0

,它在urls.py中。它看起來像這樣︰router = DefaultRouter(trailing_slash = False)urlpatterns = patterns('',...) – 2014-08-27 18:47:09

0

我認爲你需要添加context_instance=RequestContext(request)當你渲染你的模板,以處理您的CSRF令牌

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

是,當我使用第二個代碼我把(與c.update(crsf(request))) – elder4222 2014-08-27 19:00:13

+0

是的,你可以從中刪除'c.update(csrf(request))'。 – klasske 2014-08-27 19:06:17

+0

這並沒有工作:( – elder4222 2014-08-27 19:16:07

0

謝謝大家誰幫助,但是從

return render_to_response(...) 

切換到

return render(request, ...) 

終於修好了

+0

之後,我發現了一個類似的(雖然不完全一樣)帖子在這裏: http://stackoverflow.com/questions/10388033/csrf-verification-failed-request-aborted?rq = 1 – elder4222 2014-08-27 19:17:33