元数据
[
OPTIONS
] 方法允许客户端确定与资源关联的选项和/或要求,或服务器的功能,而不暗示资源操作或启动资源检索。
REST 框架包括一个可配置的机制,用于确定您的 API 应如何响应 OPTIONS
请求。这允许您返回 API 架构或其他资源信息。
目前还没有针对 HTTP OPTIONS
请求应返回哪种风格的响应而广泛采用的约定,因此我们提供了一种返回一些有用信息的临时风格。
这是一个示例响应,演示了默认情况下返回的信息。
HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
{
"name": "To Do List",
"description": "List existing 'To Do' items, or create a new item.",
"renders": [
"application/json",
"text/html"
],
"parses": [
"application/json",
"application/x-www-form-urlencoded",
"multipart/form-data"
],
"actions": {
"POST": {
"note": {
"type": "string",
"required": false,
"read_only": false,
"label": "title",
"max_length": 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 框架包仅包含一个名为 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):
"""
Don't include field and other information for `OPTIONS` requests.
Just return the name and description.
"""
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 文件的导出器。