从Django REST Swagger中排除URL

时间:2014-04-24 08:28:35

标签: python django rest swagger

我想从REST API文档中排除一些网址。我使用Django REST Swagger,我能找到的唯一文档(https://github.com/marcgibbons/django-rest-swagger)并没有真正告诉我什么。有" exclude_namespaces" settings.py中SWAGGER_SETTINGS的一部分,但没有真正的解释或如何使用它的示例。

简单地说,我想从以下开头的文档中排除任何网址:

/api/jobs/status/
/api/jobs/parameters/

我怎么能这样做?

提前感谢您提供的任何帮助:P

5 个答案:

答案 0 :(得分:14)

要排除的名称空间是urls.py中定义的名称空间。

例如,在您的情况下:

urls.py:

internal_apis = patterns('',
                     url(r'^/api/jobs/status/',...),
                     url(r'^/api/jobs/parameters/',...),
                     )

urlpatterns = urlpatterns + patterns('',
              url(r'^', include(internal_apis, namespace="internal_apis")),
              ...
              )

并在您的settings.py中:

SWAGGER_SETTINGS = {
    "exclude_namespaces": ["internal_apis"],    #  List URL namespaces to ignore
}

这是一个很好的描述in there

答案 1 :(得分:5)

奥拉的回答是正确的。我们不再支持exclude_namespaces

为了更好地控制文档,请使用基于函数或基于类的视图创建自己的架构视图。如果您要为特定的URL模式或URL confs生成文档,这将非常有用。

views.py中,您可以执行以下操作:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.schemas import SchemaGenerator
from rest_framework_swagger import renderers

class SwaggerSchemaView(APIView):
    renderer_classes = [
        renderers.OpenAPIRenderer,
        renderers.SwaggerUIRenderer
    ]

    def get(self, request):
        generator = SchemaGenerator(title='Your API Documentation', urlconf='your_app.urls')
        schema = generator.get_schema(request=request)

    return Response(schema)

以上内容仅为urlconf的{​​{1}}参数中指定的URL提供文档。另外,不要忘记设置SchemaGenerator

urls.py

答案 2 :(得分:4)

对于最新版本的drf-swagger,您可以在架构生成器中隐藏url模式。

例如: url_patterns = ( url(r'^api/v1/', include(router.urls, namespace='api')), ) generator = schemas.SchemaGenerator(title='Core API', patterns=url_patterns)

答案 3 :(得分:3)

使用新版本的django swagger,我们不需要创建视图来排除某些网址。下面的代码将禁用test2 url。

from rest_framework_swagger.views import get_swagger_view
urlpatterns1 = [
    url(r'^', include(router.urls)),
    url(r'^test/', include('test.urls')),
    url(r'^test1/', Test2.as_view()),
]

schema_view = get_swagger_view(title='API Documentation', patterns=urlpatterns1)

urlpatterns = urlpatterns1 + [
    url(r'^docs/', schema_view),
    url(r'^test2/', Test2.as_view()),
]

答案 4 :(得分:1)

更灵活的解决方案是:

from django.contrib import admin
from django.urls import include, path
from rest_framework_swagger.views import get_swagger_view
urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/', include('user.urls', namespace="user")),
    path('locations/', include('location.urls')),
    path('departments/', include('department.urls', namespace="department")),
    path('my_secret_api/', include('secret.urls', namespace="secret_api")),
]

to_exclude = ['secret_api',] # some more namespaces here
swagger_urls = [item for item in urlpatterns if hasattr(item,"namespace") and item.namespace not in to_exclude]
schema_view = get_swagger_view(title='Highky', patterns=swagger_urls)
urlpatterns += [
        path('api/docs/', schema_view),
]

urlpatterns将具有所有五个路径,但是swagger_urls将具有四个路径(不包括secret_api)。

您所有的URL和包含项将继续按原样工作,除了我们现在传递了要在Swagger文档中显示的修改后的urlpatterns。这些检查还将覆盖您未指定名称空间的包含(例如,在我们的示例中,未在位置中定义名称空间)。