视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Django接受前端数据的几种方法总结
2020-11-27 14:27:18 责编:小采
文档


背景

测试工具箱写到一半,今天遇到了一个前后端数据交互的问题,就一起做一下整理。

环境

--------------------------------------------------------

版本相关

操作系统:Mac OS X EI Caption

Python版本:2.7

IDE:PyCharm

Django: 1.8.2

---------------------------------------------------------

注: 我测试的是Get方法,POST方法也同样适用

字符型

字符型的数据相对好获取,前端传递的方法如下:

sendData = {? "exporttype": exporttype,
? "bugids": bugids,
? "test": JSON.stringify({"test": "test"})
?};

在Django的后端只要使用exporttype = request.GET.get("exporttype")

就能正常的获取到这个数据了。

注意: 在Python2.7中数据是unicode编码的,如果要使用,有时候需要进行转str

结果示例:

Excle <type 'unicode'>

数组型

获取数组型的数据如果使用获取字符串的数据的方法,打出的结果是None。我们要使用这个方法:

bugids = request.GET.getlist("bugids[]")

这样获取的数据就是数组类型。

注意: 获取的数组中的元素是unicode编码的,在某些时候使用需要转编码

结果示例:

?传递的url

[14/Jul/2016 11:00:41]"GET /testtools/exportbug/?exporttype=Excle&bugids%5B%5D=102&bugids%

?获取的数据

[u'102', u'101', u'100', u'99', u'98', u'97', u'96', u'95', u'94', u'93', u'92', u'91', u

字典型

字典型数据其实可以当成字符串数据来处理,获取到对应字符串后使用JSON模块做一下格式化就行了。

对于前端来说,传递字典型的数据就是传递JSON数据,所以使用的方法是:

"test": JSON.stringify({"test": "test"})

结果示例:

{"test":"test"} <type 'unicode'>

相关源码

?Get方法

Get方法是wsgi里面的一个方法。

def GET(self):
 # The WSGI spec says 'QUERY_STRING' may be absent.
 raw_query_string = get_bytes_from_wsgi(self.environ, 'QUERY_STRING', '')
 return http.QueryDict(raw_query_string, encoding=self._encoding)

最终返回的是一个http.QueryDict(raw_query_string, encoding=self._encoding)http的原始数据,而QueryDict继承于MultiValueDict ,所以我们直接看MultiValueDict就好了。

?MultiValueDict

其实源码看起来并不难。

def get(self, key, default=None):
 """
 Returns the last data value for the passed key. If key doesn't exist
 or value is an empty list, then default is returned.
 """
 try:
 val = self[key]
 except KeyError:
 return default
 if val == []:
 return default
 return val
 
 def getlist(self, key, default=None):
 """
 Returns the list of values for the passed key. If key doesn't exist,
 then a default value is returned.
 """
 try:
 return super(MultiValueDict, self).__getitem__(key)
 except KeyError:
 if default is None:
 return []
 return default
 
 def __getitem__(self, key):
 """
 Returns the last data value for this key, or [] if it's an empty list;
 raises KeyError if not found.
 """
 try:
 list_ = super(MultiValueDict, self).__getitem__(key)
 except KeyError:
 raise MultiValueDictKeyError(repr(key))
 try:
 return list_[-1]
 except IndexError:
 return []

getlist方法也就是把数据全部整合一下,返回回来。

以上这篇Django接受前端数据的几种方法总结就是小编分享给大家的全部内容了,希望能给大家一个参考,更多相关文章请关注PHP中文网(www.gxlcms.com)!

下载本文
显示全文
专题