旧的Python 2.7仍然用于我的Django应用程序而不是虚拟环境

时间:2016-12-13 08:24:25

标签: python django

所以,我的CentOS机器上有两个不同版本的Python - 2.7和3.4。我想要的是简单地使用Python 3.4运行我的Django应用程序而不是旧的过时垃圾。为此,我创建了一个虚拟环境,以便我的文件夹结构现在看起来像这样

\vwrapper
    \bin
    \include
    \lib
    \lib64
    ...

我使用Python 3.4创建了这个虚拟环境。之后我像这样激活了这个环境:

 $ source vwrapper/bin/activate
 (vwrapper) [root@...]

所以,我清楚地看到,我现在在这个虚拟环境中。我现在甚至可以检查,确实我使用的是python 3.4:

(vwrapper) [root@...] # python --version 
Python 3.4.5

在这个阶段一切都很好看。然后我安装了django:

(vwrapper) [root@...] # pip install django

再次没问题。在\ vwrapper \ bin中,我现在可以看到一些django工具。然后我使用其中一个工具来创建我的第一个django应用程序:

(vwrapper) [root@...] # bin/django-admin startproject accent

看起来不错。我去wsgi.py做了一点修改:

import os, sys
path = '/var/www/vwrapper/accent'
if path not in sys.path:
    sys.path.append(path)

然后我去settings.py并进行一些修正:

ALLOWED_HOSTS = ['*']

大!唯一还有待完成的是apache虚拟主机。所以,我创建了这个虚拟主机并重新启动apache:

(vwrapper) [root@...] # apachectl restart

优秀!当我在浏览器中访问此主机时,我看到了我的第一个Django应用程序。到现在为止还挺好。但问题是,我看到使用旧的Python 2.7,我通过返回浏览器sys.version检查它:

def index(request):
    return HttpResponse(sys.version)   

这样,当我再次重新启动apache并转到此页面时,我在浏览器中看到此消息:

2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]

到底是什么?我尝试通过添加

来解决它
#!/usr/bin/python3.4

到每个.py脚本,但它没有帮助。我希望有人知道这可能有什么问题。我花了两天时间才能完成所有工作,但我仍然遇到了麻烦。我不知道我错过了什么。谢谢!

PS。这就是我的虚拟主机配置在Apache中的样子:

<VirtualHost *:8080>
    ServerName django.localhost
    WSGIScriptAlias / "/var/www/vwrapper/accent/accent/wsgi.py"
    <Directory "/var/www/vwrapper/accent/accent">
        Options +ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

所以,正如你所看到的,我没有在这个配置中提到Python,但可能我应该(但是,我不确切知道如何)。

修改

我对我的虚拟主机配置进行了一些更正,因此它看起来像:

WSGIPythonPath /var/www/vwrapper/accent:/var/www/vwrapper/lib/python3.4/site-packages
<VirtualHost *:8080>
    ServerName django.localhost
    WSGIScriptAlias / "/var/www/vwrapper/accent/accent/wsgi.py"
    <Directory "/var/www/vwrapper/accent/accent">
        Options +ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

我还编辑了我的wsgi.py脚本:

import site
site.addsitedir('/var/www/vwrapper/lib/python3.4/site-packages')

重启Apache,但无济于事。似乎我做了十几步使用Python 3.4,但仍然错过了一个秘密步骤。

3 个答案:

答案 0 :(得分:2)

WSGIScriptAlias / "/var/www/vwrapper/accent/accent/wsgi.py"

您正在使用mod_wsgi来运行Python。您是否使用编译为使用Python 3的mod_wsgi?

例如,在Ubuntu上,存在使用Python 2的包libapache2-mod-wsgi和使用Python 3的libapache2-mod-wsgi-py3。但我不了解CentOS。

如果您可以自己编译mod-wsgi,请参阅https://modwsgi.readthedocs.io/en/develop/user-guides/installation-issues.html#multiple-python-versions

答案 1 :(得分:0)

您必须确保您的Apache正在访问正确的virtualenv。 Activate仅适用于当前shell。很可能你的Apache有一个配置文件以某种方式将你的请求映射到你的应用程序。

答案 2 :(得分:0)

在两个Python版本的相同设置中,我正在使用wsgi.py,它正常工作。你在wsgy.py中激活了virtualenv吗?我认为问题来自这个文件。与你的比较。

import os, site, sys

# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('~/virtualenvs/projectenv/local/lib/python3.5/site-packages')

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

# Assign settings module for starting
os.environ['DJANGO_SETTINGS_MODULE'] = 'project.settings'

# Activate your virtual env
activate_env=os.path.expanduser("/home/ubuntu/virtualenvs/projectenv/bin/activate_this.py")
exec(open(activate_env).read())

# Load environ variables
from prepare_server import prepare_server
prepare_server()

application = get_wsgi_application()