繁体   English   中英

无法使用有效的用户名和密码登录到 django 管理页面

[英]Unable log in to the django admin page with a valid username and password

我无法登录 django 管理页面。 当我输入有效的用户名和密码时,它只是再次打开登录页面,没有任何错误消息

这个问题在django FAQ中,但我已经查看了那里的答案,但仍然无法通过初始登录屏幕。

我在 ubuntu 12.04 上使用 django 1.4 和 apache2 和 modwsgi。

我已经确认我正在admin.py文件中注册管理员,确保在添加INSTALLED_APPS后同步数据库。 当我输入错误的密码时,我确实得到了一个错误,所以我的管理员用户正在通过身份验证,只是没有进入管理页面。

我试过将SESSION_COOKIE_DOMAIN设置为机器的 IP 和 None。 (确认cookie域在chrome中显示为机器的IP)

此外,检查用户是否通过 shell 进行身份验证:

>>> from django.contrib.auth import authenticate
>>> u = authenticate(username="user", password="pass")
>>> u.is_staff
True
>>> u.is_superuser
True
>>> u.is_active 
True

尝试使用 IE8 和 chrome canary 登录,两者都会返回登录屏幕。

还有什么我想念的吗????

设置.py

...
MIDDLEWARE_CLASSES = (
    'django.middleware.gzip.GZipMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.transaction.TransactionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',    
    'django.contrib.staticfiles',
    'django.contrib.gis',
    'myapp.main',
)

SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_AGE = 86400 # sec
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_NAME = 'DSESSIONID'
SESSION_COOKIE_SECURE = False

网址.py

from django.conf.urls.defaults import * #@UnusedWildImport
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import admin

admin.autodiscover()

urlpatterns = patterns('',
    (r'^bin/', include('myproject.main.urls')),    
    (r'^layer/r(?P<layer_id>\d+)/$', "myproject.layer.views.get_result_layer"),
    (r'^layer/b(?P<layer_id>\d+)/$', "myproject.layer.views.get_baseline_layer"),
    (r'^layer/c(?P<layer_id>\d+)/$', "myproject.layer.views.get_candidate_layer"),    
    (r'^layers/$', "myproject.layer.views.get_layer_definitions"),
    (r'^js/mapui.js$', "myproject.layer.views.view_mapjs"),
    (r'^tilestache/config/$', "myproject.layer.views.get_tilestache_cfg"),
    (r'^admin/', include(admin.site.urls)),  
    (r'^sites/', include("myproject.sites.urls")),  
    (r'^$', "myproject.layer.views.view_map"),
)


urlpatterns += staticfiles_urlpatterns()

Apache 版本:

Apache/2.2.22 (Ubuntu) mod_wsgi/3.3 Python/2.7.3 configured

Apache apache2/站点可用/默认:

<VirtualHost *:80>
        ServerAdmin ironman@localhost
        DocumentRoot /var/www/bin
        LogLevel warn
        WSGIDaemonProcess lbs processes=2 maximum-requests=500 threads=1
        WSGIProcessGroup lbs
        WSGIScriptAlias / /var/www/bin/apache/django.wsgi
        Alias /static /var/www/lbs/static/
</VirtualHost>
<VirtualHost *:8080>
        ServerAdmin ironman@localhost
        DocumentRoot /var/www/bin
        LogLevel warn
        WSGIDaemonProcess tilestache processes=2 maximum-requests=500 threads=1
        WSGIProcessGroup tilestache
        WSGIScriptAlias / /var/www/bin/tileserver/tilestache.wsgi
</VirtualHost>

更新

当通过runserver使用开发服务器时,管理页面确实会继续,所以它看起来像是一个 wsgi/apache 问题。 还没想好呢。

解决方案

问题是我将设置文件SESSION_ENGINE值设置为'django.contrib.sessions.backends.cache' ,但没有正确配置CACHE_BACKEND

我已将 SESSION_ENGINE 更改为'django.contrib.sessions.backends.db' ,从而解决了该问题。

调试步骤:

  • 确保您的数据库已同步
    • 仔细检查您是否有 django_session 表
  • 尝试验证
    • 您是否看到在django_session表中创建了一条记录?

如果不

  • 删除非标准设置
    • AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
    • SESSION_EXPIRE_AT_BROWSER_CLOSE = 真
    • SESSION_SAVE_EVERY_REQUEST = 真
    • SESSION_COOKIE_AGE = 86400 # 秒
    • SESSION_COOKIE_DOMAIN = 无
    • SESSION_COOKIE_NAME = 'DSESSIONID'
    • SESSION_COOKIE_SECURE = 假
  • 确保您的数据库已同步
    • 仔细检查您是否有django_session
  • 尝试验证
    • 您是否看到在django_session表中创建了一条记录?

如果这会产生任何有用的调试,请告诉我。

示例设置文件: https : //github.com/fyaconiello/Django-Blank-Bare-Bones-CMS/blob/master/dbbbcms/settings.py

>>> from django.contrib.auth import authenticate
>>> u = authenticate(username="user", password="pass")
>>> u.is_staff = True
>>> u.is_superuser = True

Is there something else I'm missing?

u.is_active应该是True

我有这个问题。 问题是在生产中我将两个变量设置为True允许我使用 https 连接到站点。

如果您在 localhost http 上进行开发,则SESSION_COOKIE_SECURECSRF_COOKIE_SECURE应设置为False 将这两个变量更改为False允许我在本地开发时登录管理站点。

我不相信管理员密码存储在 settings.py 文件中。 它是在您第一次同步数据库时创建的。 我认为您要么跳过了创建超级用户的步骤,要么只是打错了字。 尝试在项目根目录的终端中运行。:

python django-admin.py 创建超级用户

这将允许您重新输入管理员登录信息。 也可以在这里看到https://docs.djangoproject.com/en/dev/ref/django-admin/

我们的应用程序中遇到了类似的问题,这些可能会有所帮助:

  1. 使用清理命令从 django_sessions 中清除旧会话

  2. 在 firefox(firebug) 或 chrome 开发者工具中检查 cookie 大小。 因为在 admin(django.contrib.messages.middleware.MessageMiddleware) 中默认启用消息传递,cookie 大小有时会因多次编辑和删除而大于 4096 字节。 一种快速测试是删除“消息”cookie,然后查看是否可以登录。

我们实际上最终切换到 nginx/uwsgi 路由,因为这个和其他与 apache 内存相关的问题。 从那以后就再也没有在 nginx 中看到过这种情况。

在自己无法登录后,我在上面的评论中看到有人提到删除非标准设置。

将此添加到我的本地设置中为我解决了这个问题

SESSION_COOKIE_SECURE = 假

听起来像是会话问题,因为在发布后您被重定向,系统立即忘记了您登录。

尝试以下操作:

  1. 检查您的会话后端是否正常工作。
  2. 如果您使用 db cache backend 检查事务中间件是否乱七八糟,请将其与缓存后端交换。
  3. 尝试 db backend 并检查是否有会话存储在 db 表中

我不太确定,但问题可能出在您的 URL 配置上,具体而言是这两行:

(r'^admin/', include(admin.site.urls)),  
(r'^sites/', include("myproject.sites.urls")),

很久以前,我在浏览 Django 项目的管理员时遇到了麻烦,因为单个 URL 配置覆盖了管理 url 的一部分。 当您指定包含也是管理 URL 一部分的元素的自定义 URL 配置时,Django 似乎不喜欢它。 在您的情况下,您在settings.py启用了应用程序django.contrib.sites 您可以通过访问http://127.0.0.1:8000/admin/sites/来访问此应用程序的管理面板。 可能是您的带有r'^sites/' URL 配置覆盖了管理 url 的一部分。 尝试重命名此特定 URL 配置或禁用INSTALLED_APPS django.contrib.sites以进行测试。

请注意,这只是一个假设。 我只知道 Django 的管理面板对使用类似名称(如其自己的 URL)的 URL 配置有点挑剔。 我目前无法自己测试。 但也许这对你有所帮助。

查看有关此主题的其他一些文章,它可能与 sys.path 相关。 你能在运行开发服务器和运行 WSGI 时检查和比较 sys.path 吗?

有关详细信息,请查看这篇那篇文章 但在进入本文的细节之前,我会先检查 sys.path。

您是否尝试通过以下方式创建用户:

python manage.py createsuperuser

当我在测试机器上创建数据库并将其迁移到部署服务器时,我遇到了同样的问题...

检查您是否至少有一个site可以使用。

>>> from django.contrib.sites.models import Site
>>> Site.objects.count()
(0.048) SELECT COUNT(*) FROM `django_site`; args=()
1

如果您在这里看到 0 - 创建一个。

确保具有以下条目的数据库用户表为真:

is_staff  => True  (if exit).
is_active  => True .
is_superuser => True.

免责声明:我还不能添加评论,所以我必须在这里要求澄清同时提出解决方案。 对不起。

用户登录后是否立即退出? 类似这个问题

可以通过多种方式检查,我建议在注销信号中添加一个钩子(可以放在models.py中):

from django.contrib.auth.signals import user_logged_out

def alertme(sender, user, request, **kwargs):
    print ("USER LOGGED OUT!") #or more sophisticate logging

user_logged_out.connect(alertme)

然后尝试登录并检查该消息是否出现在您的控制台中。 如果出现,那么您必须检查是否有重定向或自定义模板在登录后调用注销。 希望它可以帮助您找到问题。

我有同样的问题,重启服务器后才解决:

systemctl restart nginx

您可以确保,创建的用户已被标记为 Is_staff = True,我有时忘记标记它以允许用户登录到 django admin

我有一个相关的问题,我尝试登录并且页面会在套接字最终被杀死之前挂起。 结果证明我确实在登录,但其中一个登录信号处理器冻结了。

Celery 无法将其异步任务传递给 RabbitMQ,因为 RabbitMQ 服务器无法启动。

对我来说,我无法在 Firefox 中登录管理页面,但可以在 chrome 中登录。 问题是我在 settings.py 中设置了 CSRF_COOKIE_PATH。 永远不要使用那个。 它在 django 1.8 上不能正常工作。

我所做的是手动导航到我想访问的网址。 就像: http://wildlifeapi.herokuapp.com/admin/ ://wildlifeapi.herokuapp.com/admin/ 返回了可怕的 Heroku 应用程序错误。

所以我所做的是访问http://wildlifeapi.herokuapp.com/admin/api/animal/和 BINGO! 有效。

有趣的是它在我的手机上运行良好。 这可能是一个 Django 重定向错误。

我的问题是我的管理页面没有加载并且无法工作。 这是我所做的:

pip uninstall django
pip install django==2.2

有关更多详细信息,请查看Django 文档

对于升级 Django 后遇到此问题的任何人,问题可能是authenticate函数的签名在某些时候发生了变化。 如果签名与预期不符,后端将被忽略。 因此,请确保您的自定义身份验证后端authenticate方法如下所示:

class EmailUsernameAuthenticationBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
       # ...

不是这样(没有request参数):

class EmailUsernameAuthenticationBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):

这不是 OP 的问题,但我发布这个答案是希望有人可能和我一样走上同样的道路,并最终解决了这个问题。

一年后我又回到了旧的代码库,尽管通过了所有常规检查(用户存在,数据库中看起来没有任何错误,所有调试模式都已开启等),但仍被拒绝访问管理面板。 不幸的是,我忘记了管理员登录页面不是在通常的/admin路径上,而是在备用路径上。 /admin页面是一个虚假的登录页面,它总是导致登录失败。

此设置是使用应用程序django-admin-honeypot

聚会有点晚了,但对我来说,这是不同的,而且非常简单:无论出于什么原因,我的超级用户帐户都不见了,所以很明显,解决方案是我不得不重新创建它。
我有 99% 的把握在创建超级用户后执行了migratemakemigrations几次,但是想想看……

然而,我花了大约一个小时才最终弄清楚。 这里讨论的变量都不存在于我的 settings.py 中 - 到现在仍然不存在 - (可能因为已经将近 10 年了,所以事情可能发生了很大变化),比如SESSION_ENGINESESSION_COOKIE_DOMAINCACHE_BACKENDdjango_session表...
此外,Django 关于这个主题的常见问题解答提到检查我的帐户是否is_activeis_staff ,但不幸的是没有提到如何去做。

就我而言,它始终是SESSION_COOKIE_DOMAIN的问题:在本地计算机上,我将其设置为:

SESSION_COOKIE_DOMAIN = 'localhost'

在远程一域一上,例如:

SESSION_COOKIE_DOMAIN = 'yourdomainname.com'

在我的例子中,我无法登录,因为我使用email代替用户名(在我的例子中是“admin” )尝试登录。所以一定要确保你使用正确的用户名和密码登录

对我来说,以下设置适用于本地主机

AUTHENTICATION_BACKENDS = [
   'django.contrib.auth.backends.ModelBackend',
]

SESSION_COOKIE_DOMAIN = None
SESSION_ENGINE = 'django.contrib.sessions.backends.db'

使用其他一些虚拟环境。当我使用 conda 环境时,它对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM