Django - ImportError:无法为 API 设置导入“drf_yasg.generators.OpenAPISchemaGenerator”

Kri*_* PC 1 django django-rest-framework django-rest-swagger

我正在尝试将https://github.com/axnsan12/drf-yasg这个库添加到我们的 django 应用程序并收到以下错误。

permission_classes=(permissions.AllowAny,),
  File "/env/lib/python3.7/site-packages/drf_yasg/views.py", line 67, in get_schema_view
    _generator_class = generator_class or swagger_settings.DEFAULT_GENERATOR_CLASS
  File "env/lib/python3.7/site-packages/drf_yasg/app_settings.py", line 122, in __getattr__
    val = perform_import(val, attr)
  File "env/lib/python3.7/site-packages/rest_framework/settings.py", line 166, in perform_import
    return import_from_string(val, setting_name)
  File "env/lib/python3.7/site-packages/rest_framework/settings.py", line 180, in import_from_string
    raise ImportError(msg)
ImportError: Could not import 'drf_yasg.generators.OpenAPISchemaGenerator' for API setting 'DEFAULT_GENERATOR_CLASS'. ImportError: cannot import name 'URLPattern' from 'rest_framework.compat' (env/lib/python3.7/site-packages/rest_framework/compat.py).
Run Code Online (Sandbox Code Playgroud)

经过一番研究,我发现有些人建议安装这个包来解决这个问题

pip3 install packaging 
Run Code Online (Sandbox Code Playgroud)

但这没有任何区别。任何其他好的 api 文档库可用于 django rest api?

JPG*_*JPG 5

更新

该问题已在drf-yasg==1.20.0--(Release notes) 中得到修复,以便您可以通过以下方式升级到最新版本

pip install drf-yasg -U
Run Code Online (Sandbox Code Playgroud)

原答案

drf-yasg-(#641) 中有一个未解决的问题来解决这个问题。不幸的是,鉴于自20202 月以来没有任何活动(参考),该项目不再维护。

但是,@JoelLefkowitz创建了该项目的一个分支,它在名为drf-yasg2 中可用,该项目已修复了 OP 的问题。

你需要做的是,迁移drf-yasgdrf-yasg2--(ReadTheDoc)

安装

pip install drf-yasg2
Run Code Online (Sandbox Code Playgroud)

并将其添加到该INSTALLED_APPS部分

INSTALLED_APPS = [
      ...
      'drf_yasg2',
      ...
   ]
Run Code Online (Sandbox Code Playgroud)


Eug*_*kov 2

看起来 DRF 没有rest_framework.compat.URLPattern从 version 开始3.12,并且 drf-yasg 还没有赶上这个。确保您的 DRF 版本低于 3.12。例如:pip install djangorestframework==3.11.2

  • 如果您检查 https://github.com/axnsan12/drf-yasg,它表示它仅支持以下版本的 DRF - 3.8、3.9、3.10、3.11。如果您的代码需要其他版本的 DRF,那么恐怕 drf-yasg 将不适合您。尝试降级,很可能不会导致您的代码损坏。 (2认同)