0

我在使用 Apache 和 mod_wsgi 的生产服务器上运行 django 项目时遇到问题。当我启动 apache 并第一次访问站点或从其他站点时发生此错误:

ImportError at /
Exception Value: cannot import name MyName
Exception Location /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配置的一些部分:

<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 使用单独的虚拟主机。
我希望有人帮助我。
谢谢!

4

4 回答 4

0

我添加了一个类似的问题,原因是“当前目录”是“www”而不是根项目目录。

于 2011-02-18T16:10:32.243 回答
0

在 django 开发服务器中,服务器环境是根据您正在工作的当前项目设置的。这就是为什么在转移到 Apache 时会发生导入错误的原因。

使用导入时使用“ from projectname.appname.models import MyModel ”。尽可能具体。

在您的情况下使用 sys.path.append('location/to/your_project_foler/') "/var/www"

只是一个建议:

还尝试在另一个 url 中设置 django,而不是 root。尝试在站点根目录上运行 django 时,我也遇到了类似的问题,即:WSGIScriptAlias /< some url > "/var/www/projectname/projectname.wsgi"

于 2011-02-19T22:18:46.297 回答
0

当我遇到这个问题时,这篇文章https://stackoverflow.com/a/10601523/1782780向我指出了答案:我在更上游的模块中有一个错误。

正如米哈尔在那篇文章中解释的那样:

Python 不只是从administrative/models.py文件中选择一个类。相反,Python 解释器读取整个文件,创建模块对象,在新模块命名空间中执行导入文件中的代码,然后将名称 Contract 从新模块的命名空间复制到当前命名空间。因此,尽管您似乎只从模块中导入一个类,但该模块中任何地方的错误都可能阻止成功导入 - 在您的情况下,这是类 ContractForm 的错误。回溯的其余部分详细说明了该类到底出了什么问题。

因此,进一步回顾您的回溯,您可能会发现您的问题。

于 2013-12-05T10:47:34.390 回答
0

在我的情况下,它是过去的剩余目录(仅填充 pyc 编译文件,这可能导致目录卡在不删除的情况下),它与新的 python 文件的名称匹配。

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

为了实现这一点,我花了一半以上的工作时间。

于 2021-10-19T22:39:16.743 回答