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. 先前所述,您可能需要考虑将虚拟环境置于顶级目录中。然而,我觉得上面提到的是 运行 该教程的好方法,而无需对其示例进行大量更改。
希望这对您有所帮助!
我正在尝试在 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. 先前所述,您可能需要考虑将虚拟环境置于顶级目录中。然而,我觉得上面提到的是 运行 该教程的好方法,而无需对其示例进行大量更改。 希望这对您有所帮助!