7

Apache2を搭載したLinuxサーバーでDjango1.2.5を実行していると、何らかの理由でDjangoはCSRFまたはセッションCookieを保存できないようです。したがって、Django管理者にログインしようとすると、ログインフォームの送信時にCSRF検証エラーが発生します。誰かがこれに立ち向かい、解決策を見つけましたか?

ホストから提供されたVPSのURLでこれを試すと、有効な投稿を行うことができます。例:vps123.hostdomain.com/admin/およびそのドメインに対してCookieが設定されます。ただし、www.sitedomain.com / admin /にアクセスしてログインしようとすると、Cookieが存在しないというCSRF 403エラーが発生し、ブラウザで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'

「django.middleware.csrf.CsrfViewMiddleware」をsettings.pyのMIDDLEWARE_CLASSESに追加しました。フォームに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

問題は、サイトの前にVarnishProxyサーバーがあることでした。ワニスはリクエストを受け取り、それらからクッキーを取り除きました。これを修正するには、Varnish Serverを管理している会社に、例外のリストに「/ admin」を追加して、Cookieを渡すことができるようにする必要がありました。申し訳ありませんが、ワニスプロセスがどのように機能するかについてこれ以上の光を当てることはできません。

于 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構成の1つの編集バージョンです。

<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 に答える