生产环境Django应用迁移本地UAT触发AppRegistryNotReady错误求助
AppRegistryNotReady异常的方案 问题描述
我正在将他人开发的生产环境Django项目部署到本地笔记本电脑。已通过Anaconda 3安装Python,配置好必要路径,生产环境中代码运行正常。已安装并按生产环境配置PostgreSQL,执行命令
C:\sites\myanalysis>python manage.py makemigrations时触发如下异常:File "C:\Users\rambo\AppData\Local\Continuum\anaconda3\lib\site-packages\django-2.1-py3.6.egg\django\db\models\base.py", line 90, in __new__ app_config = apps.get_containing_app_config(module) File "C:\Users\rambo\AppData\Local\Continuum\anaconda3\lib\site-packages\django-2.1-py3.6.egg\django\apps\registry.py", line 244, in get_containing_app_config self.check_apps_ready() File "C:\Users\rambo\AppData\Local\Continuum\anaconda3\lib\site-packages\django-2.1-py3.6.egg\django\apps\registry.py", line 127, in check_apps_ready raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.经排查,settings.py中已配置INSTALLED_APPS:
# Application definition INSTALLED_APPS = [ 'project.apps.ProjectConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]且已导入
import psycopg2和import os,求问还可尝试哪些解决方法?
可行的解决方法
确认conda虚拟环境激活状态:先检查你当前命令行是否激活了项目对应的conda虚拟环境——毕竟Anaconda多环境很容易搞混。运行
conda activate your_env_name激活环境后,再重新执行makemigrations。如果还是有问题,试试用虚拟环境的Python绝对路径来运行命令,比如C:\Users\rambo\AppData\Local\Continuum\anaconda3\envs\your_env\python.exe manage.py makemigrations,避免系统默认Python和conda环境冲突。排查settings.py中的提前加载逻辑:
AppRegistryNotReady大多是因为在Django apps加载完成前,就执行了需要访问模型或app配置的代码。仔细检查你的settings.py,看看有没有除了os和psycopg2之外的其他导入,比如是不是直接导入了某个app的models,或者在settings里写了数据库查询、初始化依赖模型的代码?如果有,把这些代码移到AppConfig.ready()方法里,或者放到views、management命令这类后续加载的模块中。验证ProjectConfig的正确性:你在INSTALLED_APPS里用的是
project.apps.ProjectConfig,先确认project/apps.py文件存在,并且里面的类定义没问题,比如:from django.apps import AppConfig class ProjectConfig(AppConfig): name = 'project'如果这个类的
name属性写错了,或者文件缺失,会直接导致app加载失败,触发这个错误。清理并重装依赖:虽然生产环境正常,但本地依赖可能有损坏或版本不匹配的情况。先删掉项目根目录下的
__pycache__文件夹,还有django-2.1-py3.6.egg这个看起来像是手动安装的包,然后用pip install django==2.1重新安装对应版本的Django。如果项目有requirements.txt,也可以把所有依赖重新装一遍:pip install -r requirements.txt。检查数据库连接配置:有时候数据库连接参数错误(比如端口、用户名、密码不对)也会间接导致app加载异常。先确认settings.py里的DATABASES配置正确,比如:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'your_db_name', 'USER': 'your_db_user', 'PASSWORD': 'your_db_pwd', 'HOST': 'localhost', 'PORT': '5432', } }还可以用psycopg2直接写个小脚本测试连接,排除数据库层面的问题。
用其他manage.py命令排查:先试试
python manage.py check,这个命令会检查项目配置和app状态,能给出更具体的错误提示;或者运行python manage.py shell,如果shell能正常启动,说明app加载流程没问题,那问题可能出在makemigrations的特定逻辑上,比如项目里有自定义迁移脚本、或者models里有特殊逻辑导致加载异常。
内容的提问来源于stack exchange,提问作者bobwasmyname

