drf-spectacular 使用版本控制时不起作用(规范中未定义任何操作!)
drf-spectacular not working when versioning is used (No operations defined in spec!)
几周前我安装了 drf-spectacular
。一切正常,直到我在 DRF(Django Rest Framework)中启用 版本控制。
我实施了 AcceptHeaderVersioning
,它工作正常。但后来我意识到 Swagger 没有在 /docs/ 显示端点,并且显示了这条消息:“规范中没有定义任何操作!”.
如果我在 REST_FRAMEWORK
设置中注释 DEFAULT_VERSIONING_CLASS
行,所有端点都会正确显示在 Swagger 文档页面 (/docs/) 中。但是,它破坏了我的版本控制:request.version = None
.
我用 AcceptHeaderVersioning
以及 URLPathVersioning
和 NamespaceVersioning
进行了测试。所有结果都相同。
我读到 AcceptHeaderVersioning
是一年前实施的。 Link 到提交 here.
但我还了解到计划更改 modify_for_versioning
功能,这可能会影响 header 版本控制。 Link 管道模块中的函数,here and conversation here. In fact, a lot of changes have been made to the module the last year, check here。
这些是我的 DRF 设置:
REST_FRAMEWORK = {
# Auth
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
# Swagger/docs
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
# Pagination
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5,
# Testing
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
# Versioning
# https://www.django-rest-framework.org/api-guide/versioning/#configuring-the-versioning-scheme
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
'DEFAULT_VERSION': None,
'ALLOWED_VERSIONS': None,
'VERSION_PARAM': 'version',
}
问题
- 知道我做错了什么吗?有什么建议可以让两者一起工作(版本控制和招摇)?有什么建议吗?
- 顺便说一句(这是次要问题,不是主要问题):是否可以在我自己的项目中启动
drf-spectacular
测试?
提前致谢!
问题 1:版本控制工作正常。这是一个常见的错误。当 SpectacularAPIView
使用 AcceptHeaderVersioning
进行版本控制时(通过 DEFAULT_VERSIONING_CLASS
),从 SpectacularAPIView
获取架构的请求可能不包含版本 header,因此您只获取未版本化的端点(在你的情况下 none)。
要么使用 /api/schema?version=v2
显式请求版本化架构,要么使用
手动设置版本
path('api/schema/', SpectacularAPIView.as_view(api_version='v2'), name='schema'),
其中 magic happens 和使用版本的顺序。
问题 2:python 车轮不包括测试。为此,您需要安装源码包:https://pypi.org/project/drf-spectacular/#files
几周前我安装了 drf-spectacular
。一切正常,直到我在 DRF(Django Rest Framework)中启用 版本控制。
我实施了 AcceptHeaderVersioning
,它工作正常。但后来我意识到 Swagger 没有在 /docs/ 显示端点,并且显示了这条消息:“规范中没有定义任何操作!”.
如果我在 REST_FRAMEWORK
设置中注释 DEFAULT_VERSIONING_CLASS
行,所有端点都会正确显示在 Swagger 文档页面 (/docs/) 中。但是,它破坏了我的版本控制:request.version = None
.
我用 AcceptHeaderVersioning
以及 URLPathVersioning
和 NamespaceVersioning
进行了测试。所有结果都相同。
我读到 AcceptHeaderVersioning
是一年前实施的。 Link 到提交 here.
但我还了解到计划更改 modify_for_versioning
功能,这可能会影响 header 版本控制。 Link 管道模块中的函数,here and conversation here. In fact, a lot of changes have been made to the module the last year, check here。
这些是我的 DRF 设置:
REST_FRAMEWORK = {
# Auth
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
# Swagger/docs
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
# Pagination
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 5,
# Testing
'TEST_REQUEST_DEFAULT_FORMAT': 'json',
# Versioning
# https://www.django-rest-framework.org/api-guide/versioning/#configuring-the-versioning-scheme
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
'DEFAULT_VERSION': None,
'ALLOWED_VERSIONS': None,
'VERSION_PARAM': 'version',
}
问题
- 知道我做错了什么吗?有什么建议可以让两者一起工作(版本控制和招摇)?有什么建议吗?
- 顺便说一句(这是次要问题,不是主要问题):是否可以在我自己的项目中启动
drf-spectacular
测试?
提前致谢!
问题 1:版本控制工作正常。这是一个常见的错误。当 SpectacularAPIView
使用 AcceptHeaderVersioning
进行版本控制时(通过 DEFAULT_VERSIONING_CLASS
),从 SpectacularAPIView
获取架构的请求可能不包含版本 header,因此您只获取未版本化的端点(在你的情况下 none)。
要么使用 /api/schema?version=v2
显式请求版本化架构,要么使用
path('api/schema/', SpectacularAPIView.as_view(api_version='v2'), name='schema'),
其中 magic happens 和使用版本的顺序。
问题 2:python 车轮不包括测试。为此,您需要安装源码包:https://pypi.org/project/drf-spectacular/#files