首页 文章

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

提问于
浏览
37

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

这个问题在django FAQ中,但我已经过了初始登录界面 .

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

我've confirmed that I'在 admin.py 文件中注册管理员,确保在添加 INSTALLED_APPS 后syncdb . 当我输入错误的密码时,我会收到错误,因此我的管理员用户正在通过身份验证,只是没有进入管理页面 .

我已经尝试将 SESSION_COOKIE_DOMAIN 设置为机器's IP and None. (Confirmed that the cookie domain shows as the machine'的IP in chrome

另外,检查用户是否通过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>

UPDATE

通过 runserver 使用开发服务器时,管理页面会继续进行,因此它看起来像是一个wsgi / apache问题 . 还没有想出来 .

SOLUTION

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

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

16 回答

  • 0

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

  • 9

    我有一个相关的问题,我试图登录,页面将在套接字最终被杀死之前挂起 . 事实证明我确实登录了,但其中一个登录信号处理器正在冻结 .

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

  • 3

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

  • 46

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

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

    调试步骤:

    • 确保同步数据库

    • 仔细检查你有一个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 =无

    • 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

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

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

    u.is_active 应为 True

  • 2

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

    • 使用cleanup命令从django_sessions清除旧会话

    • 检查firefox(firebug)或chrome开发人员工具中的cookie大小 . 由于默认情况下在admin(django.contrib.messages.middleware.MessageMiddleware)中启用了消息传递,因此cookie大小有时会大于4096字节,并且会进行多次编辑和删除 . 一个快速测试是删除“消息”cookie,看看之后是否可以登录 .

    我们实际上最终切换到nginx / uwsgi路由因为这和其他与apache有关的内存问题 . 从那以后没有在nginx中重复过这种情况 .

  • 2

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

    python django-admin.py createsuperuser

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

  • 0

    听起来像一个会话问题,因为在帖子后你被重定向,并立即系统忘记你已登录 .

    尝试以下方法:

    • 检查您的会话后端是否正常工作 .
      如果使用数据库缓存后端来检查事务中间件是否正在混乱,

    • 将其与缓存后端交换 .

    • 尝试db后端并检查db表中是否存在会话

  • 1

    我不完全确定,但问题可能在于您的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/ 来访问此应用的管理面板 . 可能是您的URL配置中包含 r'^sites/' 会覆盖管理网址的一部分 . 尝试重命名此特定URL配置或在 INSTALLED_APPS 中禁用 django.contrib.sites 以进行测试 .

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

  • 0

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

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

    如果你在这里看到0 - 创建一个 .

  • 0

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

    有关详细信息,请查看thisarticle . 但在进入本文的详细信息之前,我会首先检查sys.path .

  • 0

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

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

  • 0

    免责声明:我还无法添加评论,因此我必须在此提出澄清,同时提出解决方案 . 对不起 .

    登录后用户是否立即注销?像this issue

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

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

  • 1

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

    python manage.py createsuperuser
    

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

  • 1

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

    systemctl restart nginx
    

相关问题