[英]Django Import errors on production environment
我在使用 Apache 和 mod_wsgi 在生产服务器上运行 django 项目时遇到问题。 当我启动 apache 并第一次访问站点或从其他站点访问时发生此错误:
导入错误在 /
异常值:无法导入名称 MyName
异常位置 /var/www/projectname/appname/somemodule.py
当我重新加载页面时,错误消失并且站点工作正常。 还有一点是这个错误是选择性发生的,有时不会出现。
在项目中,我使用没有项目名称前缀的导入(我的意思是“从帐户.模型导入帐户”而不是“从项目名称.帐户.模型导入帐户”)。
在开发 (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 配置的一些部分:
<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 使用了一个单独的虚拟主机。
我希望有人帮助我。
谢谢!
当我遇到这个问题时,这篇帖子https://stackoverflow.com/a/10601523/1782780将我引向了答案:我在链上更远的模块中有一个错误。
正如Michal在那篇文章中解释的那样:
Python不仅从
administrative/models.py
文件中选择一个类。 相反,Python解释器读取整个文件,创建模块对象,从新模块名称空间中的导入文件执行代码,然后将名称Contract从新模块的名称空间复制到当前名称空间。 因此,尽管您似乎只是从模块中导入一个类,但是该模块中任何地方的错误都可能阻止成功导入-在您的情况下,这是ContractForm类的错误。 其余的追溯详细说明了该类到底出了什么问题。
因此,回头追溯一下,您可能会发现问题。
我添加了一个类似的问题,原因是“当前目录”是“ www”,而不是根项目目录。
在django开发服务器中,服务器环境是根据您正在处理的当前项目设置的。 这就是为什么在转移到Apache时发生导入错误的原因。
使用import时,请使用“ from projectname.appname.models import MyModel”。 尽力而为。
在您的案例“ / var / www”中使用sys.path.append('location / to / your_project_foler /')
只是一个建议:
还要尝试用root以外的另一个URL设置django。 尝试在站点根目录上运行django时,我也遇到了类似的问题,即:WSGIScriptAlias / <一些URL>“ /var/www/projectname/projectname.wsgi”
在我的情况下,它是过去的剩余目录(仅填充了 pyc 编译文件,这可能导致目录卡住而不删除)与新的 python 文件名匹配。
tasks
是在模块acme
创建的。 在该目录中有__init__.py
和其他四个 python 文件。pyc
为每个 python 文件编译pyc
文件。.pyc
文件就位,目录实际上留在服务器上。 (git pull 是增量的,我们不会从零开始提取完整的源)。tasks.py
到该文件夹中,该文件夹中有这个剩余的tasks
目录。意识到这一点的努力花了我超过一半的工作日。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.