【问题标题】:Standardised JSON response from views来自视图的标准化 JSON 响应
【发布时间】:2011-07-07 07:49:57
【问题描述】:

当我的页面向我的 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,我想知道是否有标准的方法/更强大的方法或一些模块来帮助解决这个问题。

谢谢。

【问题讨论】:

  • 你考虑过使用 JSON-RPC 吗?

标签: python django json django-views response


【解决方案1】:

去过那里。我自己编写了解决方案(因为它很简单。我不知道是否有一个模块可以解决这个问题)。这只是一个 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)

类似的东西。就我而言,我让Success 和Failure 接受一个字符串和一个字典作为参数(如Success(data)),以使其更容易

如果您的结构非常复杂(或者您懒得手动编写它们),请为该复杂结构编写自己的包装器(这样您就可以用更少的输入来创建响应),并让成功/失败接受它作为论据。

【讨论】:

  • Kusut,您的解决方案看起来不错。您使用的 JSON 格式是什么?和我提到的一样吗?
  • 字典结构?不一样
【解决方案2】:

你知道如何使用 Python 字典吗?如果是这样,那么有些库可以将您的 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")

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • Python >2.6 有它。一切都没有。
    【解决方案4】:

    我认为前端将为您应该如何格式化数据提供更强有力的案例,然后是一些“标准”,不同的客户端框架期望不同的东西,并更好或更差地适应与期望的差异。

    我尝试让自己的生活更轻松的一种方法是让响应的“形状”始终大致相同,例如,响应将始终具有“状态”属性,该属性始终具有“错误”属性,如果没有错误,则result.status.errors 的值为null。如果有错误,它将是一个字符串列表,解释出了什么问题。即使有错误,也会有一个 'value' 属性,如果无法处理请求,则该属性为 null,如果可以,则为请求的资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-31
      • 2015-07-11
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 2017-07-14
      相关资源
      最近更新 更多