Django: AppRegistryNotReady()

Python: 2.7; Django: 1.7; Mac 10.9.4

Je suis le tutoriel de Tango avec Django

Au chapitre 5, le tutoriel enseigne comment créer un script de population, qui peut créer automatiquement des données pour la base de données pour faciliter le développement.

J'ai créé un populate_rango.py au même niveau de manage.py.

Voici le 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 __name__ == '__main__':
    print "Starting Rango population script..."
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'tangle.settings')
    from rango.models import Category, Page
    populate()

Ensuite, je cours python populate_rango.py au terminal au niveau de manage.py, AppRegistryNotReady() est soulevé:

django.core.exceptions.AppRegistryNotReady

, Puis je l'ai googlé, a trouvé quelque chose comme ce:

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.

Et je n'ai toujours aucune idée de ce que je dois faire, quelqu'un peut-il aider? Thx!!!

35
demandé sur user2988464 2014-07-17 05:13:01

4 réponses

Si vous utilisez vos applications de projet django dans des scripts autonomes, en d'autres termes, sans utiliser manage.py - vous devez d'abord appeler manuellement django.setup() - Il configurerait la journalisation et, ce qui est important-remplir apps registry .

Citation de processus d'Initialisation docs:

Configuration ()

Cette fonction est appelée automatiquement:

  • Lors de l'exécution D'un serveur HTTP via le support WSGI de Django.

  • Lors de l'appel d'un gestion de la commande.

Il doit être appelé explicitement dans d'autres cas, pour instance dans les scripts Python simples.

Dans votre cas, vous devez appeler setup() manuellement:

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

    import django
    django.setup()

    populate()

En outre, ce problème est décrit en détail dans la section dépannage .

50
répondu alecxe 2014-07-17 01:29:40

Je suis juste tombé sur le même problème dans mon serveur de développement local.

Après avoir tiré du code modifié, l'erreur a été levée. Le problème ici n'a évidemment rien à voir avec wsgi, alors j'ai essayé de courir manage.py

Un simple: python manage.py révèle la cause réelle de l'erreur.

Dans mon cas, une importation oubliée d'une application Django externe.

Peut-être que cela aide quelqu'un d'autre.

3
répondu normic 2016-05-09 12:53:09

J'ai trouvé cette solution, en ajoutant

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

Après

os.environ.setdefault ...
2
répondu Valentin Kantor 2014-10-03 20:39:07

J'ai également rencontré ce problème en utilisant Django 1.7 sur un serveur Apache. Changer l'appel du gestionnaire wsgi dans mon fichier wsgi.py a résolu le problème:

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

Ceci a été suggéré ici par l'utilisateur "jezdez'.

1
répondu Chris Wood 2015-02-05 18:53:27