无法使用有效的用户名和密码登录 django 管理页面
Posted
技术标签:
【中文标题】无法使用有效的用户名和密码登录 django 管理页面【英文标题】:Unable log in to the django admin page with a valid username and password 【发布时间】:2012-08-07 08:21:49 【问题描述】:我无法登录 django 管理页面。当我输入有效的用户名和密码时,它只是再次打开登录页面,没有错误消息
这个问题在django FAQ 中,但我已经查看了那里的答案,但仍然无法通过初始登录屏幕。
我在 ubuntu 12.04 上使用 django 1.4 和 apache2 和 modwsgi。
我已经确认我在admin.py
文件中注册了管理员,请确保在添加INSTALLED_APPS
后同步db。
当我输入错误的密码时,我确实收到错误,因此我的管理员用户正在通过身份验证,只是没有进入管理页面。
我已经尝试将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'
,从而解决了问题。
【问题讨论】:
你有没有试过在django.contrib.auth.middleware.AuthenticationMiddleware
之前移动django.middleware.csrf.CsrfViewMiddleware
?
从./manage.py runserver
运行它时它是否工作(即不超过mod_wsgi
)?
您真的没有通过身份验证吗?您可能已“登录”但仍在查看登录表单。
@monkut 你能在等式中不使用 WSGI 的情况下试试吗(见上文)?
您是在本地计算机上运行它还是作为有效域运行?如果它是域,请尝试将 SESSION_COOKIE_DOMAIN 设置设置为该设置,而不是您计算机的 IP 地址。如果它在本地机器上,请尝试将其设置为 127.0.0.1 的环回地址。
【参考方案1】:
调试步骤:
确保您的数据库已同步 仔细检查您是否有 django_session 表 尝试验证 您是否看到在django_session
表中创建了一条记录?
如果不是
移除非标准设置 AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',) SESSION_EXPIRE_AT_BROWSER_CLOSE = 真 SESSION_SAVE_EVERY_REQUEST = 真 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
【讨论】:
谢谢,我检查了会话表,似乎没有创建了一个条目。我仔细检查了,我的设置与您在上面发布的相同,但我在表格中没有看到任何条目。 好的,这为我指明了正确的方向。怀疑这是我的错误配置。 SESSION_ENGINE 值设置为 'django.contrib.sessions.backends.cache' 没有正确配置 CACHE_BACKEND。我已将 SESSION_ENGINE 更改为 'django.contrib.sessions.backends.db' 解决了这个问题。 就像@daigorocub,我只需要SESSION_COOKIE_SECURE = False
。显然,当它设置为 True 并且连接不是通过 HTTPS(通常用于开发设置)时,由于没有会话 cookie,因此无法记录登录,因此会指示您再次登录。当设置需要安全 cookie 并且连接不安全时,似乎应该有一个错误——这是一个很大的危险信号,表明你的网络安全被搞砸了——但它确实解决了登录管理员的直接问题。
在我的例子中,我使用 RemoteUserBackend 进行身份验证,但我忘记配置 nginx 以在不工作的机器上设置 REMOTE_USER。
注释掉这个AUTHENTICATION_BACKENDS = ['Authentication.backends.EmailBackend']
对我有用。但这是否意味着每当我必须登录 django admin 时我都必须将其注释掉?【参考方案2】:
>>> 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
【讨论】:
对我来说is_staff
奇怪的是 False
@BurhanKhalid 它的u.is_staff = True
你缺少等号【参考方案3】:
我遇到了这个问题。问题是在生产中我将两个变量设置为True
,这允许我使用 https 连接到站点。
SESSION_COOKIE_SECURE
和 CSRF_COOKIE_SECURE
应该设置为 False
如果你在 localhost http 上开发。将这两个变量更改为False
允许我在本地开发时登录管理站点。
【讨论】:
【参考方案4】:我不相信管理员密码存储在 settings.py 文件中。它是在您第一次 syncdb 时创建的。我认为您要么跳过创建超级用户,要么只是打错字。 尝试在项目根目录下的终端中运行。:
python django-admin.py 创建超级用户
这将允许您重新输入您的管理员登录信息。也可以在这里看到https://docs.djangoproject.com/en/dev/ref/django-admin/
【讨论】:
OP 可以在 shell 中进行身份验证,所以不是这样。 哎呀。我没有看到那部分。那我什么都没有了:( 不是 ./manage.py createsuperuser (这对我有用)【参考方案5】:我们在我们的应用中遇到了类似的问题,这些可能会有所帮助:
使用 cleanup 命令从 django_sessions 中清除旧会话
在 firefox(firebug) 或 chrome 开发者工具中检查 cookie 大小。因为在 admin(django.contrib.messages.middleware.MessageMiddleware) 中默认启用消息传递,所以 cookie 大小有时会在多次编辑和删除时大于 4096 字节。一个快速测试是删除“消息”cookie,然后查看您是否可以登录。
实际上我们最终切换到了 nginx/uwsgi 路由,因为这个和其他与 apache 相关的内存问题。从那以后就再也没有在 nginx 中看到过这种情况了。
【讨论】:
【参考方案6】:在自己无法登录后,我在上面的评论中看到有人提到删除非标准设置。
将此添加到我的本地设置为我解决了它
SESSION_COOKIE_SECURE = 假
【讨论】:
这对我有用,但是部署清单说这应该设置为 True 进行部署。如何让面板在设置为 True 的情况下工作? docs.djangoproject.com/en/3.0/howto/deployment/checklist【参考方案7】:听起来像是会话问题,因为在发布后您被重定向并且系统立即忘记了您已登录。
尝试以下方法:
-
检查您的会话后端是否正常工作。
如果您使用 db 缓存后端检查事务中间件是否出现问题,请将其与缓存后端交换。
尝试 db 后端并检查 db 表中是否存储了会话
【讨论】:
【参考方案8】:我不太确定,但问题可能出在您的 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/
访问此应用程序的管理面板。可能是您的带有 r'^sites/'
的 URL 配置覆盖了管理员 URL 的一部分。尝试重命名此特定 URL 配置或禁用 INSTALLED_APPS
中的 django.contrib.sites
以进行测试。
请注意,这只是一个假设。我所知道的是,Django 的管理面板对使用类似名称的 URL 配置有点挑剔,比如它自己的 URL。我目前无法自己测试。但也许这对你有点帮助。
【讨论】:
【参考方案9】:您是否尝试通过以下方式创建用户:
python manage.py createsuperuser
当我在测试机器上创建数据库并将其迁移到部署服务器时,我遇到了同样的问题...
【讨论】:
谢谢,我确实尝试使用此方法创建 另一个 超级用户并尝试登录,但我仍然遇到同样的问题。【参考方案10】:检查您是否至少有一个site
可以使用。
>>> from django.contrib.sites.models import Site
>>> Site.objects.count()
(0.048) SELECT COUNT(*) FROM `django_site`; args=()
1
如果您在此处看到 0,请创建一个。
【讨论】:
谢谢,当没有创建站点时显示错误,所以我创建了一个。 @monkut 那么,现在一切都好吗? 不,我在遇到这里提到的问题之前解决了这个问题。【参考方案11】:查看有关此主题的其他一些文章,它可能与 sys.path 有关。你能在运行开发服务器和运行WSGI时检查和比较sys.path吗?
有关详细信息,请查看 this 和 article。但我会先检查 sys.path,然后再进入本文的详细信息。
【讨论】:
【参考方案12】:确保您的数据库用户表具有以下条目为真:
is_staff => True (if exit).
is_active => True .
is_superuser => True.
【讨论】:
【参考方案13】:这不是 OP 的问题,但我发布此答案是希望有人可能会走上与我相同的道路并因此得出这个问题。
一年后我回到了一个旧代码库,尽管所有常规检查都通过了(用户在场、数据库中没有任何错误、所有调试模式都打开等),但我仍被拒绝访问管理面板。不幸的是,我忘记了管理员登录页面不在通常的/admin
路线上,而是在备用路线上。 /admin
页面是一个虚假的登录页面,总是导致登录失败。
此设置是使用应用程序 django-admin-honeypot
创建的。
【讨论】:
【参考方案14】:免责声明:我还不能添加 cmets,所以我必须在这里要求澄清,同时提出解决方案。很抱歉。
用户登录后是否立即退出?类似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)
然后尝试登录并检查消息是否出现在您的控制台中。如果出现,那么您必须检查是否有重定向或自定义模板调用登录后注销。希望它可以帮助您找到问题。
【讨论】:
【参考方案15】:我遇到了同样的问题,重启服务器后就解决了:
systemctl restart nginx
【讨论】:
【参考方案16】:您可以确保,创建的用户已被标记为 Is_staff = True,我有时会忘记标记这个以允许用户登录到 django admin
【讨论】:
【参考方案17】:我遇到了一个相关问题,我尝试登录时页面会在套接字最终被终止之前挂起。事实证明我确实在登录,但其中一个登录信号处理器冻结了。
Celery 无法将其异步任务传递给 RabbitMQ,因为 RabbitMQ 服务器无法启动。
【讨论】:
【参考方案18】:对我来说,我无法在 Firefox 中登录管理页面,但可以在 chrome 中登录。 问题是我在 settings.py 中设置了 CSRF_COOKIE_PATH。 永远不要使用它。它在 django 1.8 上无法正常工作。
【讨论】:
【参考方案19】:我所做的是手动导航到我想访问的网址。
就像:http://wildlifeapi.herokuapp.com/admin/
正在返回可怕的 Heroku 应用程序错误。
所以我所做的就是访问http://wildlifeapi.herokuapp.com/admin/api/animal/
和BINGO!成功了。
有趣的是,它在我的手机上运行良好。这可能是一个 django 重定向错误。
【讨论】:
【参考方案20】:我的问题是我的管理页面未加载且无法正常工作。这是我所做的:
pip uninstall django
pip install django==2.2
更多详情请查看Django Documentation。
【讨论】:
【参考方案21】:对于在升级 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):
【讨论】:
【参考方案22】:聚会有点晚了,但对我来说,它是不同的,而且非常简单:无论出于何种原因,我的超级用户帐户消失了,所以很明显,解决方案是我不得不重新创建它。
在创建超级用户后,我 99% 确定我已经执行了几次 migrate
和 makemigrations
,但是想想看……
然而,我花了整整一个小时才最终弄清楚。这里讨论的变量都不存在于我的 settings.py 中 - 直到现在仍然不存在 - (可能因为已经快 10 年了,所以情况可能发生了很大变化),比如SESSION_ENGINE
、SESSION_COOKIE_DOMAIN
、 CACHE_BACKEND
, django_session
表...
此外,Django 的关于这个主题的常见问题解答提到检查我的帐户是否is_active
和is_staff
,但不幸的是没有提到如何去做。
【讨论】:
【参考方案23】:使用其他一些虚拟环境。当我使用 conda 环境时,它对我有用。
【讨论】:
如果问题是从这里出发最简单的路线是什么?,这可能是一个答案。对于 django 管理页面登录问题,我发现它没有用。以上是关于无法使用有效的用户名和密码登录 django 管理页面的主要内容,如果未能解决你的问题,请参考以下文章
我无法使用有效的用户名和密码登录 Django 管理页面,它返回 % csrf_token % 禁止的 404 错误消息