![](/img/trans.png)
[英]I cannot log into the Django admin page with valid username and password, it returns {% csrf_token %} forbidden 404 error message
[英]Unable log in to the django admin page with a valid username and password
我无法登录 django 管理页面。 当我输入有效的用户名和密码时,它只是再次打开登录页面,没有任何错误消息
这个问题在django FAQ中,但我已经查看了那里的答案,但仍然无法通过初始登录屏幕。
我在 ubuntu 12.04 上使用 django 1.4 和 apache2 和 modwsgi。
我已经确认我正在admin.py
文件中注册管理员,确保在添加INSTALLED_APPS
后同步数据库。 当我输入错误的密码时,我确实得到了一个错误,所以我的管理员用户正在通过身份验证,只是没有进入管理页面。
我试过将SESSION_COOKIE_DOMAIN
设置为机器的 IP 和 None。 (确认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 版本:
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
。
我已将 SESSION_ENGINE 更改为'django.contrib.sessions.backends.db'
,从而解决了该问题。
调试步骤:
django_session
表中创建了一条记录?如果不
django_session
表django_session
表中创建了一条记录?如果这会产生任何有用的调试,请告诉我。
示例设置文件: https : //github.com/fyaconiello/Django-Blank-Bare-Bones-CMS/blob/master/dbbbcms/settings.py
>>> 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
我有这个问题。 问题是在生产中我将两个变量设置为True
允许我使用 https 连接到站点。
如果您在 localhost http 上进行开发,则SESSION_COOKIE_SECURE
和CSRF_COOKIE_SECURE
应设置为False
。 将这两个变量更改为False
允许我在本地开发时登录管理站点。
我不相信管理员密码存储在 settings.py 文件中。 它是在您第一次同步数据库时创建的。 我认为您要么跳过了创建超级用户的步骤,要么只是打错了字。 尝试在项目根目录的终端中运行。:
python django-admin.py 创建超级用户
这将允许您重新输入管理员登录信息。 也可以在这里看到https://docs.djangoproject.com/en/dev/ref/django-admin/
我们的应用程序中遇到了类似的问题,这些可能会有所帮助:
使用清理命令从 django_sessions 中清除旧会话
在 firefox(firebug) 或 chrome 开发者工具中检查 cookie 大小。 因为在 admin(django.contrib.messages.middleware.MessageMiddleware) 中默认启用消息传递,cookie 大小有时会因多次编辑和删除而大于 4096 字节。 一种快速测试是删除“消息”cookie,然后查看是否可以登录。
我们实际上最终切换到 nginx/uwsgi 路由,因为这个和其他与 apache 内存相关的问题。 从那以后就再也没有在 nginx 中看到过这种情况。
在自己无法登录后,我在上面的评论中看到有人提到删除非标准设置。
将此添加到我的本地设置中为我解决了这个问题
SESSION_COOKIE_SECURE = 假
听起来像是会话问题,因为在发布后您被重定向,系统立即忘记了您登录。
尝试以下操作:
我不太确定,但问题可能出在您的 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 配置有点挑剔。 我目前无法自己测试。 但也许这对你有所帮助。
您是否尝试通过以下方式创建用户:
python manage.py createsuperuser
当我在测试机器上创建数据库并将其迁移到部署服务器时,我遇到了同样的问题...
检查您是否至少有一个site
可以使用。
>>> from django.contrib.sites.models import Site
>>> Site.objects.count()
(0.048) SELECT COUNT(*) FROM `django_site`; args=()
1
如果您在这里看到 0 - 创建一个。
确保具有以下条目的数据库用户表为真:
is_staff => True (if exit).
is_active => True .
is_superuser => True.
免责声明:我还不能添加评论,所以我必须在这里要求澄清同时提出解决方案。 对不起。
用户登录后是否立即退出? 类似这个问题
可以通过多种方式检查,我建议在注销信号中添加一个钩子(可以放在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)
然后尝试登录并检查该消息是否出现在您的控制台中。 如果出现,那么您必须检查是否有重定向或自定义模板在登录后调用注销。 希望它可以帮助您找到问题。
我有同样的问题,重启服务器后才解决:
systemctl restart nginx
您可以确保,创建的用户已被标记为 Is_staff = True,我有时忘记标记它以允许用户登录到 django admin
我有一个相关的问题,我尝试登录并且页面会在套接字最终被杀死之前挂起。 结果证明我确实在登录,但其中一个登录信号处理器冻结了。
Celery 无法将其异步任务传递给 RabbitMQ,因为 RabbitMQ 服务器无法启动。
对我来说,我无法在 Firefox 中登录管理页面,但可以在 chrome 中登录。 问题是我在 settings.py 中设置了 CSRF_COOKIE_PATH。 永远不要使用那个。 它在 django 1.8 上不能正常工作。
我所做的是手动导航到我想访问的网址。 就像: http://wildlifeapi.herokuapp.com/admin/
://wildlifeapi.herokuapp.com/admin/ 返回了可怕的 Heroku 应用程序错误。
所以我所做的是访问http://wildlifeapi.herokuapp.com/admin/api/animal/
和 BINGO! 有效。
有趣的是它在我的手机上运行良好。 这可能是一个 Django 重定向错误。
对于升级 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):
这不是 OP 的问题,但我发布这个答案是希望有人可能和我一样走上同样的道路,并最终解决了这个问题。
一年后我又回到了旧的代码库,尽管通过了所有常规检查(用户存在,数据库中看起来没有任何错误,所有调试模式都已开启等),但仍被拒绝访问管理面板。 不幸的是,我忘记了管理员登录页面不是在通常的/admin
路径上,而是在备用路径上。 /admin
页面是一个虚假的登录页面,它总是导致登录失败。
此设置是使用应用程序django-admin-honeypot
。
聚会有点晚了,但对我来说,这是不同的,而且非常简单:无论出于什么原因,我的超级用户帐户都不见了,所以很明显,解决方案是我不得不重新创建它。
我有 99% 的把握在创建超级用户后执行了migrate
和makemigrations
几次,但是想想看……
然而,我花了大约一个小时才最终弄清楚。 这里讨论的变量都不存在于我的 settings.py 中 - 到现在仍然不存在 - (可能因为已经将近 10 年了,所以事情可能发生了很大变化),比如SESSION_ENGINE
、 SESSION_COOKIE_DOMAIN
、 CACHE_BACKEND
、 django_session
表...
此外,Django 关于这个主题的常见问题解答提到检查我的帐户是否is_active
和is_staff
,但不幸的是没有提到如何去做。
就我而言,它始终是SESSION_COOKIE_DOMAIN的问题:在本地计算机上,我将其设置为:
SESSION_COOKIE_DOMAIN = 'localhost'
在远程一域一上,例如:
SESSION_COOKIE_DOMAIN = 'yourdomainname.com'
在我的例子中,我无法登录,因为我使用email代替用户名(在我的例子中是“admin” )尝试登录。所以一定要确保你使用正确的用户名和密码登录
对我来说,以下设置适用于本地主机
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
]
SESSION_COOKIE_DOMAIN = None
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
使用其他一些虚拟环境。当我使用 conda 环境时,它对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.