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:创建电子邮件登录字段而不是用户名后,超级用户和用户无法登录到管理员和用户页面

成功创建超级用户后无法登录 Heroku 管理面板

在 Django 中覆盖默认用户模型后无法登录

Django-nonrel 无法以超级用户身份登录到 localhost 管理站点

Django 中的项目:我无法在终端中创建超级用户来操作 Postgresql 中的数据

Django 超级用户登录不适用于 --no 输入选项