从Django REST Swagger中排除URL
我有一些网址想从我的REST API文档中排除掉。我正在使用Django REST Swagger,但我找到的文档(https://github.com/marcgibbons/django-rest-swagger)并没有给我太多帮助。在settings.py文件中,有一个叫“exclude_namespaces”的设置,但没有详细的解释或使用示例。
简单来说,我想把所有以以下内容开头的网址从文档中排除:
/api/jobs/status/
/api/jobs/parameters/
我该怎么做呢?
提前感谢任何提供的帮助 :P
7 个回答
对于最新版本的 drf-swagger,你可以在生成文档的过程中定义网址模式。
比如说:
url_patterns = (
url(r'^api/v1/', include(router.urls, namespace='api')),
)
generator = schemas.SchemaGenerator(title='核心 API', patterns=url_patterns)
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)
上面的代码只会为在 SchemaGenerator
的 urlconf
参数中指定的URL生成文档。同时,别忘了也要设置你的 urls.py
文件:
from django.conf.urls import url
from views import SwaggerSchemaView
urlpatterns = [
url(r'^api/v1/docs/$', SwaggerSchemaView.as_view(), name='docs'),
]
在新的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()),
]
对于那些觉得上面答案没帮助的人:我猜在新的django swagger版本中,“exclude_namespaces”这个功能可能不再有效。我遇到了差不多的问题(我不想在文档中显示我的内部API),而上面的解决方案对我没用。我找了大约一个小时的解决办法,最后找到了一些有用的信息。
你可以给SchemaGenerator传递一些属性。其中一个是urlconf。你可以把它设置为“yourproject.api.urls”,这样它就只会获取那里定义的URL!当然,你得确保你想从API文档中排除的所有URL都不在那里面。
我希望至少有一个人觉得我的回答有帮助;)。
当你想在API文档中包含多个urls.py时,就会出现问题。我不知道该怎么处理。如果有人对这个新问题有解决办法,欢迎在我的回答下评论。谢谢!
要排除的命名空间是在你的 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
}
这里面有详细的说明,可以看看