【问题标题】:Setting up Django on an internal server (os.environ() not working as expected?)在内部服务器上设置 Django(os.environ() 没有按预期工作?)
【发布时间】:2010-09-20 10:07:28
【问题描述】:

我正在尝试在公司内部服务器上设置 Django。 (没有外部连接到 Internet。)

查看服务器设置文档,“Running Django on a shared-hosting provider with Apache”方法似乎最有可能在这种情况下工作。

这是服务器信息:

  • 无法安装mod_python
  • 没有root权限
  • 服务器是 SunOs 5.6
  • Python 2.5
  • Apache/2.0.46
  • 我已经使用 --prefix option 安装了 Django(和 flup)(再次阅读我可能应该使用 --home,但目前它似乎并不重要)

here 所述,我已将.htaccess 文件和mysite.fcgi 文件添加到我的Web 根目录中。 当我从服务器运行 mysite.fcgi 脚本时,我得到了预期的输出(正确的站点 HTML 输出)。但是,尝试从浏览器访问它时不会。

似乎PYTHONPATH 设置有问题,因为我使用的是前缀选项。

我注意到,如果我从命令行运行 mysite.fcgi 而不设置 PYTHONPATH 环境变量,则会引发以下错误:

prompt$ python2.5 mysite.fcgi 
 ERROR:
 No module named flup   Unable to load
 the flup package.  In order to run
 django   as a FastCGI application, you
 will need to get flup from  
 http://www.saddi.com/software/flup/  
 If you've already   installed flup,
 then make sure you have it in your
 PYTHONPATH.

我已将 sys.path.append(prefixpath)os.environ['PYTHONPATH'] = prefixpath 添加到 mysite.fcgi,但如果我设置在命令行中环境变量为空然后运行mysite.fcgi,我仍然得到上述错误。

以下是一些命令行结果:

>>> os.environ['PYTHONPATH'] = 'Null'
>>>
>>> os.system('echo $PYTHONPATH')
Null
>>> os.environ['PYTHONPATH'] = '/prefix/path'
>>>
>>> os.system('echo $PYTHONPATH')
/prefix/path
>>> exit()
prompt$ echo $PYTHONPATH
Null

看起来 Python 正在设置变量 OK,但该变量仅适用于脚本内部。 Flup 似乎以 .egg 文件的形式分发,我的猜测是,至少在通过 --prefix 选项安装时,egg 实现没有考虑os.environ['key'] = value (?) 添加的变量。

我对 .pth 文件不太熟悉,但似乎 easy-install.pth 文件是指向 Flup 的文件:

import sys; sys.__plen = len(sys.path)
./setuptools-0.6c6-py2.5.egg
./flup-1.0.1-py2.5.egg
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sy
s.path[p:p]=new; sys.__egginsert = p+len(new)

看起来它正在做一些时髦的事情,无论如何要编辑它或在我的代码中添加一些东西以便它会发现错误?

【问题讨论】:

    标签: python django apache


    【解决方案1】:

    在您的设置中,您必须指向实际的 egg 文件,而不是 egg 文件所在的目录。它应该类似于:

    sys.path.append('/path/to/flup/egg/flup-1.0.1-py2.5.egg')
    

    【讨论】:

      【解决方案2】:

      尝试使用名为virtualenv 的实用程序。根据官方包页面,“virtualenv 是一个创建隔离 Python 环境的工具。”

      它将为您处理 PYTHONPATH 的内容,并让正确安装 Django 和 Flup 变得容易。

      【讨论】:

        【解决方案3】:

        使用 site.addsitedir() 而不是 os.environ['PYTHONPATH'] 或 sys.path.append()。

        site.addsitedir 解释 .pth 文件。修改 os.environ 或 sys.path 不会。反正不在 FastCGI 环境中。

        #!/user/bin/python2.6
        
        import site
        
        # adds a directory to sys.path and processes its .pth files
        site.addsitedir('/path/to/local/prefix/site-packages/')
        
        # avoids permissions error writing to system egg-cache
        os.environ['PYTHON_EGG_CACHE'] = '/path/to/local/prefix/egg-cache'
        

        【讨论】:

          【解决方案4】:

          要从 python 脚本修改 PYTHONPATH,您应该使用:

          sys.path.append("prefixpath")
          

          试试这个,而不是用 os.environ() 修改。

          我建议使用 mod_python 运行 Django,而不是使用 FastCGI...

          【讨论】:

          • 我也在添加 sys.path.append("prefixpath"),但是如果不在命令行上添加 ENV 选项,我仍然会收到 Flup PYTHONPATH 错误。不幸的是,我没有安装 mod_python 所需的权限:P
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-23
          • 2013-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-22
          • 2016-03-15
          相关资源
          最近更新 更多