当我的页面将表单发布到我的Django视图时,视图会返回包含一些数据的响应,但很快我遇到了我的视图以不同格式和不同信息集返回数据的问题。我曾想过使用JSON作为标准格式来返回我的数据。
有两种类型的状态:success
和failure
。当POST成功时,它只返回success
但是当它失败时,它会返回一个名为errors
的子组,其中包含一个字段和该字段的错误。
以下是failure
回复示例:
{"failure": {
"errors":[
{"fieldname": "<fieldname>",
"fielderror": "<fielderror>"
},
{"fieldname": "<fieldname>",
"fielderror": "<fielderror>"
}]
}}
以下是success
回复示例:
{"success": {
"data":[
{"fieldname": "<fieldname>",
"fielddata": "<fielddata>"
},
{"fieldname": "<fieldname>",
"fielddata": "<fielddata>"
}]
}}
(成功响应有数据字段,因为您经常想要返回一些数据,即新创建的数据库记录的密钥。)
这是我想出来的,但有很多人在那里使用Django,我想知道是否有一种标准的方式/更强大的做这个或一些模块来帮助解决这个问题。
感谢。
答案 0 :(得分:8)
from django.utils import simplejson
from django.http import HttpResponse
class JsonResponse(HttpResponse):
def __init__(self, data):
content = simplejson.dumps(data)
super(JsonResponse, self).__init__(content=content,
mimetype='application/json')
class Success(JsonResponse):
def __init__(self, something):
x = something # set your data here
content = {'success': {'data': x}}
super(Success, self).__init__(content)
class Failure(JsonResponse):
def __init__(self, something):
x = something # set your data
content = {'failures': {'errors': x}}
super(Failure, self).__init__(content)
这样的事情。就我而言,我让Success
和Failure
接受一个字符串和一个参数字典(如Success(data)
),以使其更容易
如果您的结构非常复杂(或者您也懒得手动编写),请为这个复杂的结构编写自己的包装器(这样您就可以创建具有更少键入的响应),并使成功/失败接受为参数。
答案 1 :(得分:0)
你知道如何使用Python dicts吗?如果是这样,那么有些库可以将Python dict转换为有效的JSON。 Django的内置例如是simplejson
。这是一个例子:
from django.utils import simplejson
def my_view(request):
....
my_json = simplejson.dumps(my_dict) #dumps a JSON string from a dict
my_dict_again = simplejson.loads(my_json) #loads a Python dict from a JSON string
return HttpResponse(json, mimetype="application/json")
答案 2 :(得分:0)
好吧,我不知道这对你有多大帮助,但Python确实有一个模块json
。
>>> import json
>>> json.dumps({'a':'b', 'c':'d'})
'{"a": "b", "c": "d"}'
答案 3 :(得分:0)
我认为前端将为你应该如何格式化数据提供一个更强有力的案例,然后是一些“标准”,不同的客户端框架期望不同的东西,并适应与这些期望的差异更好或更差。< / p>
我尝试让自己的生活更轻松的一种方法是让响应的“形状”总是大致相同,例如,响应将始终具有“status”属性,该属性始终具有“错误”属性,如果没有错误,则result.status.errors
的值为null
。如果有错误,那就是一个解释出错的字符串列表。即使有错误,也会有一个'value'属性,如果请求无法提供服务,则该属性为null;如果可能,则为所请求的资源。