70

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

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

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

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

我已经尝试过设置SESSION_COOKIE_DOMAIN机器的 IP 和无。(确认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/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配置。

我已经更改了'django.contrib.sessions.backends.db'解决问题的 SESSION_ENGINE。

4

23 回答 23

64

调试步骤:

  • 确保您的数据库已同步
    • 仔细检查您是否有 django_session 表
  • 尝试进行身份验证
    • 您是否看到表中正在创建记录django_session

如果不

  • 删除非标准设置
    • AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)
    • SESSION_EXPIRE_AT_BROWSER_CLOSE = 真
    • SESSION_SAVE_EVERY_REQUEST = True
    • 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

于 2012-08-24T13:39:20.317 回答
20
>>> 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

于 2012-08-23T09:40:09.797 回答
12

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

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

于 2018-05-20T16:02:46.413 回答
3

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

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

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

于 2012-08-12T02:48:41.597 回答
3

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

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

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

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

于 2012-08-28T08:36:38.150 回答
3

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

将此添加到我的本地设置为我解决了它

SESSION_COOKIE_SECURE = 假

于 2019-07-10T16:05:33.227 回答
2

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

尝试以下操作:

  1. 检查您的会话后端是否正常工作。
  2. 如果您使用 db cache backend 检查事务中间件是否出现问题,请将其与缓存后端交换。
  3. 尝试 db backend 并检查 db 表中是否存储了会话
于 2012-08-23T09:34:54.457 回答
2

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

python manage.py createsuperuser

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

于 2012-08-25T08:38:45.793 回答
1

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

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

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

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

于 2012-08-22T17:23:43.600 回答
1

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

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

于 2012-08-23T09:57:52.090 回答
1

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

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

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

于 2012-08-27T11:16:22.533 回答
1

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

is_staff  => True  (if exit).
is_active  => True .
is_superuser => True.
于 2018-09-27T10:12:35.690 回答
1

这不是 OP 的问题,但我发布这个答案是希望有人可能会走上与我相同的道路并因此得出这个问题。

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

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

于 2021-12-19T04:44:39.363 回答
0

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

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

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

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

于 2012-08-22T15:46:58.270 回答
0

我遇到了同样的问题,重启服务器后就解决了:

systemctl restart nginx
于 2016-06-16T08:03:10.190 回答
0

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

于 2016-12-13T12:20:22.643 回答
0

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

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

于 2018-02-09T21:09:41.997 回答
0

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

于 2018-03-09T18:32:05.380 回答
0

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

所以我所做的就是参观http://wildlifeapi.herokuapp.com/admin/api/animal/和宾果游戏!有效。

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

于 2020-01-31T11:01:06.040 回答
0

我的问题是我的管理页面未加载且无法正常工作。这是我所做的:

pip uninstall django
pip install django==2.2

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

于 2020-05-31T06:23:39.620 回答
0

对于在升级 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):
于 2021-09-20T10:59:47.080 回答
0

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

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

于 2022-01-13T11:57:58.460 回答
-1

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

于 2019-12-05T07:56:39.137 回答