【问题标题】:CSRF token missing in Django form submissionDjango 表单提交中缺少 CSRF 令牌
【发布时间】:2019-07-28 09:59:23
【问题描述】:

我正在尝试通过 ajax 提交表单。我的模板如下:-

<form method="POST" id="form1" class="SignUP signupform">
        <div class="classheading">Sign-up</div>
        {% csrf_token %}
        <input type="text" name="user" placeholder="Username" class="sinput" required="true" />
        <input type="text"name="email" placeholder="Email" class="sinput" required="true"/>
        <input type="password"name="password"placeholder="Password" class="sinput" required="true"/>
        <input type="password"placeholder="Re-enter Password" class="sinput" required="true"/>
        <button type="submit" class="subform">Sign Up</button>
</form>

而提交此表单的 ajax 视图是:-

$(document).ready(function(){
    $('#form1').submit(function(){
    console.log('form is submitted');

    var csrftoken = $("[name=csrfmiddlewaretoken]").val();

    var formdata={
        'username':$('input[name=user]').val(),
        'email':$('input[name=email]').val(),
        'password1':$('input[name=password]').val(),
        'password2':$('input[name=password1]').val(),
    };
    console.log("Formvalue is taken");

    $.ajax({
        type:'POST',
        url:'/Submit/signingup',
        data:formdata,
        dataType:'json',
        encode:true,
        headers:{
        "X-CSRFToken": csrftoken
        },
    })

    .done(function(data){
        console.log(data);
    });


    event.preventDefault();
});
 });

在后端,我使用 Django 提交此表单。对应视图如下:-

@csrf_protect
def signup(request):
if request.method == 'POST':
    form = SignupForm(request.POST)
    if form.is_valid():
        user = form.save(commit=False)
        user.is_active = False
        user.save()
        current_site = get_current_site(request)
        mail_subject = 'Activate your blog account.'
        message = render_to_string('acc_active_email.html', {
            'user': user,
            'domain': current_site.domain,
            'uid':urlsafe_base64_encode(force_bytes(user.pk)).decode(),
            'token':account_activation_token.make_token(user),
        })
        to_email = form.cleaned_data.get('email')
        email = EmailMessage(
                    mail_subject, message, to=[to_email]
        )
        email.send()
        return HttpResponse("Confirm your email.")
else:
     return JsonResponse({'success': False,'errors': [(k, v[0]) for k, v in form.errors.items()]})

但它显示 403 错误。在命令提示符下,它显示“CSRF_TOKEN 丢失或不正确”。 可能的错误是什么?

【问题讨论】:

  • 你试过像this那样配置ajax csrf吗?

标签: javascript jquery ajax django django-models


【解决方案1】:

像这样在打开标签之后放置 csrf_token。并尝试

<form method="POST" id="form1" class="SignUP signupform">{% csrf_token %}

【讨论】:

  • 现在当我输入错误信息时它给我内部服务器错误。 ` 视图 webapp.views.signup 未返回 HttpResponse 对象。它返回 None 。`
  • 仅根据您上面的代码和您在此处评论的内容,您提交的表单似乎无效,因为您没有该 if 语句的处理程序。没有任何东西被退回。处理您的 is.valid 并重试。
【解决方案2】:

试试这个

$.ajax({
   url: url ,
   dataType: "json",
   type: "POST",
   data:{
    data: val ,
    csrfmiddlewaretoken: "{{ csrf_token }}",

   },
   success: function(data){
    console.log(data)
   }
 })

【讨论】:

    猜你喜欢
    • 2017-07-27
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2017-12-19
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多