Django在生产环境中导入错误

时间:2011-02-18 15:32:47

标签: django apache wsgi importerror

我在使用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 我希望有人帮助我。
谢谢!

3 个答案:

答案 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会出错。其余的追溯详细说明了该类究竟出了什么问题。

所以回顾一下你的追溯,你可能会发现你的问题。