index.wsgi 在 root 中找不到 virtualenv

index.wsgi not finding virtualenv in root

我正在尝试在 Apache VPS 上安装一个 django 站点,然后 tutorial
我的 index.wsgi 应该在根目录中激活一个 virtualenv,它看起来像这样:

import os
import sys
import site

# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('~/.virtualenvs/DBENV/local/lib/python2.7/site-packages')

# Add the app's directory to the PYTHONPATH
sys.path.append('/home/DB2015/')
sys.path.append('/home/DB2015/davidcms/')

os.environ['DJANGO_SETTINGS_MODULE'] = 'davidcms.settings'

# Activate your virtual env
activate_env=os.path.expanduser("~/.virtualenvs/DBENV/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

我收到这个错误

[Tue Feb 17 07:13:30.701511 2015] [:error] [pid 16103:tid 140396130674432]           [client 217.44.75.146:58169]     execfile(activate_env, dict(__file__=activate_env))
[Tue Feb 17 07:13:30.701653 2015] [:error] [pid 16103:tid 140396130674432] [client 217.44.75.146:58169] IOError: [Errno 2] No such file or directory: '/var/www/.virtualenvs/DBENV/bin/activate_this.py'

所以它在 var/www/ 而不是根目录中查找。当我尝试将 os.path.expanduser 更改为根目录中 .virtualenvs 的路径时:

# Activate your virtual env
activate_env= "~/.virtualenvs/DBENV/bin/activate_this.py"
execfile(activate_env, dict(__file__=activate_env))

它仍然说

[Tue Feb 17 07:17:12.019641 2015] [:error] [pid 16104:tid 140396206208768] [client 217.44.75.146:58200]     execfile(activate_env, dict(__file__=activate_env))
[Tue Feb 17 07:17:12.019852 2015] [:error] [pid 16104:tid 140396206208768] [client 217.44.75.146:58200] IOError: [Errno 2] No such file or directory: '~/.virtualenvs/DBENV/bin/activate_this.py'

我错过了什么?!

大概 Apache 不是 运行 和你一样,而是作为它自己的用户,所以它不会使用你的主目录。

无论如何,您真的不应该将代码放在主目录中。选择一个标准位置 - 例如一个新的顶级目录,如 /srv,或 /var/sites,或其他。

这似乎是一个相对较新的问题或可能是一个错误??除了一些最近的帖子(也许还有一两个错误报告),我找不到任何与 David 和我遇到的问题相关的帖子。

我使用 virtualenvwrapper 来管理我的 VE, 熟悉它的人都知道,您可以通过导航到类似“~/.virtualenvs/whaterver”的目录来访问 VE。

根据 this~/(波浪号斜杠):波浪号是 Linux "shortcut" 表示用户的主目录。

这意味着您还可以通过导航到“/home/username/.virtualenvs/”(这是 wsgi 正在寻找的绝对路径)来访问 VE。

[WSGI 配置]

通过像这样修改 index.wsgi 文件,我能够将我的 Django 欢迎页面设为 运行:

    ------------
    # Changed From:

    # Add the site-packages of the chosen virtualenv to work with
    site.addsitedir('~/.virtualenvs/myprojectenv/local/lib/python2.7/site-packages')

    # Activate your virtual env 
    activate_env=os.path.expanduser("~/.virtualenvs/myprojectenv/bin/activate_this.py")

    ------------
    # Changed To:

    # Add the site-packages of the chosen virtualenv to work with
    site.addsitedir('/home/username/.virtualenvs/myprojectenv/local/lib/python2.7/site-packages')

    # Activate your virtual env 
    activate_env=os.path.expanduser('/home/username/.virtualenvs/myprojectenv/bin/activate_this.py') 

重要:按照我在此处列出的相同方式进行设置时,您必须不要指定 wsgi在你的 django 项目的 settings.py 文件中(似乎是在从 django-admin 创建新项目时自动生成的)。在我的系统上,当两个文件都被加载时,我无法从 Django 获得响应,我的浏览器会无限期地挂起并显示 "loading",并且没有消息被发布到 apache error.log 文件,尽管 "some" 如果 debug=true,来自 django 的错误将进入浏览器。所以如果你在 settings.py:

中有这样一行
  • WSGI_APPLICATION = 'myproject.wsgi.application'

确保将其注释掉或将其删除(我花了一两个小时才注意到冲突)

[更新旧示例]

但是我 运行 遇到了从我的 wsgi 文件生成的问题。如果您收到类似于以下内容的错误: "AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time."

这是我在尝试使用此过程为 Apache 配置 Django 时收到的错误:

  • Deploy Django on Apache with Virtualenv and mod_wsgi.

    #Make sure you are not doing this
    import django.core.handlers.wsgi
    application = django.core.handlers.wsgi.WSGIHandler()
    
    #And rather you should be doing this
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    

根据这个django document,这是(现在)构建 wsgi 文件的正确方法。

[文件权限]

为您的 Django 项目目录中的所有文件设置正确的组和所有权也是一个好主意。 对于我正在配置的 VE,我更愿意同时保留所有权和组作为用户。

这可以通过 运行 命令来完成:

  • sudo chown -R 用户名/home/django_projects/myproject
  • sudo chgrp -R 用户名/home/django_projects/myproject

[我的规格]

  • Ubuntu 服务器 14.10
  • 阿帕奇 2.4.10
  • Django 1.7.4

[我的 apache 配置]

我已经配置了一个虚拟主机,所以我可以从本地网络上的端口 8080 访问我的 django 应用程序。这也允许我通过配置 WSGIPythonHome 指令来设置我的 VE python 的路径。此外,我 运行 wsgi 在守护进程模式下使用 WSGIDaemonProcess 指令来指定守护线程应该 运行 作为哪个用户。

#My awesome django app's apache config
WSGIPythonHome /home/username/.virtualenvs/myprojectenv #This is important and sets the path that apache/wsgi uses to the virtualenv's python.
<VirtualHost *:8080>
        #ServerAdmin [email protected]
        ServerName mydomain.com
        #ServerAlias www.mydomain.com

        #Must run as daemon so the delegated process can inherit the virtualenvs user 
        WSGIDaemonProcess SomeProcessGroupName user=username group=username processes=2 threads=5 home=/var/www/my-site.com/
        WSGIProcessGroup SomeProcessGroupName 
        WSGIScriptAlias / /var/www/my-site.com/index.wsgi

        Alias /static /var/www/my-site.com/static/
        <Location "/static/">
            #Options -Indexes
        </Location>
</VirtualHost>

[我的目录结构]

|
|_var
|   |_www
|       |_my-site.com
|           |_index.wsgi
|           |_static
|               |_css
|               |_js
|_home
|   |_django_projects
|   |   |_projectbase
|   |       |_myproject
|   |       |   |_myproject
|   |       |       |_settings.py
|   |       |
|   |       |_templates
|   |
|   |_username
|       |_.virtualenvs
|           |_myprojectenv
|               |_bin
|                   |_activate_this.py
|_etc
    |_apache2
        |_apache2.conf

[我的python路径]

# Printed from python console in my virtual environment

/home/username/.virtualenvs/myprojectenv/lib/python2.7
/home/username/.virtualenvs/myprojectenv/lib/python2.7/plat-x86_64-linux-gnu
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-tk
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-old
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-dynload
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/home/username/.virtualenvs/myprojectenv/local/lib/python2.7/site-packages
/home/username/.virtualenvs/myprojectenv/lib/python2.7/site-packages


# printed to the apache log from within settings.py

/home/username/.virtualenvs/myprojectenv/lib/python2.7',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/plat-x86_64-linux-gnu',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-tk',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-old',
/home/username/.virtualenvs/myprojectenv/lib/python2.7/lib-dynload',
/usr/lib/python2.7',
/usr/lib/python2.7/plat-x86_64-linux-gnu',
/usr/lib/python2.7/lib-tk',
/home/username/.virtualenvs/Horizon_Server_Env/local/lib/python2.7/site-packages',
/home/django-projects/projectbase/myproject',
/home/django-projects/projectbase/myproject/myproject'

[夏天]

我已经根据 David 和我使用的教程将 Django 配置为 运行 期间我所采取的一些步骤进行了记录。正如我之前所述,我的应用程序 运行s 在本地网络上(在端口 8080 上)并且无法访问互联网。所以这个配置是为了我的需要,可能不符合你的安全要求(尽管我很想得到其他人对这个问题的意见!!)。正如 Daniel R. 先前所述,您可能需要考虑将虚拟环境置于顶级目录中。然而,我觉得上面提到的是 运行 该教程的好方法,而无需对其示例进行大量更改。 希望这对您有所帮助!