如何解决为什么Django无法在Varnish代理后面生成CSRF或会话Cookie?
| 在具有Apache2的Linux服务器上运行Django 1.2.5,由于某种原因,Django似乎无法存储CSRF或会话cookie。因此,当我尝试登录Django管理员时,提交登录表单后会给我CSRF验证错误。有谁遇到这个问题并找到解决方案? 当我在主机提供的VPS的网址上尝试此帖子时,我可以发表一个有效的帖子。例如:vps123.hostdomain.com/admin/,并为该域设置了cookie。但是,当我访问www.sitedomain.com/admin/并尝试登录时,出现CSRF 403错误,提示cookie不存在,并且当我在浏览器中签入cookie时,未设置它们。 我尝试在设置文件中设置以下内容:SESSION_COOKIE_DOMAIN = \'www.sitedomain.com\'
CSRF_COOKIE_DOMAIN = \'www.sitedomain.com\'
还尝试了:
SESSION_COOKIE_DOMAIN = \'vps123.hostdomain.com\'
CSRF_COOKIE_DOMAIN = \'vps123.hostdomain.com\'
我在settings.py的MIDDLEWARE_CLASSES中添加了\'django.middleware.csrf.CsrfViewMiddleware \',并且表单中包含CSRF令牌,该令牌显示在POST中。
我启用了Cookie。我已经在多个浏览器和机器上尝试过此操作。
www.sitedomain.com前面有一个清漆代理服务器,我认为这可能是问题的一部分。任何有使用代理服务器和Django经验的人都可以对此有所了解。
我的apache2配置:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.sitedomain.com
ServerAlias www.sitedomain.com
<Location \"/\">
Options FollowSymLinks
SetHandler python-program
PythonInterpreter nzsite
PythonHandler django.core.handlers.modpython
PythonDebug On
PythonPath \"[\'/var/www/django_projects\',\'/var/www\',\'/usr/lib/python2.6/dist-packages\'] + sys.path\"
SetEnv DJANGO_SETTINGS_MODULE project_one.settings
</Location>
<location \"/phpmyadmin\">
SetHandler None
</location>
</VirtualHost>
<VirtualHost *:80>
ServerName othersite.sitedomain.com
ServerAlias othersite.sitedomain.com
<Location \"/\">
Options FollowSymLinks
SetHandler python-program
PythonInterpreter ausite
PythonHandler django.core.handlers.modpython
PythonDebug On
PythonPath \"[\'/var/www/django_projects\',\'/usr/lib/python2.6/dist-packages\'] + sys.path\"
SetEnv DJANGO_SETTINGS_MODULE project_two.settings
</Location>
<location \"/phpmyadmin\">
SetHandler None
</location>
</VirtualHost>
解决方法
问题是我的站点前面有一个Varnish代理服务器。 Varnish正在接受请求并从中剥离Cookie。要解决此问题,我必须让管理Varnish Server的公司将\'/ admin \'添加到例外列表中,以便可以传递cookie。抱歉,我无法进一步了解清漆工艺的工作原理。
,您是否在表单模板中包含“ 3”?
<form autocomplete=\"off\" method=\"post\" action=\"{% url auth_login %}\">{% csrf_token %}
{{form|as_p}}
<input type=\'submit\' />
</form>
包括中间件吗?
\'django.middleware.csrf.CsrfViewMiddleware\',
从您的编辑中推测,这可能与Apache中的VirtualHost配置有关(如果您的提供程序正在使用apache)。这是我其中一个apache配置的编辑版本。
<VirtualHost *:80>
ServerName www.domain.com
WSGIProcessGroup my-django-site
WSGIScriptAlias / /path-to-my-django-site/wsgi/production.wsgi
Alias /media /path-to-my-django-site/media
</VirtualHost>
可能是因为apache中的服务器名称必须与您在框中单击的域名以及Django配置中的* _COOKIE_DOMAIN设置匹配。我不确定您是否可以更改此设置。如果没有其他答案可以胜出,则可能值得与您的提供者交谈。
,您要使用csrf信息更新模板数据吗?
from django.core.context_processors import csrf
def index(request)
data = {\"listitems\": items}
data.updates(csrf(request))
return render_to_response(\'template.html\',data)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。