【问题标题】:Django CSRF cookie not set. Stuck未设置 Django CSRF cookie。卡住
【发布时间】:2017-10-14 23:33:17
【问题描述】:

我正在学习 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>

我的意见.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:我知道这上面已经有很多东西了,但我被困住了,一些个人帮助对我了解它的来源很有帮助。

【问题讨论】:

  • 不确定是否相关,但我在您的代码中没有看到 &lt;/form&gt;
  • 他是我复制代码的时候忘记选中了

标签: python django cookies


【解决方案1】:

您的模板尝试呈现{% csrf_token %},但如果没有访问请求,它就无法这样做。要将请求传递给模板,请将render_to_response() 替换为render()

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

不建议再使用render_to_response()

这个函数在 render() 的引入之前并且工作类似,除了它不使请求在响应中可用。不推荐使用,将来可能会弃用。

【讨论】:

  • 效果很好,非常感谢!我跟着一本旧书,但我没想到内容有点旧。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 2020-12-05
  • 2013-03-28
  • 2012-05-03
  • 2016-11-26
  • 2013-05-12
相关资源
最近更新 更多