Django1.8升级3.2时oauth2_provider导入报app_label错误
问题根因分析
INSTALLED_APPS配置存在语法错误:'corsheaders'末尾缺失逗号,Python会自动将下一行的'app.apps.MyAppConfig'与它拼接为一个字符串,直接导致后续的django.contrib.contenttypes等配置加载异常。INSTALLED_APPS加载顺序错误:django.contrib.contenttypes是Django核心的内容类型框架,必须放在所有依赖它的第三方应用(比如oauth2_provider、admin等)之前加载,你当前把它放在了oauth2_provider、自定义应用之后,导致这些应用导入时contenttypes还没完成注册,就会报app_label不存在的错误。- urls.py导入时机错误:你在urls.py顶部直接导入oauth2_provider的views,此时Django的应用注册流程还没走完,Django3.2对应用初始化顺序的校验比1.8严格很多,就会触发模型未注册的错误。
修复步骤
- 修正
INSTALLED_APPS的语法和顺序,参考配置如下:
INSTALLED_APPS = ( # 核心内置应用统一放在最前面 'django.contrib.contenttypes', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.staticfiles', 'django.contrib.messages', # 第三方应用 'oauth2_provider', 'corsheaders', # 补全缺失的逗号 'app.apps.MyAppConfig', 'dal', 'dal_select2', 'rest_framework', 'rest_framework_swagger', # 自定义业务应用 'main', 'user_management', 'simplewiki', 'reversion', 'django_jenkins', 'django_spaghetti', 'django_extensions', 'debug_toolbar', 'django_celery_monitor', 'query_store' )
- 调整urls.py的导入顺序,把oauth2_provider的导入放在
admin.autodiscover()之后,确保Django完成内置应用注册后再导入依赖模型的视图:
from django.conf import settings from django.contrib import admin admin.autodiscover() # 移到此处导入 import oauth2_provider.views as oauth2_views # 后续urlpattern定义
- 撤销你对
django.contrib.contenttypes源码的修改,该问题完全由配置错误导致,不需要修改依赖包源码。 - 不需要额外给内置模型定义app_label,Django内置应用自带app_label配置,只要正确配置
INSTALLED_APPS的顺序即可自动完成注册。
内容的提问来源于stack exchange,提问作者Het Dagli
相关产品推荐
相关产品推荐

