【问题标题】:Django getting csrf errorDjango 收到 csrf 错误
【发布时间】:2017-12-05 10:35:05
【问题描述】:

我已经做了一个注册表,通常它可以工作,但有时它会给我csrf错误,当我回到注册页面后,它又可以工作了:

Forbidden (403)
CSRF verification failed. Request aborted.

这是我制作的注册表:

views.py

def register(request):
    data = dict()
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            email = cd['email']
            password = cd['password1']
            new_user = CustomUser.objects.create_user(
                email=email,
                password=password,
            )
            new_user.valid_email = False
            new_user.save()
            current_site = get_current_site(request)
            subject = 'Activate your account.'
            message = render_to_string('registration/account_activation_email.html', {
                'user': new_user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(new_user.pk)),
                'token': account_activation_token.make_token(new_user),
            })
            new_user.email_user(subject, message)
            return redirect('account:account_activation_sent')
    else:
        form = RegistrationForm()
    data['form'] = form
    return render(request, 'registration/register.html', data)

在 register.html 中,我使用的是 {% csrf_token %}:

register.html

<form method="POST" class="m-login__form m-form" action="">
    {% csrf_token %}
    {{ user_form.non_field_errors }}
    {{ user_form.email.errors }}
    <div class="form-group m-form__group">
        <input type="text" placeholder="E-mail*" name="email" autocomplete="off">
    </div>
    {{ user_form.password1.errors }}
    <div class="form-group m-form__group">
        <input type="password" placeholder="Parola*" name="password1">
    </div>
    {{ user_form.password2.errors }}
    <div class="form-group m-form__group">
        <input type="password" placeholder="Confirmati parola*" name="password2">
    </div>
    <div class="m-login__form-action">
        <button id="m_login_signup_submit" class="btn m-btn m-btn--pill m-btn--custom m-btn--air m-login__btn m-login__btn--primary">
            Sign Up
        </button>
    </div>
</form>

可能是什么问题?

【问题讨论】:

  • 请添加 voew.py 和 urls.py
  • 它在那里,寄存器视图
  • 发布你的 urls.py 文件
  • 注册后是用户登录吗?基本上,当登录会话发生变化时,令牌也会发生变化。因此,如果您有多个选项卡并登录其中一个选项卡,然后返回注册,则会出现此错误。

标签: django


【解决方案1】:

当您使用 csrf 中间件时,您需要为您的 API 添加 csrf 权限,为您的 API 使用以下给定的装饰器,

from django.views.decorators.csrf import csrf_exempt


@csrf_exempt
def register(request):
data = dict()
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        cd = form.cleaned_data
        email = cd['email']
        password = cd['password1']
        new_user = CustomUser.objects.create_user(
            email=email,
            password=password,
        )
        new_user.valid_email = False
        new_user.save()
        current_site = get_current_site(request)
        subject = 'Activate your account.'
        message = render_to_string('registration/account_activation_email.html', {
            'user': new_user,
            'domain': current_site.domain,
            'uid': urlsafe_base64_encode(force_bytes(new_user.pk)),
            'token': account_activation_token.make_token(new_user),
        })
        new_user.email_user(subject, message)
        return redirect('account:account_activation_sent')
else:
    form = RegistrationForm()
data['form'] = form
return render(request, 'registration/register.html', data)

希望,这会解决问题。

【讨论】:

  • 这将删除 CSRF 保护。
  • 对不起,我很抱歉。如果首先使用 @csrf_protect 装饰器,它不会删除 CSRF 保护。同时使用它们没有任何意义,但我还是错了。我将使用其他信息编辑您的答案,以便删除反对票..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 2011-03-12
  • 2017-05-28
  • 2015-03-31
  • 2016-03-20
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多