Django Swagger未显示没有权限类的URL

4

我正在为我的项目设置Django-rest-swagger。以下是我对Django-restframework的设置。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

现在,当我有一个带有某些权限类的视图时,就像这样:
class CreateUserView(viewsets.ModelViewSet):
    serializer_class = UserServiceSerializer
    authentication_classes = []
    permission_classes = []

class UserProfileView(viewsets.ModelViewSet):

    serializer_class = UserProfileSerializer
    serializer_class_2 = UserServiceSerializer

我看到以下视图

enter image description here

但是当在两个视图中添加permission_classes时,如下所示:
class CreateUserView(viewsets.ModelViewSet):
    serializer_class = UserServiceSerializer
    authentication_classes = []
    permission_classes = []

class UserProfileView(viewsets.ModelViewSet):

    serializer_class = UserProfileSerializer
    serializer_class_2 = UserServiceSerializer
    permission_classes = []

我看到的视图如下所示:

enter image description here

我不想在每个视图中添加权限类,因为我所有的视图都有相同的类,并且我已经在我的rest-framework设置中提到了它。我该怎么办?

2个回答

1
当您将permission_classes设置为[]时,您会清空此视图的默认权限类。
当然,您可以将此行为默认设置为所有视图:
REST_FRAMEWORK = {
    # ...
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
}

但是要小心,这种情况下任何未经授权的用户都可以在您的数据库中创建记录。

如果您不想让这种情况发生,但仍想查看所有操作 - 只需在 Swagger 中单击Authorize按钮,并输入您的令牌或登录名和密码(取决于 SECURITY_DEFINITIONS设置)。


我所提出的问题是,当我在视图中提及某个权限类时,与该视图相关的URL会显示在Swagger中。如果我没有提及任何权限类,这意味着它在我的设置中使用默认权限类,则与该视图相关的URL不会出现在Swagger中。 - Muhammad Hassan
默认情况下,Swagger仅显示开放的公共方法,因为默认情况下它没有任何授权凭据。在第一种情况下,您可以看到来自CreateUserView的URL,因为permission_classes为空且这是一个公共视图,UserProfileView使用默认设置,仅允许授权用户使用您的API。在第二种情况下,您也可以将UserProfileView设置为公共视图。您可以在此处了解更多有关不同权限的信息。 - Anton Shurashov
这是有用的信息。感谢您的帮助。请在您的回答中添加。谢谢。 - Muhammad Hassan

0

看起来您已经应用了默认的权限类使API非公开,因此克服这个问题的一种方法是将"AllowAny"应用为默认权限类,但这样做会使您的所有API都变成公开的。因此,您可以尝试另一种解决方案,即在您的settings.py中设置swagger。

SWAGGER_SETTINGS = {

'SECURITY_DEFINITIONS': {
'api_key': {
    'type': 'apiKey',
    'in': 'header',
    'name': 'Authorization'
}
},

在使用该API时,它将在浏览器中请求令牌。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接