2012-03-30 1 views
4

Я работаю на сайте Django, используя официальный выпуск Django 1.4. На моем сайте есть несколько приложений. В одном из приложений есть модель с именем Campaign с FK для моделей в других приложениях. Как было предложено в ссылке Django (https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey), я решил определить поля FK, используя строку вместо потому что я ожидаю, что в следующей версии будут циркулярные ссылки, и такой подход позволит избежать проблем с циклическим импортом.Сайт Django с использованием mod_wsgi на AWS не может создать поле формы FK, потому что связанная модель еще не загружена

Когда я развернул сайт на AWS (Amazon Web Services) с помощью BitNami djangostack 1.4 (Apache, mod_wsgi, MySQL), мой развернутый сайт работал по большей части корректно. На страницах, отображающих формы для модели Campaign, Django создала исключение при попытке создать поле формы, основанное на поле внешнего ключа модели Campaign, жалуясь, что связанная модель не была загружена. Смешная/страшная вещь заключается в том, что когда я установил settings.DEBUG в True (определенно не то, что мы захотим, как только сайт начнет жить), проблема больше не возникает!

Сайт работал отлично, когда я тестировал его на локальном сервере разработки Django, а также отлично работал с использованием того же BitNami djangostack, который был развернут на моей рабочей станции Windows.

Вот соответствующий выход ошибки Apache, который я вижу на консоли AWS.

[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 

Итак, вот краткое резюме:

  1. Мой сайт работает на моем локальном сервере разработки Django, независимо от значения settings.DEBUG
  2. С стек BitNami на моей локальной машине Windows, это работы, независимо от значения settings.DEBUG
  3. с стек BitNami на AWS (Ubuntu), она работает с DEBUG = True , но не с DEBUG = False

Я понимаю, что означает ошибка, но я не понимаю, почему это происходит, то почему зависимая модель не загружена. Кто-нибудь сталкивался с подобной проблемой или имел советы, которые могли бы помочь мне исправить это?

Примечание. Я попытался отправить сообщение об ошибке Google, но все, что я нашел, было исходным кодом Django, в котором эта ошибка была поднята. Я также попытался найти более общие запросы, такие как mod_wsgi django related model, но я не мог найти ничего, что казалось бы имеющим отношение к моей проблеме.

+0

Это приложение связанной модели включено в 'INSTALLED_APPS'? –

+0

Да, все приложения моего сайта находятся в 'INSTALLED_APPS'. Отличается ли порядок приложений? – mbargiel

+1

Одна из ссылок, которые я нашел во время работы в Интернете, - http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html. Я не уверен, что это может мне помочь или нет, но я посмотрю на это. – mbargiel

ответ

7

Хорошо, я нашел решение моей проблемы в сообщении блога Грэмом Дамплтоном (http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html).

Короче говоря, сервер разработки Django проверяет модели (которые разрешают строковые отношения) при запуске, и эта операция, вероятно, не была выполнена при использовании mod_wsgi под BitNami djangostack на Ubuntu с DEBUG = False. Очень специфические условия, я знаю, но «фиксированный» код mod_wsgi Г. Дамплтона решил проблему для меня.

Это то, что мой wsgi.py выглядит сейчас:

#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

К сожалению, у меня такая же проблема, однако в моем случае это происходит, когда у меня DEBUG установлен True. И ваш wsgi.py не работает над моим экземпляром. [Здесь] (https://github.com/django/django/blob/master/django/db/models/fields/related.py#L1009) строка в коде django, которая вызывает исключение. –

+0

Это решение работает и для Heroku, если у людей возникают проблемы с развертыванием на нем и происходит одна и та же ошибка. – tsurantino

1

Я имел только эту проблему, и смотрел на изменение wsgi.py как это было предложено.Затем коллега предложил просто переупорядочить приложения в INSTALLED_APPS, и, hey presto, он работает без необходимости касаться wsgi.py.

+0

Было бы здорово, если бы вы могли указать, как вы перенаправили их, чтобы исправить проблему, т. Е. Переместив какое приложение, где оно было разрешено. Я уверен, что это может помочь другим людям, столкнувшимся с такой же проблемой. – mbargiel

+0

Итак, ошибка была «Невозможно создать поле формы для« xyz », так как связанная с ним модель« abc »еще не загружена». Я просто переместил приложение, содержащее abc, перед приложением, содержащим xyz. – DaveB

+0

Я думаю, что ваша проблема была иной, чем моя (хотя симптом был похож). Моя проблема заключалась в том, что в определенной среде он работал только тогда, когда settings.DEBUG был установлен на True, поэтому, очевидно, это не проблема с заказом приложения. В конце концов, я обнаружил, что оболочка wsgi не всегда проверяла модели (в зависимости от DEBUG) при запуске, поэтому попытка импортировать модель, зависящую от модели из другого приложения, не удалась, потому что мои модели приложений не были проанализированы вообще (независимо от порядка INSTALLED_APPS). Вот почему мое исправление заключалось в том, чтобы явно добавить проверку модели в мой wsgi.py. – mbargiel