从Django REST Swagger中排除URL

19 投票
7 回答
16318 浏览
提问于 2025-04-18 04:03

我有一些网址想从我的REST API文档中排除掉。我正在使用Django REST Swagger,但我找到的文档(https://github.com/marcgibbons/django-rest-swagger)并没有给我太多帮助。在settings.py文件中,有一个叫“exclude_namespaces”的设置,但没有详细的解释或使用示例。

简单来说,我想把所有以以下内容开头的网址从文档中排除:

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

我该怎么做呢?

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

7 个回答

4

对于最新版本的 drf-swagger,你可以在生成文档的过程中定义网址模式。

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

6

Ola的回答是对的。exclude_namespaces 这个功能现在已经不再支持了。

如果你想更细致地控制文档,可以通过使用基于函数或基于类的视图来创建自己的模式视图。这在你想为特定的URL模式或URL配置生成文档时会很有用。

在你的 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)

上面的代码只会为在 SchemaGeneratorurlconf 参数中指定的URL生成文档。同时,别忘了也要设置你的 urls.py 文件:

from django.conf.urls import url
from views import SwaggerSchemaView

urlpatterns = [
    url(r'^api/v1/docs/$', SwaggerSchemaView.as_view(), name='docs'),
]
8

在新的Django Swagger版本中,我们不需要再专门创建视图来排除某些网址了。下面的代码可以用来禁用test2这个网址。

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()),
]
19

对于那些觉得上面答案没帮助的人:我猜在新的django swagger版本中,“exclude_namespaces”这个功能可能不再有效。我遇到了差不多的问题(我不想在文档中显示我的内部API),而上面的解决方案对我没用。我找了大约一个小时的解决办法,最后找到了一些有用的信息。

你可以给SchemaGenerator传递一些属性。其中一个是urlconf。你可以把它设置为“yourproject.api.urls”,这样它就只会获取那里定义的URL!当然,你得确保你想从API文档中排除的所有URL都不在那里面。

我希望至少有一个人觉得我的回答有帮助;)。

当你想在API文档中包含多个urls.py时,就会出现问题。我不知道该怎么处理。如果有人对这个新问题有解决办法,欢迎在我的回答下评论。谢谢!

19

要排除的命名空间是在你的 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
}

这里面有详细的说明,可以看看

撰写回答