注册表单不起作用(CSRF 令牌丢失或不正确。) django

Posted

技术标签:

【中文标题】注册表单不起作用(CSRF 令牌丢失或不正确。) django【英文标题】:sign up form doesn't work (CSRF token missing or incorrect.) django 【发布时间】:2021-09-03 14:52:04 【问题描述】:

我正在尝试在管理界面中将用户添加到用户组中的注册表单,但由于某种原因,注册表单没有保存在数据库中,而是给了我这个错误 禁止 (403) CSRF 验证失败。请求中止。失败原因: CSRF 令牌丢失或不正确。 有人可以告诉我我在这里缺少什么吗?

decorators.py

from django.http import HttpResponse
from django.shortcuts import redirect

def unauthenticated_user(view_func):
  def wrapper_func(request, *args, **kwargs):
    if request.user.is_authenticated:
      return redirect('index')
    else:
      return view_func(request, *args, **kwargs)
  return wrapper_func

def allowed_users(allowed_roles=[]):
    def decorator(view_func):
        def wrapper_func(request, *args, **kwargs):

            group = None
            if request.user.groups.exists():
                group = request.user.groups.all()[0].name

            if group in allowed_roles:
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse('You are not authorized to view this page')
        return wrapper_func
    return decorator

def admin_only(view_func):
    def wrapper_function(request, *args, **kwargs):
        group = None
        if request.user.groups.exists():
            group = request.user.groups.all()[0].name

        if group == 'user':
            return redirect('home')

        if group == 'admin':
            return view_func(request, *args, **kwargs)

    return wrapper_function

views.py

@unauthenticated_user   
def sign_up(request):

    data = CreateUserForm()
    if request.method == 'POST':
        data = CreateUserForm(request.POST or None)
        if data.is_valid():
            user = data.save()
            username = data.cleaned_data.get('username')
            group = Group.objects.get(name='user')
            user.groups.add(group)

            messages.success(request, 'Account was created for ' + username)

            return redirect('login')
        

    context = 'info':data,
    return render(request, 'signup.html', context)

@unauthenticated_user
def login_page(request):

    if request.method == 'POST':
        username = request.POST.get('username')
        password =request.POST.get('password')

        user = authenticate(request, username=username, password=password)

        if user is not None:
            login(request, user)
            return redirect('index')
        else:
            messages.info(request, 'Username OR password is incorrect')

    context = 
    return render(request, 'signin.html', context)

【问题讨论】:

当我的前端将数据发送到后端以进行持久化时,我遇到了 Flask 的这个问题。由于我的后端使用了单独的负载均衡器,因此请求看起来像是跨站点的。我通过在启动后端应用程序时添加使用 CORS 配置来修复它。如果这种情况与您的情况相似,请查看 Django 的 CORS 选项。 @G.J 我从来没有听说过。我会查查的,非常感谢! 【参考方案1】:

只需添加

% csrf_token %

在您的 signup.html、login.html...

例如:

  <form method="post">
   % csrf_token %
   // form here
  </form>

【讨论】:

以上是关于注册表单不起作用(CSRF 令牌丢失或不正确。) django的主要内容,如果未能解决你的问题,请参考以下文章

`/` 上的表单中的 CSRF 令牌丢失或不正确

Django - 在同一个模板(ajax 和表单)中处理多个 CSRF 令牌禁止(CSRF 令牌丢失或不正确。)

CSRF 令牌丢失或不正确

Django - CSRF 令牌丢失或不正确

禁止(CSRF 令牌丢失或不正确。)Django

Django1.10 - /i18n/setlang/ CSRF 令牌丢失或不正确