2016-11-15 194 views
1

我正在爲我的學校編寫一個註冊網站,並使用Django作爲框架。對於註冊,我需要用戶名,密碼和註冊令牌。那些尚未驗證,我現在試圖做的是從註冊輸入頁面(使用POST請求)到「您已成功註冊」頁面。沿線的某處,csrf標記顯然拒絕被驗證。Django 403 CSRF驗證失敗

我的觀點:

def register(request): 
    return render(request, 'enroller/successfulEnroll.html') 

我的頁面:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 
    <form action="{% url 'register' %}" method="post"> {% csrf_token %} 
    <div class="container"> 
     <label><b>New Username</b></label> 
     <input type="text" placeholder="Username" name="uname" required> 
     <br> 
     <label><b>Password</b></label> 
     <input type="password" placeholder="Password" name="psw" required> 
     <br> 
     <label><b>Registration Password</b></label> 
     <input type="text" placeholder="Registration Key" name="reg" required> 
     <br> 
     <input type="submit" value="Register" /> 
    </div> 
    </form> 
</body> 
</html> 

當我試圖從註冊頁面成功的頁面去,它給了我一個錯誤403(CSRF驗證失敗請求中止)。但是,當我嘗試去url mysite.com/register/時,它返回我請求的頁面,沒有錯誤。

有什麼辦法解決這個問題嗎?我一直在尋找RequestContext,但我不完全確定它會在哪裏使用。

+1

csrf上的1.10文檔提到您正在使用的渲染函數(假設它是導入的django的渲染)應該覆蓋RequestContext。你到目前爲止顯示的代碼看起來很好。這可能是中間件設置,網站設置中的另一個問題,但不是您發佈的代碼中看起來不錯。 另一方面,當您直接使用瀏覽器發送GET請求的URL時,該瀏覽器與CSRF實際上並不相關。在成功的表單處理之後,可能需要考慮單獨的成功視圖並執行HttpResponseRedirect。 –

回答

0

得到它的工作。丹尼爾是對的 - 這是我的中間件配置問題。我在settings.py中的中間件數組之前添加了兩行,並且突然它工作。

SESSION_COOKIE_SECURE = True 
SESSION_EXPIRE_AT_BROWSER_CLOSE = True 

我不能說我完全知道爲什麼它的工作,或者問題是究竟是什麼,但現在的工作。謝謝丹尼爾!

0

也許你可以使用這種方法。而djang版本是1.11.1

from django.shortcuts import render 
from django.template.context_processors import csrf 

form = LoginForm() 
c = {'form': form} 
c.update(csrf(request)) 
return render(request, 'a_template.html', c) 

我發現這個方法在http://djangobook.com/security-in-django/
對於我來說,做工精細,但不是最好的,因爲多了一行。