7

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

当我在我的主机提供的 VPS 的 url 上尝试此操作时,我能够发布有效的帖子。示例: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', '/var/www', '/usr/lib/python2.6/dist-packages'] + sys.path"
        SetEnv DJANGO_SETTINGS_MODULE project_two.settings
    </Location>
    <location "/phpmyadmin">
        SetHandler None
    </location>
</VirtualHost>
4

3 回答 3

3

问题是我的站点前面有一个 Varnish 代理服务器。Varnish 正在接受请求并从他们那里删除 cookie。为了解决这个问题,我必须让管理 Varnish 服务器的公司将“/admin”添加到异常列表中,以便可以传递 cookie。抱歉,我无法更深入地了解 Varnish 流程的工作原理。

于 2011-05-23T22:49:34.707 回答
2

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

<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 设置。我不确定你是否能够改变这一点。如果没有其他答案可以取胜,可能值得与您的提供商交谈。

于 2011-05-19T22:40:32.930 回答
0

您是否使用 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)
于 2011-05-20T19:37:11.977 回答