webentwicklung-frage-antwort-db.com.de

Django: AppRegistryNotReady ()

Python: 2,7; Django: 1,7; Mac 10.9.4

Ich folge dem Tutorial von Tango mit Django

In Kapitel 5 erfahren Sie, wie Sie ein Populationsskript erstellen, mit dem automatisch einige Daten für die Datenbank erstellt werden können, um die Entwicklung zu vereinfachen.

Ich habe eine populate_rango.py auf derselben Ebene wie manage.py erstellt.

Hier ist die populate_rango.py:

import os

def populate():
    python_cat = add_cat('Python')

    add_page(
        cat=python_cat,
        title="Official Python Tutorial",
        url="http://docs.python.org/2/tutorial/"
    )

    add_page(
        cat=python_cat,
        title="How to Think like a Computer Scientist",
        url="http://www.greenteapress.com/thinkpython/"
    )

    add_page(
        cat=python_cat,
        title="Learn Python in 10 Minutes",
        url="http://www.korokithakis.net/tutorials/python/"
    )

    Django_cat = add_cat("Django")

    add_page(
        cat=Django_cat,
        title="Official Django Tutorial",
        url="https://docs.djangoproject.com/en/1.5/intro/tutorial01/"
    )

    add_page(
        cat=Django_cat,
        title="Django Rocks",
        url="http://www.djangorocks.com/"
    )

    add_page(
        cat=Django_cat,
        title="How to Tango with Django",
        url="http://www.tangowithdjango.com/"
    )

    frame_cat = add_cat("Other Frameworks")

    add_page(
        cat=frame_cat,
        title="Bottle",
        url="http://bottlepy.org/docs/dev/"
    )

    add_page(
        cat=frame_cat,
        title="Flask",
        url="http://flask.pocoo.org"
    )

    for c in Category.objects.all():
        for p in Page.objects.filter(category=c):
            print "- {0} - {1}".format(str(c), str(p))


def add_page(cat, title, url, views=0):
    p = Page.objects.get_or_create(category=cat, title=title, url=url, views=views)[0]
    return p


def add_cat(name):
    c = Category.objects.get_or_create(name=name)[0]
    return c

if __== '__main__':
    print "Starting Rango population script..."
    os.environ.setdefault('Django_SETTINGS_MODULE', 'tangle.settings')
    from rango.models import Category, Page
    populate()

Dann renne ich python populate_rango.py Auf dem Terminal auf der Ebene von manage.py wird AppRegistryNotReady () ausgelöst:

Django.core.exceptions.AppRegistryNotReady

Dann habe ich gegoogelt und etwas gefunden wie this :

Standalone scripts¶
If you’re using Django in a plain Python script — rather than a management command — and you rely on the Django_SETTINGS_MODULE environment variable, you must now explicitly initialize Django at the beginning of your script with:

>>> import Django
>>> Django.setup()
Otherwise, you will hit an AppRegistryNotReady exception.

Und ich habe immer noch keine Ahnung, was ich tun soll, kann jemand helfen? Danke!!!

36
user2988464

Wenn Sie Ihre Django Projektanwendungen in eigenständigen Skripten verwenden, ohne manage.py Zu verwenden, müssen Sie zuerst Django.setup() manuell aufrufen Konfigurieren Sie die Protokollierung und, was wichtig ist - füllen Sie Apps Registry .

Zitat aus Initialisierungsprozess docs:

installieren()

Diese Funktion wird automatisch aufgerufen:

  • Wenn Sie einen HTTP-Server über die WSGI-Unterstützung von Django betreiben.

  • Beim Aufrufen eines Verwaltungsbefehls.

Es muss in anderen Fällen explizit aufgerufen werden, zum Beispiel in einfachen Python Skripten.

In Ihrem Fall müssen Sie setup() manuell aufrufen:

if __== '__main__':
    print "Starting Rango population script..."
    os.environ.setdefault('Django_SETTINGS_MODULE', 'tangle.settings')

    import Django
    Django.setup()

    populate()

Dieses Problem wird auch im Abschnitt Fehlerbehebung ausführlich beschrieben.

55
alecxe

Ich bin gerade über das gleiche Problem auf meinem lokalen Entwicklungsserver gestolpert.

Nach dem Einlesen eines geänderten Codes wurde der Fehler ausgelöst. Das Problem hier hat offensichtlich nichts mit wsgi zu tun, also habe ich versucht, manage.py auszuführen

Eine einfache: python manage.py enthüllt die wahre Fehlerursache.

In meinem Fall ein vergessener Import einer externen Django App.

Vielleicht hilft das jemand anderem.

3
normic

Ich fand diese Lösung und fügte hinzu

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

nach

os.environ.setdefault ...
2
Valentin Kantor

Ich habe dieses Problem auch mit Django 1.7 auf einem Apache-Server festgestellt. Ändern des wsgi -Handleraufrufs in meinem wsgi.py Datei hat das Problem behoben:

import Django.core.handlers.wsgi
application = Django.core.handlers.wsgi.WSGIHandler()

Dies wurde vorgeschlagen hier von Benutzer 'jezdez'.

1
Chris Wood