为什么要在Django中扩展HTTPResponse?

nbysray5  于 2023-06-07  发布在  Go
关注(0)|答案(2)|浏览(140)

我在看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的好处是什么?

qvsjd97n

qvsjd97n1#

JSONResponse实际上是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响应;
1.它会自动将Pyhon对象转储到JSON字符串中(使用json.dumps(..))。因此,您可以传递字典,而不是传递JSON流,JSONResponse将确保它生成有效的JSON流。
它还允许向这个转储(json_opts)传递特定的参数,以稍微改变转储过程(例如转储非Vanilla Python对象)。
它还可以更容易地向所有JSON响应添加某些逻辑。例如,如果稍后有JSON-2.0标准,那么我们可以重写JSONResponse逻辑,所有JSONResponse都将使用新逻辑,而不是以 * ad hoc * 方式修补所有出现的情况。
但是对于浏览器来说,这根本没有区别,因为它只看到一个HTTP响应,其中填充了一些值。这些是由应用程序员填写的,还是Django库没有区别。
JSON是JavaScriptOobjectN的缩写,是一种流行的格式(例如XML),用于在应用程序之间传输数据。JavaScript、Python、Haskell、Java等都有编码和解码JSON的方法。因此,它通常用于在不同语言编写的系统之间传输数据(例如,浏览器运行JavaScript,Django Web服务器运行Python)。
在Django中,有很多代码处理程序员的便利性。以FormView为例:它将确保程序员不必初始化Form本身,等等。这会使代码更短、更优雅,而且错误也更少(因为公共部分被封装在这个类中)。

00jrzges

00jrzges2#

django docs
如果你发现自己需要Django没有提供的响应类,你可以在http.HTTPStatus的帮助下创建它。例如:

from http import HTTPStatus 
from django.http import HttpResponse

class HttpResponseNoContent(HttpResponse):
    status_code = HTTPStatus.NO_CONTENT

相关问题