index.wsgi没有在root中找到virtualenv

时间:2015-02-17 12:22:50

标签: django apache virtualenv wsgi

我正在尝试在这个tutorial之后在Apache VPS上安装一个django站点 我的index.wsgi应该在root中激活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'

我缺少什么?!

2 个答案:

答案 0 :(得分:0)

可能Apache并没有像你一样运行,而是作为自己的用户运行,所以它不会使用你的主目录。

无论如何,你不应该把你的代码放在主目录中。选择一个标准位置 - 例如/srv/var/sites等新的顶级目录。

答案 1 :(得分:0)

这似乎是一个相对较新的问题或可能是一个错误?除了最近的一些帖子(也许是一两个错误报告)之外,我找不到任何与大卫和我正在经历的问题相关的帖子。

我使用virtualenvwrapper来管理我的VE, 任何熟悉它的人都知道,你可以通过导航到像“〜/ .virtualenvs / whaterver”这样的目录来访问VE。

根据this〜/(代字号斜杠):代字号是Linux“快捷方式”,表示用户的主目录。

这意味着你也可以通过导航到“/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') 

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

  • WSGI_APPLICATION ='myproject.wsgi.application'

请务必将其评论或删除它(在我发现冲突之前,我花了一两个小时的头发撕裂)

[更新旧示例]

然而,我确实遇到了从我的wsgi文件生成的问题。如果您收到类似于的错误: “AppRegistryNotReady:在应用程序注册表准备好之前,无法初始化转换基础结构。请确保在导入时不要进行非延迟的gettext调用。”

这是我在尝试使用此过程为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 username / home / django_projects / myproject
  • sudo chgrp -R username / home / django_projects / myproject

[我的规格]

  • Ubuntu server 14.10
  • Apache 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的经验中所采取的一些步骤。正如我之前所说,我的应用程序在本地网络上运行(在端口8080上)并且无法访问互联网。所以这个配置是我的需求,可能不符合你的安全要求(虽然我很想得到其他人对该主题的意见!)。如前所述,Daniel R.您可能需要考虑将您的虚拟环境定位在顶级目录中。但是我觉得上面提到的是一个运行该教程的好方法,而不必对他们的示例做很多改动。 希望这会有所帮助!