1

POSTサードパーティのサーバーからの を期待しています。@csrf_exemptサードパーティ サーバーからの投稿を許可するには、デコレータを使用する必要があることを理解しています。Ubuntu 12.04 で Django 1.4 と Python 2.7 を使用しています。

ここで、私のビューは、ユーザーが入力するフィールドと、元のPOST. したがって、最初POSTの は 2 番目のPOST.

2 つ目POSTは、サーバーからサーバー上の別のビューに送信されます。CSRFフォームのトークンを生成する方法を見つけようとしています。

ドキュメントで読んだことを正確に実行しようとしています。

views.py からの私のコード:

from django.core.context_processors import csrf
from django.shortcuts import render_to_response
from gateway_interface.post_handling import PostHandling

@csrf_exempt
def requestNewPaymentInfo(request):

    c = {}
    c.update(csrf(request))

    # Gather information posted
    if (request.method == "POST"):
        # Create the initialization dictionary based on POST values
        postHandling = PostHandling()
        post_dict = postHandling.createDictionary(request)

        # Create the form
        form = addPaymentForm(initial = post_dict)

        return render_to_response('requestNewPaymentInfo.html', { 'form' : form }, c)

テンプレート側は今何をしているの?!? 繰り返しますが、ドキュメントから、次のことを行う必要があると思いました。

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

POSTサードパーティのサーバーから実行して、これをテストします。CSRF有効なトークンのように見えるものが完全に生成されたフォームが表示されることがあります。

時々、次のような失敗が見られます。

Django Version: 1.4
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'gateway_interface')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py" in wrapped_view
  77.         return view_func(*args, **kwargs)
File "/home/tokeniz/tokeniz/gateway_interface/views.py" in requestNewPaymentInfo
  64.         return render_to_response('requestNewPaymentInfo.html', { 'form' : form }, c)
File "/usr/local/lib/python2.7/dist-packages/django/shortcuts/__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/template/loader.py" in render_to_string
  178.         context_instance.pop()

Exception Type: TypeError at /requestNewPaymentInfo/
Exception Value: pop expected at least 1 arguments, got 0

その後、最終的にこのエラーが発生します。

Forbidden (403)
CSRF verification failed. Request aborted.

エラーを受け取ったらCSRF verification failed、Cookie をクリアして最初からやり直すまで、このエラーが発生し続けます。

誰が私が間違っているのか教えてもらえますか? CSRFトークンの生成方法に関係があることがわかります。ドキュメントの内容に基づいてプロセスがどのように機能するかわかりません。c私の見解では何ですか?情報を入力して に渡す空の辞書render_to_response。わかりましたが、それはテンプレートでどのように使用されていますか?

私のテンプレートには次のようなものがあります:

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

そうでない場合、なぜですか?Django は、これにトークンcが含まれていることをどのように認識しますか?CSRF

どんな助けでも大歓迎です。

4

1 に答える 1

4

あなたの問題を解決するために、私はいくつかのことを明らかにすることができます。

一言で言えば、Djangoのテンプレートシステムは、コンテキストテンプレートの2つのデータで機能します。

のように、テンプレートファイルに表示する変数を配置すると{{ foo }}、djangoは、ステロイドの対応するコンテキストインスタンスdictの内部を調べて、その変数の値を見つけます。

ここでrender_to_response、2番目のパラメーターとして渡すものadictは、基本的にテンプレートのコンテキストに配置するデータであるため、使用できるようになります。3番目のパラメーターはContextインスタンスであり、データ自体ではありません。カスタマイズする必要がある場合に役立ちます。

さて、あなたの例を見てみましょう、

return render_to_response('requestNewPaymentInfo.html', { 'form' : form }, c)

ここでは、ドキュメントの例を読み間違えました。コンテキストデータではなくc、コンテキストインスタンスとして配置したため、トークンはテンプレートに到達しませんでした。また、djangoがコンテキストオブジェクトを期待していた場合にのみ、これらの奇妙なエラーが発生しました。口述を受けた。

したがって、修正するには、テンプレートデータ内にcsrfトークンを渡す必要があります。

c.update({'form': form})
return render_to_response('requestNewPaymentInfo.html', c)

そしてテンプレートの内部:

{% csrf_token %}

プログラマー向けのテンプレートシステムの説明を読むことをお勧めします。非常によく書かれています。

于 2012-07-14T00:16:24.783 に答える