我想从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
答案 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
。这些检查还将覆盖您未指定名称空间的包含(例如,在我们的示例中,未在位置中定义名称空间)。