我正在使用Django 1.4官方版本在Django网站上工作。我的网站有一些应用程序。其中一个应用程序的模型名为Campaign
,其他应用程序中的模型具有FK。正如Django引用(https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey)中所建议的,我选择使用字符串而不是字符串定义FK字段相关的模型类本身,因为我希望在下一个版本中有循环引用,这种方法避免了循环导入问题。
当我使用BitNami djangostack 1.4(Apache,mod_wsgi,MySQL)在AWS(亚马逊网络服务)上部署网站时,我部署的网站在大多数情况下都能正常工作。在显示Campaign
模型的表单的页面上,Django在尝试创建依赖于Campaign
模型的外键字段的表单字段时引发了异常,抱怨相关模型未加载。有趣/可怕的是,当我将settings.DEBUG
设置为True(绝对不是我们在网站上线后我们想要的东西),问题不再发生!
当我在我的本地Django开发服务器上测试时,该网站运行良好,并且使用部署在我的Windows工作站上的相同BitNami djangostack也能很好地工作。
以下是我在AWS控制台上看到的相关Apache错误输出。
[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
所以,这是一个快速回顾:
我理解错误意味着什么,但我不明白为什么正在发生,即为什么没有加载依赖模型。有没有人遇到类似的问题,或者有什么建议可以帮助我修复它?
注意:我尝试向Google发送错误消息,但我发现的只是引发该错误的Django源代码。我还尝试搜索更多常规查询,例如mod_wsgi django related model
,但我找不到任何与我的问题相关的内容。
答案 0 :(得分:7)
好吧,我在Graham Dumpleton的博客文章中找到了解决我问题的方法(http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html)
简而言之,Django开发服务器在启动时验证模型(解决基于字符串的关系),并且在Ubuntu上使用DEBUG = False的BitNami djangostack下使用mod_wsgi时可能没有完成该操作。非常具体的条件,我知道 - 但G. Dumpleton的'固定'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()
答案 1 :(得分:1)
我遇到了这个问题,正在考虑按照建议修改wsgi.py。然后一位同事建议只需在INSTALLED_APPS中重新排序应用程序,嘿,它无需触摸wsgi.py即可正常工作。