2012-10-04 119 views
3

所以我正在故宮(403)CSRF驗證失敗。請求中止。給出失敗的原因:CSRF令牌丟失或不正確。
我在我的middleware_classes中有'django.middleware.csrf.CsrfViewMiddleware'。 這裏是我的模板Django的--CSRF令牌丟失或不正確

<form name="input" action="/login/" method="Post"> {% csrf_token %} 
<input type="submit" value="Submit"></form> 

這是我的看法

from django.shortcuts import render_to_response 
from django.core.context_processors import csrf 
from django.template import RequestContext 
def login(request): 
    csrfContext = RequestContext(request) 
    return render_to_response('foo.html', csrfContext) 

嗯,我是新來的Django和大多數Web開發,但我似乎無法在這裏找到問題。任何幫助將非常感激!

此外,我已經嘗試了Django文檔

c = {} 
c.update(csrf(request)) 
# ... view code here 
return render_to_response("a_template.html", c) 
+2

只是一個方面說明:如果你是新來的Django,我會考慮使用基於類的視圖幾乎所有東西。即使你只是重寫'post',他們至少也會強制服務器將響應哪個HTTP請求類型。 – Arion

+0

什麼樣的模板/視圖是在

中創建的? –

+0

您需要在模板中添加'{%csrf_token%}'。並確保'RequestContext'存在..當然,'settings.py'中的相應中間件以及..如果問題仍然存在。我不確定但是..嘗試一些'@ csrf_exempt'裝飾器..等 – Surya

回答

2

嘗試只登錄功能之前添加@csrf_protect裝飾。

from django.views.decorators.csrf import csrf_protect 

@csrf_protect 
def login(request): 
    csrfContext = RequestContext(request) 
    return render_to_response('foo.html', csrfContext) 

如果窗體不在foo.html,那麼你需要的@csrf_protect方法添加到正在生成它的視圖功能。

+0

嘗試了它,仍然得到相同的錯誤,也嘗試了上面的建議,修復了render_to_response語法... – daabears

+0

問題可能是您要發佈到/ login /從另一個頁面,而另一個頁面沒有@ csrf_protect嗎?評論中的模板文字是從哪個頁面開始的?查看正在生成的HTML並驗證它是否包含csrf_protect標記。 –

+0

啊,就是這樣,非常感謝! – daabears

0

的方法,您應該做到以下幾點:

def login(request): 
    context = {} 
    request_context = RequestContext(request) 
    return render_to_response('foo.html', context, 
           request_context=request_context) 

這裏是official docsrender_to_response

+0

仍然收到相同的錯誤,我也嘗試使用@csrf_protect裝飾器沒有改善... – daabears

+0

在你的HTML,你看到的CSRF標記?如果不是,請嘗試添加'requires_csrf_token'裝飾器。 – miki725

2

我有同樣的問題,你和我發現這個代碼,解決我的問題。

from django.views.decorators.csrf import csrf_exempt 
from django.shortcuts import render 
from django.contrib import auth 

#in accounts.forms i've placed my login form with two fields, username and password 
from accounts.forms import LoginForm 

@csrf_exempt 
def login(request): 
    if request.method == "POST": 
     form = LoginForm(request.POST) 
     if form.is_valid(): 
     user = auth.authenticate(
       username=form.cleaned_data["username"], 
       password=form.cleaned_data["password"]) 
       auth.login(request, user) 
       return HttpResponseRedirect("/") 
     else: 
     form = LoginForm() 

return render(request, 'accounts/login.html', {'form':form}) 
+1

添加csrf_exempt不應該是必需的,並使您的網站易受攻擊。該裝飾器適用於您特別需要這些請求的邊緣案例,瞭解其風險並採取了其他預防措施。 – Andre

相關問題