django之response数据json;django序列化
一、用httpresponse自定义结果,并使用json格式,返回给客户端:
import json
from django.http import HttpResponse
def get_an_apple(request):
resp = {'errorcode': 100, 'detail': 'Get success'}
return HttpResponse(json.dumps(resp), content_type="application/json")
print get_an_apple('asdf')
#Content-Type: application/json
{"errorcode": 100, "detail": "Get success"}
print type(get_an_apple('adsf'))
# <class 'django.http.response.HttpResponse'>
注意:使用HttpResponse时,内部必须是json字符串。即要先使用,json.dumps()。
错误示例:
import json from django.http import HttpResponse def get_an_apple(request): resp = {'errorcode': 100, 'detail': 'Get success'} return HttpResponse(resp, content_type="application/json") print get_an_apple('asdf'), type(get_an_apple('adsf')) # errorcodedetail <class 'django.http.response.HttpResponse'>
二、用httpresponse自定义结果,并使用application/x-www-form-urlencoded格式,返回给客户端:
import json from django.http import HttpResponse def get_an_apple(request): resp = {'errorcode': 100, 'detail': 'Get success'} return HttpResponse(json.dumps(resp), content_type="application/x-www-form-urlencoded") print get_an_apple('asdf'), type(get_an_apple('adsf')) #Content-Type: application/x-www-form-urlencoded #{"errorcode": 100, "detail": "Get success"} <class 'django.http.response.HttpResponse'>
三、使用JsonResponse自定义结果,并使用json格式,返回给客户端:
import json from django.http import HttpResponse def get_an(request): resp = {'errorcode': 100, 'detail': 'Get success'} return JsonResponse(resp, content_type="application/json") # return JsonResPonse(resp) # 同样返回的是application/json print get_an_apple('asdf'), type(get_an_apple('adsf')) # Content-Type: application/json #{"errorcode": 100, "detail": "Get success"} <class 'django.http.response.HttpResponse'>
注意:与HttpsResponse相反,JsonResponse不需要先转成json字符串,直接使用数组即可。
四、使用JsonResponse自定义结果,并使用application/x-www-form-urlencoded格式,返回给客户端:
import json from django.http import HttpResponse def get_an(request): resp = {'errorcode': 100, 'detail': 'Get success'} return JsonResponse(resp, content_type="application/x-www-form-urlencoded") print get_an_apple('asdf'), type(get_an_apple('adsf')) # Content-Type: application/x-www-form-urlencoded #{"errorcode": 100, "detail": "Get success"} <class 'django.http.response.HttpResponse'>
Django 的 object 不能直接被序列化成 json 字符串,因为 Django model 里有些 field 没有对应的序列器做序列化操作(比如 DateTimeField )
如果要直接序列化,有5种方式:
1. 在model 里自定义一个to_dict()方法,假设model类为User。
def to_dict(self): data = {} for f in self._meta.concrete_fields: data[f.name] = f.value_from_object(self) return data
然后,result = json.dumps(user.to_dict())
即可
2.使用 django-rest-framework
django-rest-framework 是一个可以帮助你快速构建 REST API 的强力框架。 他拥有完善的序列化器,但在使用之前你需要花费一些时间入门, 并学习 cbv 的开发方式, 对于有时间需求的项目显然这不是最好的解决方案。
3.django.core.serializers
Django内建序列化器, 它可以序列化Django model query set 但无法直接序列化单独的Django model数据。如果你的model里含有混合数据 , 这个序列化器同样无法使用(如果你想直接使用序列化数据). 除此之外, 如果你想直接把序列化数据返回给用户,显然它包含了很多敏感及对用户无用对信息。
正确示例:
from django.core import serializers def get_users(request): user_list = models.UserInfo.objects.all() # data = json.dumps(user_list) 这是错误的 data = serializers.serialize('json',user_list) return HttpResponse(data)
[{“model”: “app01.userinfo”, “pk”: 1, “fields”: {“username”: “\u5174\u666e”, “password”: “123123”}},
{“model”: “app01.userinfo”, “pk”: 2, “fields”: {“username”: “\u90b1\u4eae”, “password”: “666”}}]
从以上返回结果可以看到,使用django.core.serializers序列化,会返回一些没用的信息
4.QuerySet.values()
和上面3一样, QuerySet.values() 同样没法工作如果你的model里有 DateTimeField 或者其他特殊的 Field 以及额外数据。
在response的时侯不能直接HttpResponse(QuerySet),因为QuerySet不能够序列化;但QuerySet.values()可以序列化。
错误示例,因为QuerySet不可序列化:
def get_users(request): user_list = models.UserInfo.objects.all() data = json.dumps(user_list) return HttpResponse(data) `` 这样是错误的,将抛出错误信息:
正确示例:QuerySet.values()
def get_users(request): user_list = models.UserInfo.objects.values('id', 'name')
user_list = list(user_list) data = json.dumps(user_list) return HttpResponse(data)
QuerySet.values()让使用方便,但是它有一个问题:json不能处理时间类型(datatime)。
解决办法:定制JSON
class JsonCustomEncoder(json.JSONEncoder): def default(self, field): if isinstance(field, datetime): return field.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(field, date): return field.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, field)
json.dumps(xxxx, cls=JsonCustomEncoder)
5.使用第三方模块:Django Simple Serializer
示例:使用 django simple serializer 进行序列化
希望可以快速简单的序列化数据, 所以我设计了一种可以不用任何额外的配置与学习而将Django data 或者 python data 序列化为相应的数据的简单的方式。 这就是为什么我写了 django simple serializer。
pip install django-simple-serializer
class Classification(models.Model): c_name = models.CharField(max_length=30, unique=True) class Article(models.Model): caption = models.CharField(max_length=50) classification = models.ForeignKey(Classification, related_name='cls_art') content = models.TextField() publish = models.BooleanField(default=False)
使用django simple serializer的简单例子:
from dss.Serializer import serializer article_list = Article.objects.all() data = serializer(article_list)
data:
[{'read_count': 0, 'create_time': 1432392456.0, 'modify_time': 1432392456.0, 'sub_caption': u'first', 'comment_count': 0, u'id': 31}, {'read_count': 0, 'create_time': 1432392499.0, 'modify_time': 1432392499.0, 'sub_caption': u'second', 'comment_count': 0, u'id': 32}]
默认情况下, 序列器会返回一个 list 或者 dict(对于单个model实例), 你可以设置参数 “output_type” 来决定序列器返回 json/raw.
posted on 2018-06-20 16:43 myworldworld 阅读(845) 评论(0) 收藏 举报