如何覆盖get_swagger_view以使django-rest-swagger显示所有端点?

时间:2018-08-22 17:48:58

标签: django swagger-2.0 django-rest-swagger

默认情况下,django-rest-swagger显示不需要身份验证的视图(在这种情况下为JWT Auth)。 我试图通过在权限类中添加get_swagger_view来覆盖默认的IsAuthenticated快捷方式,以包括也需要身份验证的视图。 但是,这次我访问渲染的文档后,就会得到No operations defined in spec!

如何同时显示需要身份验证和不需要身份验证的视图。

1 个答案:

答案 0 :(得分:0)

您可以使用patch模块中的unittest来解决问题。

在生成模式期间,将根据权限列表为每个视图检查请求对象。我们在permission_classes属性中声明它们,它们通常具有has_permission方法,该方法在生成过程中会被调用。并且如果它引发了某些(exceptions.APIExceptionHttp404PermissionDenied)异常,生成器将跳过该视图。

如果您想修补IsAuthenticated类的方法,可以通过以下方式实现:

from unittest.mock import patch

from rest_framework_swagger.views import get_swagger_view

def patch_the_method(func):
    def inner(*args, **kwargs):
        with patch('rest_framework.permissions.IsAuthenticated.has_permission', return_value=True):
            response = func(*args, **kwargs)
        return response
    return inner

schema_view = patch_the_method(get_swagger_view(title='Some API'))

请注意,这不会在架构中包括具有其他权限的视图。为了避免修补所有权限类,您可以修补SchemaGenerator类中名为has_view_permissions的方法。

方法如下:

...
with patch('rest_framework.schemas.SchemaGenerator.has_view_permissions', return_value=True):
...