我在使用Apache和mod_wsgi的生产服务器上运行django项目时出现问题。这个错误发生在我启动apache并第一次去网站或从其他地方去的时候:
> / _的ImportError 例外值:无法导入名称MyName
例外位置/var/www/projectname/appname/somemodule.py
当我重新加载页面时,错误消失,网站正常工作。另一点是,这个错误是有选择地发生的,有时候不会出现。
在项目中我使用没有项目名称前缀的导入(我的意思是'来自accounts.models导入帐户'而不是'来自projectname.accounts.models导入帐户')。
在开发(manage.py runserver)服务器上,所有工作都没有任何问题。
我使用了apache和wsgi脚本配置的许多变体,但问题没有解决。
这是我当前的projectname.wsgi:
#!/usr/bin/env python
import os, sys, re
sys.path.append('/var/www/projectname')
sys.path.append('/var/www')
os.environ['PYTHON_EGG_CACHE'] = '/var/www/projectname/.python-egg'
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
以下是apache config的一些部分:
<VirtualHost ip:80>
ServerAdmin admin@server.com
DocumentRoot /var/www
ServerName www.projectname.com
WSGIScriptAlias / "/var/www/projectname/projectname.wsgi"
WSGIDaemonProcess projectname threads=5 maximum-requests=5000
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
....
此外,我还使用单独的虚拟主机进行SSL
我希望有人帮助我。
谢谢!
答案 0 :(得分:0)
我添加了一个类似的问题,原因是'当前目录'是'www'而不是root项目目录。
答案 1 :(得分:0)
在django开发服务器中,根据您当前正在使用的项目设置服务器环境。这就是为什么在转移到Apache时会发生导入错误。
使用import时“从projectname.appname.models导入MyModel”。尽可能地发表意见。
在您的案例“/ var / www”中使用sys.path.append('location / to / your_project_foler /')
只是一个建议:
还尝试在另一个url中设置django而不是root。尝试在站点根目录上运行django时,我也遇到了类似的问题,即: WSGIScriptAlias /&lt;一些网址&gt; “/var/www/projectname/projectname.wsgi”
答案 2 :(得分:0)
当我遇到这个问题时,这篇文章https://stackoverflow.com/a/10601523/1782780向我指出了答案:我在链中的某个模块中有一个错误。
正如Michal在那篇文章中解释的那样:
Python不只是从
administrative/models.py
文件中选择一个类。相反,Python解释器读取整个文件,创建模块对象,从新模块命名空间中的导入文件执行代码,然后将名称Contract从新模块的命名空间复制到当前命名空间。因此,虽然您似乎只从模块中导入一个类,但该模块中的任何地方错误都可能阻止成功导入 - 在您的情况下,类ContractForm会出错。其余的追溯详细说明了该类究竟出了什么问题。
所以回顾一下你的追溯,你可能会发现你的问题。