首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >drf-yasg提供了错误的URI路径。

drf-yasg提供了错误的URI路径。
EN

Stack Overflow用户
提问于 2019-10-14 21:58:27
回答 1查看 5.2K关注 0票数 6

在我的应用程序中,我需要多个Swagger页面,并为多个客户端设置分组端点。

我的一个客户端(路径)提供移动应用程序API,另一个客户端提供web客户端API。相应地,在两个不同的urls.py中保存URL模式。

我使用杜鲁-雅斯格为我的API生成模式。

要为这些文件生成swagger规范,我要为每个urls.py文件初始化2个单独的schema_views,如下所示:

代码语言:javascript
复制
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_patternsweb_patterns只是一个url模式的列表。

如果打开http://localhost:8000/api/mobile/docshttp://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/

显然,能够通过swagger直接测试API是非常重要的,所以规范本身在我的情况下是不够的。

这是我错误配置swagger条目的一个问题,还是应该以某种方式提供到swagger的路径,以便它相应地为每个url提供完整的路径?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-14 16:58:32

这对我们来说很好:

api_schema.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from django.conf.urls import include, url

urlpatterns = [
    url(r'^books', ...),
    ...
]

urls.py

代码语言:javascript
复制
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'),
...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58384549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档