Python “如何修复”;禁止(403)CSRF验证失败。请求已中止。”;django中的错误

Python “如何修复”;禁止(403)CSRF验证失败。请求已中止。”;django中的错误,python,django,csrf,django-csrf,csrf-token,Python,Django,Csrf,Django Csrf,Csrf Token,我在标题中发现了这个常见的错误。我正在Django的虚拟环境文件夹中做一个项目 setting.py: 中间件=[ 'django.middleware.security.SecurityMiddleware', “django.contrib.sessions.middleware.SessionMiddleware”, 'django.middleware.common.CommonMiddleware', “django.middleware.csrf.CsrfViewMiddleware

我在标题中发现了这个常见的错误。我正在Django的虚拟环境文件夹中做一个项目

setting.py:

中间件=[
'django.middleware.security.SecurityMiddleware',
“django.contrib.sessions.middleware.SessionMiddleware”,
'django.middleware.common.CommonMiddleware',
“django.middleware.csrf.CsrfViewMiddleware”,
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.xFrameOptions中间件',
]
index.html:

{%load static%}
Instapic
{%csrf_令牌%}
登录表单
创建帐户
$(文档).ready(函数(){
$('#go')。单击(函数(){
$.post(“ajax注册”,
{
用户名:$(“#用户名”).val(),
电子邮件:$(“#电子邮件”).val(),
密码:$(“#密码”).val()
},
功能(数据、状态){
if(JSON.parse(data).Status=='Success'){
window.location='/';
}否则{
$('#errors').html(“+JSON.parse(data.Message+”)
$('#errors').css('显示','块')
}
});
返回false;
})
})
我在我的html文件中添加了
{%csrf\u token%}
,试图解决这个问题-没有效果。我在网上找到了以下标签示例:

不幸的是,我不知道如何使用它来修复我的错误。
谢谢你的帮助

我想,你不是在发布表单,而是在发布价值观。 在执行$.post()语句时,需要添加csrfmiddlewaretoken键

这是未测试的,但可能会解决您的问题

  csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value

通过更新在HTML文件中添加此行

$.post("ajax-sign-up",
    {
        username: $("#username").val(),
        email: $("#email").val(),
        password: $("#password"),
        csrfmiddlewaretoken: $('[name=csrfmiddlewaretoken]').val()
    },
更新代码为:

    {% load static %}
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Instapic</title>
    <link rel="stylesheet" href="{% static 'assets/bootstrap/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'assets/css/Login-Form-Clean.css' %}">
    <link rel="stylesheet" href="{% static 'assets/css/styles.css' %}">
</head>

<body>
    <div class="login-clean">
        <form method="post">
            {% csrf_token %}

            <h2 class="sr-only">Login Form</h2>
            <div class="illustration">
                    <div style="display: none" id="errors" class="well form-error-message"></div>
                    <img src="{% static 'assets/img/logo.jpg' %}">
            </div>
            <div class="form-group">
                <input class="form-control" id="username" type="text" name="username" required="" placeholder="Username" maxlength="20" minlength="4">
            </div>
            <div class="form-group">
                <input class="form-control" id="email" type="email" name="email" required="" placeholder="Email" maxlength="100" minlength="6">
            </div>
            <div class="form-group">
                <input class="form-control" id="password" type="password" name="password" required="" placeholder="Password" maxlength="20" minlength="6">
            </div>
            <div class="form-group">
                <button class="btn btn-primary btn-block" id="go" type="submit">Create Account</button>
            </div><a href="#" class="forgot">Already got an account? Login here ...</a></form>
    </div>
    <script src="{% static 'assets/js/jquery.min.js' %}"></script>
    <script src="{% static 'assets/bootstrap/js/bootstrap.min.js' %}"></script>
    <script src={% static "assets/js/django-ajax.js" %}></script>
    <script type="text/javascript">
        $(document).ready(function() {
        $('#go').click(function() {
        $.post("ajax-sign-up",
    {
        username: $("#username").val(),
        email: $("#email").val(),
        password: $("#password").val(),
        csrfmiddlewaretoken: $('[name=csrfmiddlewaretoken]').val()
    },
    function(data, status){
    if (JSON.parse(data).Status == 'Success') {
        window.location = '/';
    } else {
        $('#errors').html("<span>" + JSON.parse(data).Message + "</span>")
        $('#errors').css('display', 'block')
    }
    });
        return false;
        })
})
    </script>
</body>

</html>
{%load static%}
Instapic
{%csrf_令牌%}
登录表单
创建帐户
$(文档).ready(函数(){
$('#go')。单击(函数(){
$.post(“ajax注册”,
{
用户名:$(“#用户名”).val(),
电子邮件:$(“#电子邮件”).val(),
密码:$(“#密码”).val(),
csrfmiddlewaretoken:$('[name=csrfmiddlewaretoken]')。val()
},
功能(数据、状态){
if(JSON.parse(data).Status=='Success'){
window.location='/';
}否则{
$('#errors').html(“+JSON.parse(data.Message+”)
$('#errors').css('显示','块')
}
});
返回false;
})
})

如果您只是发布id为
注册表单的HTML表单的内容(将其添加到
),并且您的表单具有
{%csrf\u token%}
,那么您可以在ajax中使用:

$.post("ajax-sign-up", $("#signup-form").serialize(), function(data, status){...})

什么时候会发生这种情况?单击#go按钮时?您读过吗?如果您不在ajax post请求中单独传递字段,而只获取表单数据(其中包括csrftoken),可能会更容易。或者你按照我在之前评论中给出的链接中的说明进行操作。我没有得到它。我应该在哪里添加此内容?settings.py?HTML文件中没有。我更新了代码,您可以检查一下。试试@dirkgroten solution,这是本例中更好的解决方案。看看您自己的HTML模板,您已经编写了
$.post(“ajax注册”)…
您自己!我只是建议提交所有表单字段,而不是您明确编写的3个表单字段。请参阅下面@somil的答案,这里为您详细说明了它。但是,请慢慢阅读链接,直到你完全理解它。
$.post("ajax-sign-up", $("#signup-form").serialize(), function(data, status){...})