来自视图的标准化JSON响应

时间:2011-07-07 07:49:57

标签: python django json django-views response

当我的页面将表单发布到我的Django视图时,视图会返回包含一些数据的响应,但很快我遇到了我的视图以不同格式和不同信息集返回数据的问题。我曾想过使用JSON作为标准格式来返回我的数据。

有两种类型的状态:successfailure。当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,我想知道是否有一种标准的方式/更强大的做这个或一些模块来帮助解决这个问题。

感谢。

4 个答案:

答案 0 :(得分:8)

是的。我自己编写了解决方案(因为它很简单。我不知道是否有一个模块用于此)。这只是一个json响应包装器

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)
这样的事情。就我而言,我让SuccessFailure接受一个字符串和一个参数字典(如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;如果可能,则为所请求的资源。