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

时间:2017-01-10 11:56:00

标签: python django django-rest-framework

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

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

1 个答案:

答案 0 :(得分:8)

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

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

    [...]

如果您搜索exclude_from_schema的当前文档,则会找到一个匹配here,其中记录了@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)

    [...]

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