drf-yasg 提供错误的 URI 路径
drf-yasg provides wrong paths to URIs
在我的应用程序中,我需要有多个 Swagger 页面,其中包含多个客户端的分组端点。
我的一个客户(路径)提供移动应用程序 API,另一个提供 Web 客户端 API。 URL 模式相应地保存在 2 个不同的 urls.py
中。
我正在使用 drf-yasg 为我的 API 生成架构。
要为那些我正在为每个 urls.py
文件初始化 2 个单独的 schema_views
的文件生成 swagger
规范,如下所示:
from api_mobile.urls import urlpatterns as mobile_patterns
from api_web.urls import urlpatterns as web_patterns
mobile_schema_view = get_schema_view(
openapi.Info(
title="Mobile API",
default_version='v3',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=mobile_patterns,
)
web_schema_view = get_schema_view(
openapi.Info(
title="Web API",
default_version='v1',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=web_patterns,
)
urlpatterns = [
path(
'api/mobile/docs',
mobile_schema_view.with_ui('swagger', cache_timeout=0),
name='mobile-schema-ui'
),
path(
'api/web/docs',
web_schema_view.with_ui('swagger', cache_timeout=0),
name='web-schema-ui'
),
path('api/mobile/v3/', include('api_mobile.urls'), name='mobile_urls'),
path('api/web/v1/', include('api_web.urls'), name='web_urls'),
...
]
其中 mobile_patterns
和 web_patterns
只是 url 模式的列表。
如果我打开 http://localhost:8000/api/mobile/docs
或 http://localhost:8000/api/web/docs
,我会看到为两个模式列表正确生成的模式,但是如果我尝试直接从 swagger
规范页面发出请求,所有端点return 404
错误——他们都试图在不提供端点完整路径的情况下向不存在的 url 模式发出请求。
因此,如果我从 mobile
端点向任何视图发出请求,swagger 会尝试在
处发出请求
http://localhost:8000/some_mobile_url/
而不是 http://localhost:8000/api/mobile/v3/some_mobile_url/
另一个模式的情况相同,swagger 错误地请求 http://localhost:8000/some_web_url/
而不是使用完整路径
http://localhost:8000/api/web/v3/some_web_url/
显然能够通过 swagger
直接测试 API 非常重要,因此规范本身对我来说还不够。
这是我错误配置 swagger
itlesf 的问题还是我应该以某种方式提供 swagger
的路径以便它相应地为每个 url 添加完整路径?
这对我们来说工作正常:
api_schema.py
from django.conf.urls import include, url
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from books.api.v1.urls import urlpatterns as api_v1
API_DESCRIPTION = openapi.Info(
...
)
schema_view = get_schema_view(
info=...,
...
url='https://oursite.company.io/',
patterns=[
url('api/v1/', include(api_v1)),
],
)
books.api.v1.urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^books', ...),
...
]
urls.py
from ...api_schema import schema_view
...
url(r'^api/v1/', include(api_v1)),
url(r'^api/schema(?P<format>\.json|\.yaml)$',
schema_view.without_ui(cache_timeout=0),
name='api_schema_v1'),
...
在我的应用程序中,我需要有多个 Swagger 页面,其中包含多个客户端的分组端点。
我的一个客户(路径)提供移动应用程序 API,另一个提供 Web 客户端 API。 URL 模式相应地保存在 2 个不同的 urls.py
中。
我正在使用 drf-yasg 为我的 API 生成架构。
要为那些我正在为每个 urls.py
文件初始化 2 个单独的 schema_views
的文件生成 swagger
规范,如下所示:
from api_mobile.urls import urlpatterns as mobile_patterns
from api_web.urls import urlpatterns as web_patterns
mobile_schema_view = get_schema_view(
openapi.Info(
title="Mobile API",
default_version='v3',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=mobile_patterns,
)
web_schema_view = get_schema_view(
openapi.Info(
title="Web API",
default_version='v1',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=web_patterns,
)
urlpatterns = [
path(
'api/mobile/docs',
mobile_schema_view.with_ui('swagger', cache_timeout=0),
name='mobile-schema-ui'
),
path(
'api/web/docs',
web_schema_view.with_ui('swagger', cache_timeout=0),
name='web-schema-ui'
),
path('api/mobile/v3/', include('api_mobile.urls'), name='mobile_urls'),
path('api/web/v1/', include('api_web.urls'), name='web_urls'),
...
]
其中 mobile_patterns
和 web_patterns
只是 url 模式的列表。
如果我打开 http://localhost:8000/api/mobile/docs
或 http://localhost:8000/api/web/docs
,我会看到为两个模式列表正确生成的模式,但是如果我尝试直接从 swagger
规范页面发出请求,所有端点return 404
错误——他们都试图在不提供端点完整路径的情况下向不存在的 url 模式发出请求。
因此,如果我从 mobile
端点向任何视图发出请求,swagger 会尝试在
http://localhost:8000/some_mobile_url/
而不是 http://localhost:8000/api/mobile/v3/some_mobile_url/
另一个模式的情况相同,swagger 错误地请求 http://localhost:8000/some_web_url/
而不是使用完整路径
http://localhost:8000/api/web/v3/some_web_url/
显然能够通过 swagger
直接测试 API 非常重要,因此规范本身对我来说还不够。
这是我错误配置 swagger
itlesf 的问题还是我应该以某种方式提供 swagger
的路径以便它相应地为每个 url 添加完整路径?
这对我们来说工作正常:
api_schema.py
from django.conf.urls import include, url
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from books.api.v1.urls import urlpatterns as api_v1
API_DESCRIPTION = openapi.Info(
...
)
schema_view = get_schema_view(
info=...,
...
url='https://oursite.company.io/',
patterns=[
url('api/v1/', include(api_v1)),
],
)
books.api.v1.urls.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^books', ...),
...
]
urls.py
from ...api_schema import schema_view
...
url(r'^api/v1/', include(api_v1)),
url(r'^api/schema(?P<format>\.json|\.yaml)$',
schema_view.without_ui(cache_timeout=0),
name='api_schema_v1'),
...