metadata.py

元数据

[OPTIONS] 方法允许客户端确定与资源关联的选项和/或要求,或服务器的功能,而不暗示资源操作或启动资源检索。

RFC7231,第 4.3.7 节。

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 文件的导出器。