首页 > 解决方案 > 为什么我们在 Django 中扩展 HTTPResponse?

问题描述

我在看django-jquery-file-upload

这是响应文件

MIMEANY = '*/*'
MIMEJSON = 'application/json'
MIMETEXT = 'text/plain'


def response_mimetype(request):
    """response_mimetype -- Return a proper response mimetype, accordingly to
    what the client accepts, as available in the `HTTP_ACCEPT` header.

    request -- a HttpRequest instance.

    """
    can_json = MIMEJSON in request.META['HTTP_ACCEPT']
    can_json |= MIMEANY in request.META['HTTP_ACCEPT']
    return MIMEJSON if can_json else MIMETEXT


class JSONResponse(HttpResponse):
    """JSONResponse -- Extends HTTPResponse to handle JSON format response.

    This response can be used in any view that should return a json stream of
    data.

    Usage:

        def a_iew(request):
            content = {'key': 'value'}
            return JSONResponse(content, mimetype=response_mimetype(request))

    """
    def __init__(self, obj='', json_opts=None, mimetype=MIMEJSON, *args, **kwargs):
        json_opts = json_opts if isinstance(json_opts, dict) else {}
        content = json.dumps(obj, **json_opts)
        super(JSONResponse, self).__init__(content, mimetype, *args, **kwargs)

我不明白 form_valid(views) 是如何构造的。

def form_valid(self, form):
    self.object = form.save()
    files = [serialize(self.object)]
    data = {'files': files}
    response = JSONResponse(data, mimetype=response_mimetype(self.request))
    response['Content-Disposition'] = 'inline; filename=files.json'
    return response

使用 JSON 响应而不是 HTTPResponse 有什么好处?

标签: django

解决方案


那么 aJSONResponse实际上是 a HTTPResponse我们只是为了方便程序员添加一些默认功能,并使其更难出错。

class JSONResponse(HttpResponse):

    # ...

    def __init__(self, obj='', json_opts=None, mimetype=MIMEJSON, *args, **kwargs):
        json_opts = json_opts if isinstance(json_opts, dict) else {}
        content = json.dumps(obj, **json_opts)
        super(JSONResponse, self).__init__(content, mimetype, *args, **kwargs)

JSON 响应基本上做了两件事:

  1. 它将mimetype默认设置为application/json这样,如果您自己不提供它,那就是 MIME 类型,因此浏览器(或使用响应的其他服务)知道这是一个 JSON 响应;
  2. 它会自动将 Pyhon 对象转储为 JSON 字符串(带有json.dumps(..))。因此,您可以传递一个字典,而不是传递一个 JSON 流,这JSONResponse将确保它生成一个有效的 JSON 流。

它还允许将特定参数传递给此转储(json_opts)以稍微改变转储过程(例如转储非 Vanilla Python 对象)。

它还可以更轻松地向所有JSON 响应添加某些逻辑。例如,如果稍后有 JSON-2.0 标准,那么我们可以重写JSONResponse逻辑,所有JSONResponses 都将使用新逻辑,而不是以临时方式修补所有出现的情况。

但是对于浏览器来说,完全没有区别,因为它只看到一个 HTTP 响应,并填写了一些值。这些是由应用程序程序员填写的,还是 Django 库填写的,都没有区别。

JSON ,是Java S cript Object Notation ,是一种流行的格式(例如 XML),用于在应用程序之间传输数据。JavaScript、Python、Haskell、Java 等都有对 JSON 进行编码和解码的方法。因此,它通常用于在以不同语言编写的系统之间传输数据(例如,浏览器运行 JavaScript,Django 网络服务器使用 Python 运行)。

在 Django 中有很多代码处理程序员的便利性。以FormView: 为例,它将确保程序员不必初始化aForm本身等。这会导致代码更短、更优雅,但错误也会更少(因为通用部分封装在此类中)。


推荐阅读