浏览器增强-Django REST框架
浏览器增强
“过载邮件有两个没有争议的用途。模拟http为客户端提供的统一接口,比如不支持PUT或DELETE的Web浏览器。
— RESTful Web服务题名/责任者:David L.
为了允许可浏览API发挥作用,REST框架需要提供一些浏览器增强功能。
从3.3.0版本开始,使用javascript启用这些功能,使用AJAX-形式图书馆。
基于浏览器的放置、删除等.
这个Ajax表单库支持基于浏览器的PUT
, DELETE
以及HTML表单上的其他方法。
包含库后,使用data-method
属性,如下所示:
<form action="/" data-method="PUT">
<input name='foo'/>
...
</form>
请注意,在3.3.0之前,这种支持是服务器端的,而不是基于javascript的。方法重载样式(如Ruby on Rails)不再受支持,因为它在请求解析中引入了一些微妙的问题。
基于浏览器的非表单内容提交
类支持基于浏览器的内容类型提交(如JSON)。Ajax表单库,使用表单字段data-override='content-type'
和data-override='content'
属性。
例如:
<form action="/">
<input data-override='content-type' value='application/json' type='hidden'/>
<textarea data-override='content'>{}</textarea>
<input type="submit"/>
</form>
请注意,在3.3.0之前,这种支持是服务器端的,而不是基于javascript的。
基于URL的格式后缀
REST框架可以?format=json
样式URL参数,它是确定应该从视图返回哪种内容类型的有用快捷方式。
控件控制此行为。URL_FORMAT_OVERRIDE
背景。
基于HTTP头的方法重写
在3.3.0版本之前,半扩展头X-HTTP-Method-Override
支持重写请求方法。这种行为不再存在于核心中,而是可以在需要时使用中间件进行添加。
例如:
METHOD_OVERRIDE_HEADER = 'HTTP_X_HTTP_METHOD_OVERRIDE'
class MethodOverrideMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if request.method == 'POST' and METHOD_OVERRIDE_HEADER in request.META:
request.method = request.META[METHOD_OVERRIDE_HEADER]
return self.get_response(request)
基于URL的接受标头
在3.3.0版本之前,REST框架包含了对?accept=application/json
样式URL参数,这将允许Accept
标题将被重写。
由于引入了内容协商API,此行为不再包含在CORE中,而是可以使用自定义内容协商类来添加(如果需要的话)。
例如:
class AcceptQueryParamOverride()
def get_accept_list(self, request):
header = request.META.get('HTTP_ACCEPT', '*/*')
header = request.query_params.get('_accept', header)
return [token.strip() for token in header.split(',')]
HTML 5不支持放置和删除表单吗?
没有。它一度打算支持PUT
和DELETE
表格,但后来从规格上掉下来...有遗骸正在进行的讨论关于增加对PUT
和DELETE
,以及如何支持表单编码数据以外的内容类型。
网友评论