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
どんな助けでも大歓迎です。