我在看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的好处是什么?
2条答案
按热度按时间qvsjd97n1#
JSONResponse
实际上是HTTPResponse
。我们只是为了程序员的方便而添加一些默认功能,并使其更难出错。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
本身,等等。这会使代码更短、更优雅,而且错误也更少(因为公共部分被封装在这个类中)。00jrzges2#
从django docs
如果你发现自己需要Django没有提供的响应类,你可以在http.HTTPStatus的帮助下创建它。例如: