为什么Django不在Varnish代理后面生成CSRF或会话cookie?

2024-10-03 04:28:52 发布

您现在位置:Python中文网/ 问答频道 /正文

在带有Apache2的Linux服务器上运行Django 1.2.5,由于某些原因,Django似乎无法存储CSRF或会话cookie。因此,当我试图登录到Django管理员时,它在提交登录表单时会给我一个CSRF验证错误。有人反对这个问题并找到解决办法吗?在

当我在主机提供的VPS的url上尝试此操作时,我能够发出有效的帖子。示例:vps123。hostdomain.com/admin/对于这个域,cookies确实设置好了。但是,当我去www.sitedomain.com/admin/尝试登录时,我收到一个csrf403错误,说cookie不存在,当我检查浏览器cookie时,它们没有设置。在

我已尝试在设置文件中设置以下内容:

SESSION_COOKIE_DOMAIN = 'www.sitedomain.com'
CSRF_COOKIE_DOMAIN = 'www.sitedomain.com'

也尝试过:

^{pr2}$

我有django.middleware.csrf.CsrfViewMiddleware'添加到我的中间件类中设置.py表格中有一个CSRF代币,它会出现在帖子中。在

我启用了cookies。我已经在多个浏览器和机器上尝试过了。在

前面有一个varnish代理服务器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', '/var/www', '/usr/lib/python2.6/dist-packages'] + sys.path"
        SetEnv DJANGO_SETTINGS_MODULE project_two.settings
    </Location>
    <location "/phpmyadmin">
        SetHandler None
    </location>
</VirtualHost>

Tags: djangocomadmincookievarwww错误location
3条回答

你用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)

问题是我的站点前面有一个Varnish代理服务器。Varnish正在接受请求并从他们身上剥下饼干。为了解决这个问题,我不得不让管理Varnish服务器的公司将'/admin'添加到异常列表中,这样cookies就可以被传递了。抱歉,我不能解释一下清漆工艺是如何工作的。在

您是否在表单模板中包含{{csrf_token}}?在

<form autocomplete="off" method="post" action="{% url auth_login %}">{% csrf_token %}
    {{form|as_p}}
    <input type='submit' />
</form>

包括中间件?在

^{pr2}$

从您的编辑来看,这可能与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配置中的*\u COOKIE_域设置。我不确定你是否能改变这一切。如果没有其他的答案能让你胜出的话,也许值得和你的供应商谈谈。在

相关问题 更多 >