视图中的标准化JSON响应

0 投票
4 回答
1448 浏览
提问于 2025-04-16 21:00

当我的页面向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,我在想是否有更标准或更稳健的方法,或者有没有什么模块可以帮助实现这个功能。

谢谢。

4 个回答

0

我不知道这对你有多大帮助,但Python确实有一个叫做json的模块。

>>> import json
>>> json.dumps({'a':'b', 'c':'d'})
'{"a": "b", "c": "d"}'
0

你知道怎么用Python的字典吗?如果知道的话,有一些库可以把你的Python字典转换成有效的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")
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)),这样使用起来更方便。

如果你的数据结构比较复杂(或者你懒得手动写),可以自己写一个工具来处理这个复杂的结构(这样你就可以用更少的输入来创建响应),然后让 Success/Failure 接受这个作为参数。

撰写回答