我期待POST
来自第 3 方服务器。我知道我需要使用@csrf_exempt
装饰器来允许来自第 3 方服务器的帖子。我在 Ubuntu 12.04 上使用 Django 1.4 和 Python 2.7。
现在,我的视图将生成一个未绑定的表单,该表单将包含供用户填充的字段以及包含原始信息的隐藏字段POST
。因此,第一个POST
将启动第二个POST
。
第二个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
从 3rd 方服务器进行测试来测试这一点。有时我会看到完全生成的表单似乎是一个有效的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
令牌?
任何帮助将不胜感激。