【问题标题】:Authenticating Swagger API docs (drf-yasg)验证 Swagger API 文档 (drf-yasg)
【发布时间】:2018-07-19 03:48:06
【问题描述】:

我已经设置了DRF-YASG,但无法弄清楚如何配置它以显示需要身份验证的视图。

下面是配置。

  schema_view = get_schema_view(
      openapi.Info(
        title="Swagger Doc",
        default_version='v1',
        description="Test description",
        terms_of_service="https://www.google.com/policies/terms/",
        contact=openapi.Contact(email="contact@snippets.local"),
        license=openapi.License(name="BSD License"),
      ),
      validators=['flex', 'ssv'],
      permission_classes=(permissions.AllowAny,),  # If I change the permission it throws an exception. See below
      public=False,
      patterns=public_apis,
  )

public_apis 是我希望人们在通过身份验证后看到的 API。

使用上述配置,它不会显示单个 API。它只显示Authorize 按钮和显示No operations defined in spec! 的文本。但是,如果我将 public=False 更改为 public=True,那么它会显示所有 API。

PS:之前我使用的是Django Rest Swagger,我能够将其配置为仅在提供 JWT 令牌后才显示 API。

Am 正在使用 JWT 进行身份验证。

权限更改例外:

另一个问题是,如果我将上面的权限更改为 DRF Permission 类,渲染将失败并出现以下错误:

  Internal Server Error: /swagger/
  Traceback (most recent call last):
    File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
      response = get_response(request)
    File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 217, in _get_response
      response = self.process_exception_by_middleware(e, request)
    File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 215, in _get_response
      response = response.render()
    File "/usr/local/lib/python3.6/site-packages/django/template/response.py", line 107, in render
      self.content = self.rendered_content
    File "/usr/local/lib/python3.6/site-packages/rest_framework/response.py", line 72, in rendered_content
      ret = renderer.render(self.data, accepted_media_type, context)
    File "/usr/local/lib/python3.6/site-packages/drf_yasg/renderers.py", line 54, in render
      self.set_context(renderer_context, swagger)
    File "/usr/local/lib/python3.6/site-packages/drf_yasg/renderers.py", line 62, in set_context
      renderer_context['title'] = swagger.info.title
  AttributeError: 'dict' object has no attribute 'info'
  Internal Server Error: /swagger/

我尝试将其更改为 permmissions.IsAuthenticated 和我自己的自定义权限类,但它们都失败并出现相同的错误。

【问题讨论】:

    标签: django django-rest-framework drf-yasg


    【解决方案1】:

    原来问题是我在 DRF 的 DEFAULT_AUTHENTICATION_CLASSES 中缺少 rest_framework.authentication.SessionAuthentication

    所以通过Django Admin登录视图登录后发送的请求对象没有用户,所以所有权限类一直失败,然后会导致上述错误。

    所以在添加后 drf-yasg 显示了它所有的荣耀。

    错误:

    虽然发生这种情况时引发的错误已作为错误提出。见#issue58

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 2022-12-14
      • 2018-10-24
      • 1970-01-01
      • 2021-07-27
      • 2019-07-27
      • 1970-01-01
      • 2021-11-09
      • 2021-01-10
      相关资源
      最近更新 更多