django - 为什么我们在 Django 中扩展 HTTPResponse?
问题描述
这是响应文件
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 有什么好处?
解决方案
那么 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 响应基本上做了两件事:
- 它将
mimetype
默认设置为application/json
这样,如果您自己不提供它,那就是 MIME 类型,因此浏览器(或使用响应的其他服务)知道这是一个 JSON 响应; - 它会自动将 Pyhon 对象转储为 JSON 字符串(带有
json.dumps(..)
)。因此,您可以传递一个字典,而不是传递一个 JSON 流,这JSONResponse
将确保它生成一个有效的 JSON 流。
它还允许将特定参数传递给此转储(json_opts
)以稍微改变转储过程(例如转储非 Vanilla Python 对象)。
它还可以更轻松地向所有JSON 响应添加某些逻辑。例如,如果稍后有 JSON-2.0 标准,那么我们可以重写JSONResponse
逻辑,所有JSONResponse
s 都将使用新逻辑,而不是以临时方式修补所有出现的情况。
但是对于浏览器来说,完全没有区别,因为它只看到一个 HTTP 响应,并填写了一些值。这些是由应用程序程序员填写的,还是 Django 库填写的,都没有区别。
JSON ,是Java S cript Object Notation ,是一种流行的格式(例如 XML),用于在应用程序之间传输数据。JavaScript、Python、Haskell、Java 等都有对 JSON 进行编码和解码的方法。因此,它通常用于在以不同语言编写的系统之间传输数据(例如,浏览器运行 JavaScript,Django 网络服务器使用 Python 运行)。
在 Django 中有很多代码处理程序员的便利性。以FormView
: 为例,它将确保程序员不必初始化aForm
本身等。这会导致代码更短、更优雅,但错误也会更少(因为通用部分封装在此类中)。
推荐阅读
- reactjs - withRouter HOC有什么用?
- ios - Swift4 侧边菜单显示黑色状态栏
- swift - AvFoundation 框架,AvPlayer pause 方法导致应用最小化后崩溃
- python - Sikulix 管理员权限问题
- javascript - 在 js 文件中使用 sass 变量 create-react-app
- c# - 如何将类转换为泛型
- javascript - 复制文本框值并将复制的值括在单引号中
- django - 如何在 Django 模板中显示多层 JSON?
- node.js - Nodejs Express:如何响应 400 和错误详细信息
- ruby - 在 ruby 包装器中运行 ansible playbook