2012-03-30 4 views
4

Ich arbeite an einer Django-Site mit der offiziellen Django 1.4-Version. Meine Website hat ein paar Apps. Eine der Apps hat ein Modell mit dem Namen Campaign mit FKs, um in den anderen Apps zu modellieren. Wie in der Django-Referenz (https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey) vorgeschlagen, habe ich mich entschieden, die FK-Felder mit einer Zeichenfolge statt der zu definieren verwandte Modellklassen selbst, da ich in der nächsten Version zirkuläre Referenzen erwarte, und dieser Ansatz vermeidet zirkuläre Importprobleme.Django-Website mit mod_wsgi auf AWS kann kein FK-Formularfeld erstellen, da das zugehörige Modell noch nicht geladen wurde

Als ich die Site auf AWS (Amazon Web Services) mit dem BitNami djangostack 1.4 (Apache, mod_wsgi, MySQL) bereitgestellt habe, funktionierte meine bereitgestellte Site größtenteils korrekt. Auf Seiten, die Formulare für das Campaign-Modell anzeigen, hat Django beim Erstellen eines Formularfelds, das auf einem Fremdschlüsselfeld des Modells Campaign basiert, eine Ausnahme ausgelöst, da das betreffende Modell nicht geladen wurde. Das lustige/Gruselige ist, dass wenn ich settings.DEBUG auf True setze (definitiv nicht etwas, das wir wollen, sobald die Seite online geht), tritt das Problem nicht mehr auf!

Die Seite funktionierte perfekt, als ich sie auf meinem lokalen Django-Entwicklungsserver ausprobierte, und sie funktionierte auch perfekt mit dem gleichen BitNami-Djangostack, der auf meiner Windows-Workstation installiert war.

Hier ist die relevante Apache-Fehlerausgabe, die ich auf der AWS-Konsole sehe.

[error] ERROR :: Internal Server Error: /campaigns/ 
[error] Traceback (most recent call last): 
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/core/handlers/base.py", line 101, in get_response 
[error]  request.path_info) 
    ... (django/wsgi blah blah) 
[error] File "/opt/bitnami/apps/django/django_projects/Project/campaign/views.py", line 5, in <module> 
[error]  from forms import CampaignForm 
[error] File "/opt/bitnami/apps/django/django_projects/Project/campaign/forms.py", line 12, in <module> 
[error]  class CampaignForm(forms.ModelForm): 
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/forms/models.py", line 206, in __new__ 
[error]  opts.exclude, opts.widgets, formfield_callback) 
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/forms/models.py", line 160, in fields_for_model 
[error]  formfield = f.formfield(**kwargs) 
[error] File "/opt/bitnami/apps/django/lib/python2.6/site-packages/django/db/models/fields/related.py", line 1002, in formfield 
[error]  (self.name, self.rel.to)) 
[error] ValueError: Cannot create form field for 'reward' yet, because its related model 'reward.Reward' has not been loaded yet 

So, hier ist eine kurze Zusammenfassung:

  1. Meine Website funktioniert auf meinem lokalen Django Entwicklungs-Server, unabhängig von settings.DEBUG Wert
  2. Mit dem BitNami Stapel auf meinem lokalen Rechner unter Windows, Arbeiten, unabhängig von settings.DEBUG Wert
  3. mit dem BitNami-Stack auf AWS (Ubuntu), funktioniert es mit DEBUG = True aber nicht mit DEBUG = false

Ich verstehe was der Fehler bedeutet, aber ich verstehe nicht, warum es vorkommen, das heißt, warum das abhängige Modell nicht geladen ist. Ist jemand jemals auf ein ähnliches Problem gestoßen oder hat er Ratschläge, die mir helfen könnten, das Problem zu beheben?

Hinweis: Ich habe versucht, Google die Fehlermeldung, aber alles, was ich fand, war der Django-Quellcode, wo dieser Fehler ausgelöst wurde. Ich habe auch versucht, nach allgemeineren Abfragen wie mod_wsgi django related model zu suchen, aber ich konnte nichts finden, das für mein Problem relevant schien.

+0

Ist die zugehörige App in 'INSTALLED_APPS' enthalten? –

+0

Ja, alle Apps meiner Site befinden sich in 'INSTALLED_APPS'. Spielt die Reihenfolge der Apps eine Rolle? – mbargiel

+1

Einer der Links, die ich beim googlen gefunden habe, ist http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html. Ich bin mir nicht sicher, ob es mir helfen kann oder nicht, aber ich werde es mir ansehen. – mbargiel

Antwort

7

In Ordnung, ich fand eine Lösung für mein Problem in einem Blogbeitrag von Graham Dumpleton (http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html).

Kurz gesagt, validiert der Django-Entwicklungsserver beim Starten die Modelle (die stringbasierte Beziehungen auflösen), und diese Operation wurde wahrscheinlich nicht ausgeführt, wenn mod_wsgi unter dem BitNami-Djangostack auf Ubuntu mit DEBUG = False verwendet wurde. Sehr spezifische Bedingungen, ich weiß - aber G. '' fixed 'mod_wsgi Code von G. Dumpleton hat das Problem für mich gelöst.

Dies ist, was mein wsgi.py jetzt aussieht:

#wsgi.py 

#make sure the folder containing the apps and the site is at the front of sys.path 
#maybe we could just define WSGIPythonPath in django.conf file...? 
project_root = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) 
if project_root not in sys.path: 
    sys.path.insert(0, project_root) 

#set the DJANGO_SETTINGS_MODULE environment variable (doesn't work without this, despite what G. Dumpleton's blog post said) 
site_name = os.path.basename(os.path.dirname(__file__)) 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "%s.settings" % site_name) 

#new code - fixes inter-app model dependencies 
from my_site import settings 
import django.core.management 
django.core.management.setup_environ(settings) # mimic manage.py 
utility = django.core.management.ManagementUtility() 
command = utility.fetch_command('runserver') 
command.validate() # validate the models - *THIS* is what was missing 

#setup WSGI application object 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 
+0

Leider habe ich das gleiche Problem, aber in meinem Fall passiert es, wenn ich DEBUG auf True gesetzt habe. Und wsgi.py von dir arbeitet nicht an meiner Instanz. [Hier ist] (https://github.com/django/django/blob/master/django/db/models/fields/related.py#L1009) eine Zeile im Django-Code, die eine Ausnahme aufwirft. –

+0

Diese Lösung funktioniert auch für Heroku, wenn bei der Bereitstellung Probleme auftreten und derselbe Fehler auftritt. – tsurantino

1

ich gerade dieses Problem hatte und war auf der Suche zu modifizieren wsgi.py wie vorgeschlagen.Dann schlug ein Kollege vor, die Apps einfach in INSTALLED_APPS neu zu ordnen und, hey presto, es funktioniert, ohne die wsgi.py zu berühren.

+0

Es wäre großartig, wenn Sie angeben könnten, wie Sie sie neu geordnet haben, um das Problem zu beheben, d. H., Welche App wurde wo gelöst. Ich bin mir sicher, dass es anderen Menschen helfen könnte, die mit dem gleichen Problem konfrontiert sind. – mbargiel

+0

Also, der Fehler war 'Kann Formularfeld für' xyz 'noch nicht erstellen, weil das zugehörige Modell' abc 'noch nicht geladen wurde'. Ich habe gerade die App, die abc enthielt, vor die App mit xyz verschoben. – DaveB

+0

Ich denke, dein Problem war anders als meines (obwohl das Symptom ähnlich war). Mein Problem war, dass es in einer bestimmten Umgebung nur funktionierte, wenn settings.DEBUG auf True gesetzt wurde. Es war also offensichtlich kein App-Bestellproblem. Am Ende stellte ich fest, dass der wsgi-Wrapper die Modelle (je nach DEBUG) beim Start nicht immer validierte. Der Versuch, ein Modell zu importieren, das von einem Modell einer anderen App abhing, schlug fehl, weil meine App-Modelle überhaupt nicht analysiert wurden (unabhängig von der Bestellung INSTALLED_APPS). Deshalb bestand meine Lösung darin, die Modellüberprüfung explizit in meine wsgi.py einzufügen. – mbargiel

Verwandte Themen