如何从请求中获取POST数据?

9

我刚刚搭建了一个带有Django的Apache服务器,并为了测试它,在views.py中编写了一个非常简单的函数。

channel = rabbit_connection()
@csrf_protect
@csrf_exempt
def index(request): 
    data={'text': 'Food truck is awesome! ', 'email': 'bob@yahoo.com', 'name': 'Bob'}
    callback(json.dumps(data))   
    context = RequestContext(request)    
    return render_to_response('index.html', context_instance=context)

如果我向服务器发送GETPOST请求,这个函数可以正常工作。但是我想从POST请求中获取这些数据。假设我像这样发送请求:

import pycurl
import simplejson as json

data = json.dumps({'name':'Bob', 'email':'bob@yahoo.com', 'text': u"Food truck is awesome!"})

c = pycurl.Curl()
c.setopt(c.URL, 'http://ec2-54-......compute-1.amazonaws.com/index.html')
c.setopt(c.POSTFIELDS, data)
c.setopt(c.VERBOSE, True)

for i in range(100):
    c.perform()

我希望你能在视图中展示像这样的内容:

我想要在视图中展示以下内容:

 if request.method == 'POST':
     data = ?????? # Something that will return me my dictionary

提醒一下: 它始终将以JSON格式存在,而字段是未知的。

2个回答

7

data = request.POST.get('data', '')

将从字典中返回一个单一的值(键=data)。如果你想要整个字典,你只需要使用request.POST。在这里,你使用了QueryDict类:

在HttpRequest对象中,GET和POST属性是django.http.QueryDict的实例。QueryDict是一个类似于字典的类,专门用于处理同一键的多个值。这是必要的,因为一些HTML表单元素,特别是<select multiple>,会传递同一键的多个值。

QueryDict实例是不可变的,除非你创建它们的副本。这意味着你不能直接更改request.POST和request.GET的属性。

-Django文档


嗨@JcKelley,就我所理解的,上述语句将获取数据的值?是吗?但是我的JSON中没有值数据。 - Vor
这将从字典中获取键值。因此,name = request.POST.get('name','') 将返回变量 name 的值为 "Bob"。 - JcKelley
确切地说,但如何返回整个字典? - Vor
request.POST会返回一个字典。 - JcKelley

1
如果发布的数据是JSON格式,您需要对其进行反序列化:
import simplejson
myDict = simplejson.loads(request.POST.get('data'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接