繁体   English   中英

生产环境中的Django导入错误

[英]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 文件名匹配。

  1. 过去,目录tasks是在模块acme创建的。 在该目录中有__init__.py和其他四个 python 文件。
  2. 一旦请求触及它们,uwsgi 服务pyc为每个 python 文件编译pyc文件。
  3. 很久以后,该目录中的文件和目录从 Git 源中删除。
  4. 然而,因为.pyc文件就位,目录实际上留在服务器上。 (git pull 是增量的,我们不会从零开始提取完整的源)。
  5. 后来(最近,现在)我将一个tasks.py到该文件夹​​中,该文件夹中有这个剩余的tasks目录。
  6. 这使得 uwsgi 引擎无法在没有任何详细原因的情况下从该文件导入任何内容。

意识到这一点的努力花了我超过一半的工作日。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM