Django 中的异常错误。创建超级用户后无法登录管理员
Posted
技术标签:
【中文标题】Django 中的异常错误。创建超级用户后无法登录管理员【英文标题】:Unusual error in Django. Cannot login into admin after creating superuser 【发布时间】:2018-11-14 23:13:12 【问题描述】:这是我在 Django 应用程序中面临的一个奇怪问题。
配置:
Python 3.6 Django 2.0.6 数据库:Djongo(MongoDB 连接器:Djongo repository)我已将 create_superuser 覆盖为:
def create_superuser(self, email, is_staff, password):
user = self.model(
email=email,
is_staff=True,
is_active=True,
)
user.set_password(password)
user.save(using=self._db)
return user
我能够成功创建超级用户,但我无法登录管理页面。以下是我的回溯:
Internal Server Error: /admin/login/
Traceback (most recent call last):
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 398, in login
return LoginView.as_view(**defaults)(request)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/utils/decorators.py", line 62, in _wrapper
return bound_func(*args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/views/decorators/debug.py", line 76, in sensitive_post_parameters_wrapper
return view(request, *args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/utils/decorators.py", line 58, in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/utils/decorators.py", line 62, in _wrapper
return bound_func(*args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/utils/decorators.py", line 58, in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/utils/decorators.py", line 62, in _wrapper
return bound_func(*args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/utils/decorators.py", line 58, in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/views.py", line 66, in dispatch
return super().dispatch(request, *args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/views/generic/base.py", line 89, in dispatch
return handler(request, *args, **kwargs)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/views/generic/edit.py", line 141, in post
if form.is_valid():
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/forms/forms.py", line 179, in is_valid
return self.is_bound and not self.errors
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/forms/forms.py", line 174, in errors
self.full_clean()
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/forms/forms.py", line 377, in full_clean
self._clean_form()
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/forms/forms.py", line 404, in _clean_form
cleaned_data = self.clean()
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/forms.py", line 195, in clean
self.user_cache = authenticate(self.request, username=username, password=password)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/__init__.py", line 70, in authenticate
user = _authenticate_with_backend(backend, backend_path, request, credentials)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/__init__.py", line 116, in _authenticate_with_backend
return backend.authenticate(*args, **credentials)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/backends.py", line 22, in authenticate
if user.check_password(password) and self.user_can_authenticate(user):
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/base_user.py", line 111, in check_password
return check_password(raw_password, self.password, setter)
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/hashers.py", line 42, in check_password
if password is None or not is_password_usable(encoded):
File "/home/fractaluser/dev_eugenie/venv_eugenie/lib/python3.6/site-packages/django/contrib/auth/hashers.py", line 25, in is_password_usable
if encoded is None or encoded.startswith(UNUSABLE_PASSWORD_PREFIX):
AttributeError: 'int' object has no attribute 'startswith'
这是非常不寻常的(我理解错误的含义),我无法理解导致它的原因或如何修复它。
【问题讨论】:
【参考方案1】:还有其他变化吗?我无法复制此问题,如果我将 create_superuser
函数更改为您发布的内容,我什至无法创建超级用户。它只是失败了,因为用户名仍在传入,这是意料之外的。
但如果你碰巧让它运行,看起来password
参数可能是None
,这导致set_password
函数根据documentation 调用set_unusable_password
。
但是,要深入了解问题的实际情况,还需要更多信息。
【讨论】:
encoded.startswith(UNUSABLE_PASSWORD_PREFIX)
这就是问题所在。密码以编码形式输入,我不知道为什么它是int
。当我打印出来时,它会显示一个编码密码。
当你打印出来时它是什么样子的?是否以"!"
开头?
由于这种方法不起作用,我完全放弃了使用 Djongo。我现在不记得输出了。对不起!以上是关于Django 中的异常错误。创建超级用户后无法登录管理员的主要内容,如果未能解决你的问题,请参考以下文章
Django:创建电子邮件登录字段而不是用户名后,超级用户和用户无法登录到管理员和用户页面
Django-nonrel 无法以超级用户身份登录到 localhost 管理站点