django.core.exceptions.AppRegistryNotReady: 应用程序尚未加载。(Django 2.0.1)(Python 3.6)

59

这是我第一次尝试将一个Django应用(django 2.0.1)(Python 3.6)部署到pythonanywhere,它是一个简单的作品集应用程序,没有模型,没有bootstrap。只有Django、HTML、CSS和Javascript。

从Github repo中拉取到pythnanywhere上的bash控制台后,我运行:

python manage.py migrate

& was hit with this error :

Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-
packages/django/core/management/__init__.py", line 371, in 
execute_from_command_line
utility.execute()
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-
packages/django/core/management/__init__.py", line 365, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-
packages/django/core/management/__init__.py", line 216, in fetch_command
klass = load_command_class(app_name, subcommand)
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-
packages/django/core/management/__init__.py", line 36, in load_command_class
module = import_module('%s.management.commands.%s' % (app_name, name))
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 978, in _gcd_import
File "<frozen importlib._bootstrap>", line 961, in _find_and_load
File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 655, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-
packages/django/core/management/commands/migrate.py", line 12, in <module>
from django.db.migrations.autodetector import MigrationAutodetector
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-
packages/django/db/migrations/autodetector.py", line 11, in <module>
from django.db.migrations.questioner import MigrationQuestioner
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-
packages/django/db/migrations/questioner.py", line 9, in <module>
from .loader import MigrationLoader
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-packages/django/db/migrations/loader.py", line 8, in <module>
from django.db.migrations.recorder import MigrationRecorder
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 9, in <module>
class MigrationRecorder:
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-packages/django/db/migrations/recorder.py", line 22, in MigrationRecorder
class Migration(models.Model):
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-packages/django/db/models/base.py", line 100, in __new__
app_config = apps.get_containing_app_config(module)
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-packages/django/apps/registry.py", line 244, in get_containing_app_config
self.check_apps_ready()
File "/home/Limerin555/.virtualenvs/projectenv/lib/python3.6/site-packages/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文件中:

import django
django.setup()

在这行下面:
SECRET_KEY = os.environ.get("SECRET_KEY")

此帖子所建议的,但没有成功。

这是我的settings.py文件:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATE_DIR = os.path.join(BASE_DIR, "templates")
STATIC_DIR = os.path.join(BASE_DIR, "static")

SECRET_KEY = os.environ.get('SECRET_KEY')

import django
django.setup()

DEBUG = False

ALLOWED_HOSTS = ["limerin555.pythonanywhere.com"]

INSTALLED_APPS = [
    'django.contrib.contenttypes',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'portfolio_showcase',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'limerin.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [TEMPLATE_DIR,],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'limerin.wsgi.application'


DATABASE_PATH = os.path.join(BASE_DIR, 'db.sqlite3')

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': DATABASE_PATH,
    }
}


AUTH_PASSWORD_VALIDATORS = [
    {
    'NAME': 
'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 
'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 
'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 
'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Singapore'

USE_I18N = True

USE_L10N = True

USE_TZ = True


STATIC_URL = '/static/'
STATICFILES_DIRS = [
    STATIC_DIR,
]

我真的很困惑,希望有人能够帮忙解决这个问题并指出实际存在的问题。

2
你的 portfolio_showcase 应用程序或根 URL 配置中可能有引起问题的内容。请勿将 django.setup() 添加到设置中。 - Alasdair
2
我遇到了相同的问题 - 我的问题是未设置环境变量 - 使用Django Environ和PostgreSQL但是DATABASE_URL没有被设置 - 解决办法是设置好这个变量。 - Jamie Czuy
1
我曾经见过这个错误。如果我没记错的话,它与一个迁移文件有关,该文件依赖于第三方模块的迁移。我没有正确定义迁移依赖关系。 - tarequeh
20个回答

57

刚刚解决了类似的问题。

你只需要这个:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project.settings")

接下来是这些代码:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

之后,您可以轻松地导入模型,无需出现AppRegistryNotReady: Apps aren't loaded yet.的错误提示。

更新:这确切地是项目文件夹中wsgi.py文件中的4行代码。

对于Django 3.0,需要一个额外的变量来解决同步/异步混淆:

os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"

5
这两行代码对我的情况足够了。我将它们添加到 projectname/projectname/__init__.py 中,以便在我的应用程序中的任何内容之前始终被执行。 - Aapo Rista
1
由于这4行代码对应于wsgi.py文件的内容(如答案中所述),因此您也可以在任何独立的Python文件中执行import your_project.wsgi.py,以启动Django模块。(例如,对于尝试片段非常有用) - Rabarberski
那两行代码在我的情况下也足够了,即 "from django.core.wsgi import get_wsgi_application" 和 "application = get_wsgi_application()"。我必须将这两行代码放在导致错误的导入行之上。 - Rick Graves

34

请运行check django-admin命令,查看是否检测到任何错误。

python manage.py check

和/或

django-admin check

在我的情况下,是一个空的 SECRET_KEY 环境变量。 - Masci
7
一条非常无用的消息,针对一个不存在的秘钥。 - diek
如果python manage.py check运行正常,但django-admin check抱怨某些常量未设置,比如USE_I18N,我们该怎么办? - WebComer
在我的情况下,运行此代码会引发完全相同的“应用程序未加载”错误 - 哈。 - Brian C
1
这个答案的+1似乎不够。谢谢。 - B. Mohammad

8

我的问题是在运行设置之前尝试导入。这是我的解决方案:在设置之后进行导入:

import django

# some variable declarations    
world_mapping = {
    'osm_id': 'osm_id',
}    

if __name__ == '__main__':
    django.setup()
    # import AFTER setup
    from app.models import WorldBorder
    # from now I can access WorldBorder!!

2
这刚刚结束了两小时的挣扎。非常感谢你。 - kmjb
1
这可能是一个愚蠢的问题,但我需要把这段代码放在哪里? - fpaekoaij
这是一个关于如何导入django配置并使用它的示例。所以你可以在自己的Python文件中使用此代码段,例如如果你需要运行自己的测试或编写一个小的“一次性”代码片段(导入某些东西或其他)。 - Olivier Pons

7

Django文档指出,django.setup将从settings.py文件中加载设置作为其第一个操作,因此在settings.py中运行它似乎是一个坏主意。

尝试逐个注释掉INSTALLED_APPS中的应用程序 - 您可能会发现其中一个由于某种原因未加载。一旦您知道它是哪一个,就可以找出问题所在。


3

在您的wsgi.py或asgi.py中,根据情况添加以下行

在任何其他内容之前都要有这些行

import os 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')

import django
django.setup()

这是我个人认为的正确答案。 - Psymon25

3
只需在 ready() 方法内导入即可:
def ready(self):
    print('Sent From ready')
    from django.db.models.signals import post_save
    from yourapp.api.signals import post_save_user_receiver
    post_save.connect(post_save_user_receiver, sender=settings.AUTH_USER_MODEL)

2

我在使用Django 2.0时遇到了类似于“应用程序尚未加载”的问题。

问题起因于在def ready()之外导入模块。

from django.apps import AppConfig

from django.contrib.auth.models import User
from django.db.models.signals import post_delete
from .signals import post_delete_msg

class ProductionAppConfig(AppConfig):
    name = 'production_app'

    def ready(self):
        post_delete.connect(post_delete_msg, sender=User)

将导入语句移到def ready()中解决了问题。

from django.apps import AppConfig
    
class ProductionAppConfig(AppConfig):
    name = 'production_app'

    def ready(self):
        from django.contrib.auth.models import User
        from django.db.models.signals import post_delete
        from .signals import post_delete_msg
        post_delete.connect(post_delete_msg, sender=User)
        

2

如果有帮助的话:我的问题是我在应用程序文件夹的__init__文件中导入了一些类、函数和变量。

清空__init__文件后,它按预期工作。


2
import django
django.setup()

这对我有用...我尝试了所有的方法,在最后一刻,这两行代码解决了我的问题。


1

出现此错误可能有多种原因,但所有原因都与 project/settings.py 文件相关。

  1. 检查是否已在其中初始化了 SECRET_KEY
  2. 检查是否将应用程序添加到了 INSTALLED_APPS 中并且未被安装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接