2017-10-14 89 views
1

我正在學習Django和我爲此購買了一本書。我嘗試使用方法=「post」爲表單創建連接系統。當我提交的CSRF cookie沒有設置等...我在論壇上看到很多類似的問題,但仍然有點卡住,因爲我不明白所有的答案,我還沒有找到一些工作,例外@csrf_exempt但我看到它就像禁用了這些東西,這不是一個好主意。下面的代碼:Django CSRF cookie未設置。卡住

我的HTML頁面的login.html:

<form action="." method="post">{% csrf_token %} 
{% if error %} 
<p class="error">{{ error }}</p> 
{% endif %} 
<p> 
    <label for="email">E-mail :</label> 
    <input name="email" id="email" size="30" type="email" /> 
</p> 
<p> 
    <label for="password">Password :</label> 
    <input name="password" id="password" size="30" type="password" /> 
</p> 
<p> 
    <input type="submit" value="Log-in" /> 
    <a href="">Créer un compte</a> 
</p> 

我views.py:

from django.shortcuts import render_to_response 
from datetime import datetime 
from django.views.decorators.csrf import csrf_protect 
from django.http.response import HttpResponseRedirect 
# from django.http import HttpResponseRedirect 

def welcome(request): 
    return render_to_response('welcome.html', 
           {'curent_date_time' : datetime.now}) 


@csrf_protect 
def login(request): 
    if len(request.POST) > 0: 
     if 'email' not in request.POST or 'password' not in request.POST: 
      error = "Veuillez entrer un adresse mail et un mot de passe." 
      return render_to_response('login.html', {'error': error}) 
     else: 
      email = request.POST['email'] 
      password = request.POST['password'] 
      if password != 'sesame' or email != '[email protected]': 
       error = "Adresse de couriel ou mot de passe errone." 
       return render_to_response('login.html', {'error': error}) 
      else: 
       return HttpResponseRedirect('welcome/') 
    else: 
     return render_to_response('login.html') 

如果需要的話我還可以顯示我的設置。和一個錯誤messahe的屏幕如果它可以幫助太。

P.S:我知道這裏已經有很多東西了,但是我被困住了,一些個人幫助對我來說很好理解它來自何處。

+0

不確定它是否相關,但在代碼中沒有看到「」。 – roganjosh

+0

他是我忘記選擇它時,我複製了代碼 – SamHel

回答

2

您的模板嘗試呈現{% csrf_token %},但如果沒有訪問請求,它將無法完成。要通過在請求模板,用render()替換render_to_response()

@csrf_protect 
def login(request): 
    ... 
    return render(request, 'login.html') 

它不推薦使用render_to_response()了:

此功能之前引進渲染(中)和工作方式類似,只是它不會在響應中提供請求。這不被推薦,將來可能會被棄用。

+0

它工作完美,非常感謝你!我跟着一本舊書,但我沒有看到內容有點老舊的事實。 – SamHel