简体   繁体   English

CSRF令牌丢失或不正确,404

[英]CSRF token missing or incorrect, 404

This is a widely asked question, but most of them have a different scenario, and I believe mine too. 这是一个普遍问到的问题,但其中大多数人的情况有所不同,我相信我也是。

Below are my project details 以下是我的项目详细信息

apps.ulrs.py: apps.ulrs.py:

urlpatterns = [
  url(r'^index/$', views.IndexView, name='index'),
  url(r'^signup/$', views.signupview, name='sign_up'),    
]

models.py: models.py:

from django.db import models
from django.core.urlresolvers import reverse
#from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class Registration(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    username = models.CharField(max_length = 250)
    password = models.CharField(max_length = 250)
    email = models.CharField(max_length = 250)

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Registration.objects.create(user=instance)
    instance.registration.save()

views.py: views.py:

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import UserCreationForm
from .forms import SignUpForm
#from django.corecontext_processors import csrf
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.views import generic


class IndexView(generic.View):
    templet_name = 'user_info/index.html'


def signupview(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=raw_password)
            login(request, user)
            return redirect('registration_form.html')

    else:
        form = SignUpForm()
    #return render(request,'user_info/registration_form.html',  {'form': form})
    return render_to_response('user_info/registration_form.html',  {'form': form,  }, context_instance = RequestContext(request))

I doing some research I came to know that we need to import "csrf" in my views.py , so I tried below: 我进行了一些研究,得知我们需要在views.py中导入“ csrf”,因此我尝试了以下操作:

#from django.corecontext_processors import csrf

But as per my understanding goes, it was deprecated since django 1.8. 但据我了解,自Django 1.8起已弃用。 Please correct me if I am wrong. 如果我错了,请纠正我。 I am using python 3.6, and django 1.11. 我正在使用python 3.6和Django 1.11。 So, what would be the library I am supposed to import for 'csrf'? 那么,应该为“ csrf”导入的库是什么?

I do have {% csrf_token %} inside my html file inside tag: 我的html文件中的标签中确实包含{%csrf_token%}:

{% block title %}register{% endblock %}

{% block body %}


{% block content %}
  <h2>Sign up</h2>
  <form method="post">
    {% csrf_token %}
    {% for field in form %}
      <p>
        {{ field.label_tag }}<br>
        {{ field }}
        {% if field.help_text %}
          <small style="color: grey">{{ field.help_text }}</small>
        {% endif %}
        {% for error in field.errors %}
          <p style="color: red">{{ error }}</p>
        {% endfor %}
      </p>
    {% endfor %}
    <button type="submit">Sign up</button>
  </form>
{% endblock %}
{% endblock %}

the exact error that I get is: 我得到的确切错误是:

Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
    CSRF token missing or incorrect.

Don't use render_to_response , it's obsolete. 不要使用render_to_response ,这已经过时了。 Uncomment the line that uses render and use that instead. 取消注释使用render的行,并改为使用它。

return render(request,'user_info/registration_form.html', {'form': form})

When you use render , there is no need to use RequestContext or the csrf context processor in your view. 当您使用render ,也没有必要使用RequestContext或视图中的CSRF背景处理器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM