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

时间:2012-08-10 02:45:16

标签: python django login admin mod-wsgi

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

这个问题出现在django FAQ,但我已经在那里找到答案,但仍无法通过初始登录界面。

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

我已确认我在admin.py文件中注册了admin,确保在添加INSTALLED_APPS后同步syncdb。 当我输入错误的密码时,我 DO 收到错误,因此我的管理员用户正在通过身份验证,只是没有进入管理页面。

我已经尝试将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登录,两者都会返回登录界面。

还有其他我想念的东西????

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'以解决问题。

20 个答案:

答案 0 :(得分:49)

调试步骤:

  • 确保您的数据库已同步
    • 仔细检查您是否有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#sec
    • SESSION_COOKIE_DOMAIN =无
    • 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 :(得分:9)

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

答案 2 :(得分:3)

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

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

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

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

答案 3 :(得分:2)

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

尝试以下方法:

  1. 检查您的会话后端是否正常工作。
  2. 如果您使用数据库缓存后端来检查事务中间件是否正在乱搞,则将其与缓存后端交换。
  3. 尝试db后端并检查db表中是否存在会话

答案 4 :(得分:2)

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

python django-admin.py createsuperuser

这将允许您重新键入管理员登录名。另见https://docs.djangoproject.com/en/dev/ref/django-admin/

答案 5 :(得分:1)

我不太确定,但问题可能在于您的网址配置,具体在以下两行:

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

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

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

您是否尝试过创建用户:

python manage.py createsuperuser

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

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:1)

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

如果您在localhost http上进行开发,则应将

SESSION_COOKIE_SECURECSRF_COOKIE_SECURE设置为False。将这两个变量更改为False后,我可以在本地开发时登录管理站点。

答案 11 :(得分:0)

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

systemctl restart nginx

答案 12 :(得分:0)

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

pip uninstall django
pip install django==2.2

有关更多详细信息,请检查Django Documentation

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

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

将其添加到我的本地设置中可以为我解决

  

SESSION_COOKIE_SECURE =假

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

答案 18 :(得分: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)

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

答案 19 :(得分:-1)

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