注册表单不起作用(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的主要内容,如果未能解决你的问题,请参考以下文章