[OPTIONS] 方法允许客户端确定与资源相关联的选项和 / 或要求,或者服务器的能力,而不暗示资源操作或启动资源检索。
—— RFC7231,第 4.3.7 节。
REST framework 包含一个可配置的机制,用于确定你的 API 应该如何响应 OPTIONS
请求。这允许你返回 API 模式或其他资源信息。
目前没有被广泛采用的关于 OPTIONS
请求应该返回何种风格响应的确切约定,因此我们提供了一种临时风格,返回一些有用的信息。
以下是一个示例响应,展示了默认情况下返回的信息。
HTTP 200 OK
允许:GET, POST, HEAD, OPTIONS
内容类型:application/json
{
“名称”:'待办事项列表',
“描述”:'列出现有的 '待办事项',或创建一个新项目。',
“渲染”:[
“application/json”,
“text/html”
],
“解析”:[
“application/json”,
“application/x-www-form-urlencoded”,
“multipart/form-data”
],
“操作”:{
“POST”:{
“note”:{
“类型”:“string”,
“必需”:false,
“只读”:false,
“标签”:“标题”,
“最大长度”:100
}
}
}
}
可以通过 'DEFAULT_METADATA_CLASS'
设置键全局设置元数据类:
REST_FRAMEWORK = {
'DEFAULT_METADATA_CLASS':'rest_framework.metadata.SimpleMetadata'
}
或者可以为视图单独设置元数据类:
class APIRoot(APIView):
metadata_class = APIRootMetadata
def get(self, request, format=None):
return Response({
...
})
REST framework 包仅包含一个名为 SimpleMetadata
的元数据类实现。如果你想使用另一种风格,你需要实现一个自定义的元数据类。
创建模式端点
如果你有特定要求,用于创建可以通过常规 GET
请求访问的模式端点,你可能会考虑重用元数据 API 来实现。
例如,可以在视图集中添加以下路由,以提供可链接的模式端点。
@action(methods=['GET'], detail=False)
def api_schema(self, request):
meta = self.metadata_class()
data = meta.determine_metadata(request, self)
return Response(data)
选择这种方法有几个原因,包括 OPTIONS
响应是不可缓存的。
如果要提供自定义元数据类,你需要覆盖 BaseMetadata
并实现 determine_metadata(self, request, view)
方法。
可能需要执行的有用操作包括返回模式信息、使用 JSON 模式等格式,或向管理员用户返回调试信息。
示例
以下类可用于限制 OPTIONS
请求返回的信息。
class MinimalMetadata(BaseMetadata):
"""
不包括字段和其他信息的 `OPTIONS` 请求。
只返回名称和描述。
"""
def determine_metadata(self, request, view):
return {
'name':view.get_view_name(),
'description':view.get_view_description()
}
然后配置你的设置以使用这个自定义类:
REST_FRAMEWORK = {
'DEFAULT_METADATA_CLASS':'myproject.apps.core.MinimalMetadata'
}
第三方包
以下是提供额外元数据实现的第三方包。
DRF-schema-adapter
drf-schema-adapter 是一组工具,用于更轻松地向前端框架和库提供模式信息。它提供了一个元数据混合类以及 2 个元数据类和多个适配器,适合生成 json-schema 以及各种库可读的模式信息。
如果你愿意,它还提供了一个导出器,可以将这些模式信息导出到 json 文件。