【问题标题】:Django Swagger not showing urls without permission ClassDjango Swagger 未经许可不显示 url 类
【发布时间】:2025-12-21 19:00:11
【问题描述】:

我正在为我的项目设置 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

我看到下面的视图

但是当像这样在两个视图中添加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 = []

我看到这样的视图

我不想在每个视图中添加权限类,因为我的所有视图都有相同的类,并且我在我的休息框架设置中提到了这一点。我怎样才能做到这一点?

【问题讨论】:

    标签: python django django-swagger


    【解决方案1】:

    当您将permission_classes 设置为[] 时,您会清空该视图的默认权限类。

    当然,您可以默认为所有视图设置此行为:

    REST_FRAMEWORK = {
        # ...
        'DEFAULT_PERMISSION_CLASSES': (
            'rest_framework.permissions.AllowAny',
        ),
    }
    

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

    如果您不想要它,但想查看所有操作 - 只需单击 Swagger 中的 Authorize 按钮并输入您的令牌或登录名和密码(取决于 SECURITY_DEFINITIONS setting)。

    【讨论】:

    • 我问的问题是,当我在我的视图中提到一些权限类时,与该视图相关的 url 会大摇大摆地出现。如果我没有提及任何权限类,这意味着它在我的设置中使用默认权限类,则与该视图相关的 url 不会出现在 swagger 中。
    • 默认情况下,Swagger 仅显示开放的公共方法,因为默认情况下它没有任何授权凭据。在第一种情况下,您会看到来自 CreateUserView 的 url,因为 permission_classes 是空的,这是一个公共视图,UserProfileView 使用默认设置,仅允许授权用户使用您的 api。在第二种情况下,您将UserProfileView 也公开。您可以阅读有关不同权限的更多信息here
    • 这是有用的信息。感谢帮助。请在您的答案中添加。谢谢
    【解决方案2】:

    似乎您已应用默认权限类以使 API 不公开,因此解决此问题的一种方法是将“AllowAny”应用为默认权限类,但这样您的所有 API 都将是公开的,因此您可以尝试另一种解决方案在你的 settings.py 中进行大摇大摆的设置

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

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

    【讨论】: