drf-yasg предоставляет неправильные пути к URI - PullRequest
1 голос
/ 15 октября 2019

В моем приложении мне нужно иметь несколько страниц Swagger с сгруппированными конечными точками для нескольких клиентов.

Один из моих клиентов (путей) предоставляет API мобильного приложения, другой - API веб-клиента. Шаблоны URL хранятся в 2 различных urls.py соответственно.

Я использую drf-yasg для создания схемы для моего API.

Для создания спецификации swaggerдля тех, кто я инициализирую 2 отдельных schema_views для каждого urls.py файла, например:

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, все конечные точки вернут ошибку 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/

Очевидно, что можно тестировать API напрямую черезswagger очень важно, так чтоСамо по себе n недостаточно в моем случае.

Это проблема во мне, неправильно конфигурирующая swagger itlesf, или я должен как-то указывать путь к swagger, чтобы он соответственно указывал полный путь к каждому URL?

1 Ответ

1 голос
/ 14 ноября 2019

Для нас это нормально:

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'),
...
...