Django 3:不确定我为什么出现CSRF错误

问题描述 投票:0回答:2

我正在编写Django应用,我的注册页面出现403错误:

禁止(403)

CSRF验证失败。请求中止。

失败原因:

CSRF令牌丢失或不正确。

这里是视图:

def register(request):
    form = UserCreationForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('login')
    return render(request, "register.html", {'form' : form})

这是相关模板中的表格:

{% block content %}
<form method="POST">
    {% csrf_token %}
    {% for field in form %}
    <p>
        {{ field.label_tag }}
        {{ field }}
    </p>
    {% endfor %}
    <button type="submit" class="button">Register</button>
</form>
{% endblock %}

一些相关事实:

((1)我的网站上没有其他页面抛出此错误,即使许多页面需要CSRF令牌。

((2)我用来插入CSRF令牌的代码在此模板中与在其他模板中相同(除非我的三次检查使我失败)。

((3)[可能相关?]]这是我直接导入views.py中而不在form.py中首先进行修改的唯一形式。因此,views.py有两行是:

from django.contrib.auth.forms import UserCreationForm
[...]
from foo.forms import FooForm, FooBarForm, UploadFooForm

任何人都感谢。我已经尝试了大部分我认为是显而易见的调试步骤(删除{%csrf_token%}行,读取调试输出并确保[我认为]这些问题不适用于我,等等。

编辑:我正在Django 3中工作。我看到了另一个问题,并收到了有关@csrf_exempt装饰器的响应,但我相信相关装饰器在Django 3中不再可用。

python django debugging jinja2 csrf
2个回答
0
投票

我提供的答案不能长期使用,但是为了忽略此错误,我们可以使用django的内置装饰器方法,只需导入csrf_exempt并在显示错误的函数上方添加装饰器。

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def register(request):
    form = UserCreationForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('login')
    return render(request, "register.html", {'form' : form})

希望它会有所帮助,您会学到一些新的快乐的代码...


-1
投票

尝试删除迁移文件和数据库文件,然后进行迁移并再次迁移。

© www.soinside.com 2019 - 2024. All rights reserved.