1

Djangoサーバー側で動作するGWTWebアプリがあります。最近Djangoを1.2にアップグレードしましたが、GWTアプリからHTTP投稿を機能させることができません。このエラーが発生します:

CSRF検証に失敗しました。リクエストは中止されました。

失敗の理由:

CSRF token missing or incorrect.

ログインなどの投稿アプリで機能するcsrfミドルウェア('django.middleware.csrf.CsrfViewMiddleware'、'django.middleware.csrf.CsrfResponseMiddleware')を有効にしましたが、作成された投稿にトークンが追加されていないようですGWTを介して。何か案は?前もって感謝します。

4

1 に答える 1

0

テンプレートを確認するauth.loginと、CSRFトークンが<form>タグ内に明示的に含まれていることがわかります。

<form method="post" action=".">
    {% csrf_token %}

リクエストに応じてページがレンダリングされると、これは非表示フィールドに展開されますGET。何かのようなもの:

<form method="post" action=".">
    <div style='display:none'>
        <input type='hidden' name='csrfmiddlewaretoken' 
             value='90064bf0e86edacfdb60595e3e2b8f23' />
    </div>

次に、このトークンはビューに戻されPOST、検証されます。

したがってPOST、CSRFで保護されたビューにアクセスする前に、まずそのビューからトークンを取得する必要があります。

POSTビューにリクエストを送信する前に、CSRFトークンが手元にあることを確認/確認できますか?csrf_exemptまたは、デコレータを使用してビューのCSRF保護を無効にすることもできます。ただし、これは良い考えではないかもしれません。

アップデート

これが私の質問のポイントです。フロントエンドにdjangoテンプレートを使用していないため、フォームにトークンをタグ付けできません。フロントエンドにGWTを使用しており、投稿のフォームをレンダリングしています。

GETページをレンダリングする前に、すでにDjangoビューにリクエストを送信していますか?その場合、応答の内容を解析することでCSRFトークンを取得できます。

そうでない場合はGET、ビューに対して明示的にリクエストを行い(サポートされていると想定GET)、CSRFトークンの応答を解析する必要があります。例については、この質問を参照してください。

于 2010-09-20T06:32:23.007 に答える