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

79

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

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

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

我已确认admin.py文件中注册了管理员,并在添加INSTALLED_APPS后进行了同步数据库操作。 当我输入错误的密码时,我确实会得到错误,因此我的管理员用户已经通过验证,只是没有进入管理员页面。

我尝试过将SESSION_COOKIE_DOMAIN设置为机器的IP和None。(在chrome中确认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登录,但结果都是返回到登录界面。

我是否还有其他遗漏的东西????

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

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版本:

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

Apache apache2/sites-available/default:

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


1
你尝试过将 django.middleware.csrf.CsrfViewMiddleware 移动到 django.contrib.auth.middleware.AuthenticationMiddleware 之前吗? - Brandon Taylor
1
当您从./manage.py runserver运行它时,它是否有效?(即不是通过mod_wsgi运行)? - supervacuo
1
你是否无法通过身份验证?你可能已经“登录”了,但仍然在查看登录表单。 - John Mee
2
@monkut,你能在方程式中去掉WSGI并尝试一下吗?(请参见上文) - supervacuo
3
你是在本地机器上运行还是在有效的域名上运行?如果是域名,尝试将SESSION_COOKIE_DOMAIN设置为该域名,而不是您计算机的IP地址。如果是在本地机器上运行,请尝试将其设置为回环地址127.0.0.1。 - Thomas
显示剩余12条评论
26个回答

72

调试步骤:

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

如果没有

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

请告诉我这是否有任何有用的调试信息。

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


1
谢谢,我已经检查了会话表格,并且似乎没有创建条目。我进行了双重检查,我的设置与您上面发布的设置相同,但在表格中我看不到任何条目。 - monkut
1
好的,这指引我朝正确的方向。正如猜想的那样,这是我的错误配置。SESSION_ENGINE的值被设置为“django.contrib.sessions.backends.cache”,但是没有正确配置CACHE_BACKEND。我已将SESSION_ENGINE更改为“ django.contrib.sessions.backends.db ”,问题得以解决。 - monkut
21
像 @daigorocub 一样,我只需要将 SESSION_COOKIE_SECURE 设置为 False。显然,当设置为 True 并且连接不是通过 HTTPS 进行的(典型的开发环境),由于没有会话 cookie,登录无法被记录,因此您需要再次登录。看起来应该在设置要求安全 cookie 但连接不安全时出现错误-这表明您的网络安全存在问题-但它确实解决了登录管理员的直接问题。 - Chris Johnson
1
最近遇到了类似的问题,我在同一台服务器上使用不同端口运行多个 Django 项目。在这种情况下,我需要确保每个服务的 SESSION_COOKIE_NAMECSRF_COOKIE_NAME 是不同的。 - monkut
1
AUTHENTICATION_BACKENDS = ['Authentication.backends.EmailBackend']注释掉对我有用。但这是否意味着每次登录Django管理时都必须注释掉它? - Ahtisham
显示剩余8条评论

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

我还漏掉了什么吗?

u.is_active 应该是 True


3
我发现 is_staff 这一项的值竟然是 False - blueFast
@BurhanKhalid,应该是u.is_staff = True,你少了一个等号。 - Ahtisham

14

我遇到了这个问题。问题在于在生产环境中,我设置了两个变量为True,使我能够使用https连接到该网站。

如果您正在本地开发http,请将SESSION_COOKIE_SECURECSRF_COOKIE_SECURE设置为False。将这两个变量更改为False使我能够在本地开发时登录管理员网站。


4

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

将以下内容添加到我的本地设置中解决了这个问题

SESSION_COOKIE_SECURE = False


这对我有用,但是部署清单说在部署时应将其设置为True。如何使面板在此设置为True的情况下工作?https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ - kyczawon

3
我们的应用程序也曾遇到类似的问题,以下建议可能会有所帮助:
  1. 使用cleanup命令清除django_sessions中旧的会话。

  2. 检查Firefox(Firebug)或Chrome开发者工具中cookie的大小。由于消息在admin(django.contrib.messages.middleware.MessageMiddleware)中默认启用,多次编辑和删除可能导致cookie大小超过4096字节。一个快速的测试方法是删除“message”cookie,然后查看是否能够登录。

我们实际上最终切换到nginx/uwsgi路由,因为这个问题和apache的其他内存相关问题。自那以来,在nginx中就没有再次出现这个问题了。

3
我不认为管理员密码存储在settings.py文件中。它是在您第一次同步数据库时创建的。我认为您可能跳过了创建超级用户或只是打错了字。 尝试在项目根目录下运行终端中的命令: python django-admin.py createsuperuser 这将允许您重新输入管理员登录信息。也可以在此处查看:https://docs.djangoproject.com/en/dev/ref/django-admin/

OP可以在shell中进行身份验证,因此这不是问题所在。 - Danica
糟糕,我没有看到那部分。那我就什么都没有了 :( - Reimus Klinsman
这不是 ./manage.py createsuperuser 吗(这对我有效)。 - Andy Swift

3

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

python manage.py createsuperuser

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


谢谢,我确实尝试使用这种方法创建另一个超级用户并尝试登录,但我仍然遇到了同样的问题。 - monkut

2
听起来像是一个会话问题,因为在提交后您被重定向并且系统立即忘记了您的登录状态。
请尝试以下操作:
1. 检查您的会话后端是否正常工作。 2. 如果您使用数据库缓存后端,请将其替换为缓存后端以检查事务中间件是否有问题。 3. 尝试使用数据库后端,并检查数据库表中是否存储了会话。

2
这不是提问者的问题,但我发表此答案希望有人也曾经走过同样的路并因此到达了这个问题。
一年后我回到一个旧的代码库,尽管所有通常的检查都通过了(用户存在,数据库中没有错误等等),但我被拒绝访问管理员面板。不幸的是,我忘记了管理员登录页面不在通常的/admin路径下,而是在另一个路径下。/admin页面是一个虚假的登录页面,总是导致登录失败。
这个设置是使用应用程序django-admin-honeypot创建的。

1
请确保您的数据库用户表中具有以下条目:
is_staff  => True  (if exit).
is_active  => True .
is_superuser => True.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接