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

我无法登录到 django 管理页面。当我输入一个有效的用户名和密码时,它只是再次显示登录页面,没有错误消息

这个问题在 Django 常见问题解答中,但是我已经在那里看过了答案,仍然无法通过初始登录屏幕。

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

我已经确认正在将管理员注册到 admin.py文件中,并确保在添加 INSTALLED_APPS之后使用 syncdb。 当我输入错误的密码,我 好的得到一个错误,所以我的管理员用户正在验证,只是没有继续到管理页面。

我试过将 SESSION_COOKIE_DOMAIN设置为机器的 IP 和无。(确认 Cookie 域显示为机器的铬 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 登录,结果都是返回到登录屏幕。

还有什么我不知道的吗?

设置

...
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

Urls.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/2.2.22 (Ubuntu) mod_wsgi/3.3 Python/2.7.3 configured

Apache apache2/sites- 可用/默认值:

<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',解决了这个问题。

66838 次浏览

我不认为管理员密码存储在 setings.py 文件中。它是在第一次 syncdb 时创建的。我认为你要么是跳过了创建超级用户,要么就是打错了。 尝试在项目根目录的终端中运行:

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

这将允许您重新输入您的管理登录

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

用户是否在登录后立即注销? 类似于 这个问题

您可以通过多种方式来检查它,我建议在注销信号中添加一个钩子(您可以将其放入您的 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)

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

我不是很确定,但问题可能出在你的 URL 配置上,具体来说就是这两行:

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

很久以前,我在浏览 Django 项目的管理时遇到了麻烦,因为一个 URL 配置覆盖了管理 URL 的一部分。似乎 Django 不喜欢指定包含元素的自定义 URL 配置,这些元素也是管理 URL 的一部分。在您的例子中,您在 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 配置有点挑剔。我现在还不能亲自测试。但也许这对你有点帮助。

听起来像是一个会话问题,因为在发布之后,你被重定向了,系统立刻就忘记了你已经登录了。

尝试以下方法:

  1. 检查您的会话后端是否正常工作。
  2. 如果您使用数据库缓存后端来检查事务中间件是否有问题,那么可以将其与缓存后端交换。
  3. 尝试数据库后端,并检查是否有会话存储在数据库表中
>>> 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

查看关于这个主题的其他文章,它可能与 sys.path 有关。可以在运行 dev 服务器和运行 WSGI 时检查和比较 sys.path 吗。

对于一些细节,有一个看看 这个和那个 文章。但在深入研究本文的细节之前,我将首先检查 sys.path。

调试步骤:

  • 确保数据库是同步的
    • 再次检查是否有 django _ session 表
  • 试着鉴定一下
    • 您是否看到在 django_session表中创建了一条记录?

如果不是

  • 删除非标准设置
    • AUTHENTATION _ BACKENDS = (‘ django.Contrib.auth.backends.ModelBackend’,)
    • SESSION _ EXPIRE _ AT _ BROWSER _ CLOSE = True
    • SESSION _ SAVE _ EveryY _ REQUEST = True
    • SESSION _ COOKIE _ AGE = 86400 # sec
    • SSION _ COOKIE _ DOMAIN = 无
    • SESSION _ COOKIE _ NAME = ‘ DSESSIONID’
    • SSION _ COOKIE _ SECURE = False
  • 确保数据库是同步的
    • 再次检查您是否有 django_session
  • 试着鉴定一下
    • 您是否看到在 django_session表中创建了一条记录?

如果有任何有用的调试,请告诉我。

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

您是否尝试使用以下方法创建用户:

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-创建一个。

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

  1. 使用 clean up 命令清除 django _ session 中的旧会话

  2. 检查 Firefox (firebug)或 chrome 开发工具中的 cookie 大小。因为在 admin (django.Contrib.messages.midware)中默认启用了消息传递。MessageMiddleware) ,通过多次编辑和删除,Cookie 大小有时会超过4096字节。一个快速测试是删除“消息”cookie,然后看看是否可以登录。

由于这个问题以及 Apache 的其他内存相关问题,我们实际上最终切换到了 nginx/uwsgi 路由。从那以后再也没见过这种情况在 nginx 出现过。

我也有同样的问题,重新启动服务器后就解决了:

systemctl restart nginx

您可以确保,已创建的用户被标记为 Is _ staff = True,我有时会忘记标记这一点,以允许用户登录 django admin

我遇到了一个相关的问题,在我尝试登录时,页面会在套接字最终被关闭之前挂起。事实证明我确实被登录了,但是其中一个登录信号处理器冻结了。

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

对我来说,我不能登录到火狐管理页面,但可以登录在铬。 问题是我在 setings.py 中设置了 CSRF _ COOKIE _ PATH。 永远不要使用它。它不能正常工作在 django 1.8。

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

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

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

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

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

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

SSION _ COOKIE _ SECURE = False

使用一些其他的虚拟环境。当我使用 Conda 环境时,它对我很有效。

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

所以我做的就是访问 http://wildlifeapi.herokuapp.com/admin/api/animal/和 BINGO! 它起作用了。

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

我的问题是,我的管理页面没有加载和不工作。这里是我所做的:

pip uninstall django
pip install django==2.2

更多详细信息请查看 姜戈文档

对于在升级 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,但是想想看..。

然而,我花了整整一个小时才最终弄明白。这里讨论的变量都不存在于我的 setings.py 中——直到现在也不存在——(可能是因为已经过去了将近10年,所以情况可能已经发生了很大的变化) ,比如 SESSION_ENGINESESSION_COOKIE_DOMAINCACHE_BACKENDdjango_session表... ..。
此外,Django 的常见问题在这个主题提到检查,如果我的帐户 is_activeis_staff,但不幸的是,从来没有提到如何做到这一点。