Django后台登录失败及CSRF令牌错误问题求助
问题排查与解决方案
一、解决Admin登录“账号密码不正确”问题
1. 检查用户密码存储方式
Django的User模型密码需要哈希存储,直接给password字段赋值明文会导致验证失败。在表单的save方法中必须使用set_password:
# forms.py示例 from django.contrib.auth.forms import UserCreationForm from .models import Profile, User class ProfileForm(UserCreationForm): # 你的表单字段 class Meta: model = User fields = ['username', 'email', 'password1', 'password2'] def save(self, commit=True): user = super().save(commit=False) # 必须用set_password哈希密码 user.set_password(self.cleaned_data['password1']) # 必须开启is_staff才能登录Admin user.is_staff = True if commit: user.save() # 关联创建Profile(如果信号没生效可手动创建) Profile.objects.create(user=user) return user
2. 验证用户权限与密码有效性
通过Django Shell确认用户状态:
python manage.py shell
执行以下代码:
from django.contrib.auth.models import User # 替换成你的用户名 user = User.objects.get(username="test_user") # 检查是否允许登录Admin print(user.is_staff) # 必须返回True # 检查密码是否匹配 print(user.check_password("你的密码")) # 返回True说明密码正确
如果is_staff为False,执行:
user.is_staff = True user.save()
3. 确认信号逻辑正确
- 确保
signals.py的信号接收器正确关联User的post_save信号:
# signals.py from django.db.models.signals import post_save from django.contrib.auth.models import User from django.dispatch import receiver from .models import Profile @receiver(post_save, sender=User) def create_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User) def save_profile(sender, instance, **kwargs): instance.profile.save()
- 在
apps.py中注册信号,确保Django启动时加载:
# apps.py from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app' def ready(self): import your_app.signals
- 确保
settings.py的INSTALLED_APPS中是你的AppConfig而非直接写App名称:
INSTALLED_APPS = [ # ... 'your_app.apps.YourAppConfig', # ... ]
二、解决CSRF令牌错误问题
1. 确认模板包含CSRF标签
在profile_form.html的POST表单中必须添加{% csrf_token %}:
<!-- profile_form.html --> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">提交</button> </form>
2. 检查Settings.py的CSRF配置
- 确保中间件包含CSRF中间件,且顺序正确:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 必须存在且顺序正确 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
- 开发环境下关闭HTTPS强制Cookie:
# settings.py SESSION_COOKIE_SECURE = False CSRF_COOKIE_SECURE = False
- 添加信任的源:
CSRF_TRUSTED_ORIGINS = ['http://127.0.0.1:8000']
3. 避免重复提交导致的错误
刷新登录页面出现CSRF错误是正常现象——因为刷新会重复发送之前的POST请求,此时令牌已失效。只需返回登录页面重新输入即可。
内容的提问来源于stack exchange,提问作者as666123456
相关产品推荐
相关产品推荐

