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!!!
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 .
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.
J'ai trouvé cette solution en ajoutant
from Django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
après
os.environ.setdefault ...
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'.