在我的应用程序中,我需要为多个客户端提供多个带有分组端点的 Swagger 页面。
我的一个客户(路径)提供移动应用 API,另一个提供 Web 客户端 API。URL 模式相应地保持在 2 个不同的位置urls.py
。
我正在使用drf-yasg为我的 API 生成架构。
为了生成swagger
规范,我schema_views
为每个urls.py
文件分别初始化 2 个,如下所示:
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'),
...
]
Wheremobile_patterns
和web_patterns
只是 url 模式的列表。
如果我打开http://localhost:8000/api/mobile/docs
或者http://localhost:8000/api/web/docs
我确实看到了为两个模式列表正确生成的模式,但是如果我尝试直接从swagger
规范页面发出请求,所有端点都会返回404
错误——它们都试图在不提供完整路径的情况下对不存在的 url 模式发出请求到端点。
因此,如果我从mobile
端点发出对任何视图的请求,swagger 会尝试在
http://localhost:8000/some_mobile_url/
代替http://localhost:8000/api/mobile/v3/some_mobile_url/
另一个模式的情况也是如此,错误地请求http://localhost:8000/some_web_url/
而不是使用完整路径
http://localhost:8000/api/web/v3/some_web_url/
显然,能够直接通过测试 APIswagger
非常重要,因此在我的情况下,规范本身是不够的。
这是我错误配置swagger
itlesf 的一个问题,还是我应该以某种方式提供路径,swagger
以便它相应地为每个 url 预先设置完整路径?