web-dev-qa-db-fra.com

Django: AppRegistryNotReady ()

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

Je suis le tutoriel de Tango avec Django

Au chapitre 5, le didacticiel explique comment créer un script de population, qui peut automatiquement créer 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 __== '__main__':
    print "Starting Rango population script..."
    os.environ.setdefault('Django_SETTINGS_MODULE', 'tangle.settings')
    from rango.models import Category, Page
    populate()

Ensuite, je lance python populate_rango.py au niveau du terminal au niveau de manage.py, AppRegistryNotReady () est levé:

Django.core.exceptions.AppRegistryNotReady

Ensuite, je l'ai recherché sur Google, j'ai trouvé quelque chose comme 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.

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

36
user2988464

Si vous utilisez vos applications de projet Django dans des scripts autonomes, en d'autres termes, sans utiliser manage.py - vous devez appeler manuellement Django.setup() en premier - ce serait configurer la journalisation et, ce qui est important - remplir registre des applications .

Citation de processus d'initialisation docs:

installer()

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'une commande de gestion.

Il doit être appelé explicitement dans d'autres cas, par exemple dans des scripts simples Python.

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

if __== '__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 .

55
alecxe

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

Après avoir extrait du code modifié, l'erreur a été renvoyée. Le problème ici n'a évidemment rien à voir avec wsgi, j'ai donc essayé d'exécuter manage.py

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

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

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

3
normic

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
Valentin Kantor

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

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

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

1
Chris Wood