如何从API文档中排除视图?

Lou*_*uis 5 python django django-rest-framework

我使用django-rest-framework(DRF)来提供我的站点的REST API.据我所知,自动生成API文档依赖于DRF生成的模式.然后可以通过第三方工具解释它以生成漂亮的文档.我用作django-rest-swagger从DRF模式生成漂亮文档的工具,但我怀疑我的问题的解决方案是基于DRF的,独立于我用来将模式转换为"漂亮"的任何工具.

问题是默认情况下,DRF提供整个API的文档,即使它的某些部分确实是我的网站自己的内部目的.我希望从文档中排除一些观点.应始终排除某些观点.仅当查看文档的用户未登录到站点时,才应排除某些视图.

Lou*_*uis 8

这没有很好的记录.在基于类的视图上,您​​可以将exclude_from_schema属性设置为True从文档中排除视图.例:

from rest_framework import viewsets, mixins
class SomeViewSet(mixins...., viewsets.GenericViewSet):
    exclude_from_schema = True

    [...]
Run Code Online (Sandbox Code Playgroud)

如果你搜索当前的文档,exclude_from_schema你会在这里找到一个命中,它记录了@api_view装饰器的参数的存在,这有效地设置了如上所示的属性.虽然DRF的文档中没有提到属性本身.

如果要基于条件排除视图,可以使用@property装饰器使其exclude_from_schema成为计算属性.在幕后,当DRF需要为视图生成模式时,它将使用Request用户浏览到文档页面时生成的对象来实例化该类.因此,您可以进行测试以检查访问文档的用户是否已经过身份验证:

from rest_framework import viewsets, mixins, permissions
class SomeViewSet(mixins...., viewsets.GenericViewSet):
    @property
    def exclude_from_schema(self):
        return not permissions.IsAuthenticated().has_permission(self.request,
                                                                self)

    [...]
Run Code Online (Sandbox Code Playgroud)

self.requestRequest用户要求提供文档时生成的对象.我们使用rest_framework.permissions直接提供的类之一,因为生成模式的代码不使用permission_classes可能设置的属性SomeViewSet.

  • 不建议使用exclude_from_schema。对于基于函数的视图,应使用“ schema = None”和“ @schema(None)”。 (3认同)