没有设置Django CSRF cookie。卡住

时间:2017-10-14 14:00:04

标签: python django cookies

我正在学习如何工作Django和我为此买了一本书。我尝试使用method =“post”为表单建立连接系统。当我提交时,CSRF cookie没有设置等...我在论坛上看到了很多类似的问题,但仍然有点卡住,因为我不明白所有的答案,我没有找到除了@csrf_exempt之外有效的东西但是我看到它就像禁用了这些东西,这不是一个好主意。这是代码:

我的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 != 'pierre@lxs.be':
                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')

如果需要,我也可以显示我的设置。并且错误消息的屏幕如果它也可以帮助。

P.S:我知道已经有很多东西了,但是我被困住了,一些个人的帮助对我来说很有用,可以从中找到它。

1 个答案:

答案 0 :(得分:2)

您的模板尝试呈现{% csrf_token %},但如果没有访问请求则无法执行此操作。要将请求传递给模板,请将render_to_response()替换为render()

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

不建议再使用render_to_response()

  

此函数在引入render()之前,其工作方式类似,但它不会使响应中的请求可用。不建议这样做,将来可能会被弃用。