我想知道如何使用virtualenv在uWSGI中运行Flask Web应用程序。我有一个uWSGI的全局安装,Flask在我的项目的虚拟环境目录中安装了pip。为什么uWSGI无法找到Flask的functools模块?
在皇帝模式启动uwsgi
当我收到以下错误:
Traceback (most recent call last):
File "/var/www/myapp/MyModule/__init__.py", line 1, in <module>
from flask import Flask
File "/var/www/myapp/environment/lib/python2.7/site-packages/flask/__init__.py", line 17, in <module>
from werkzeug.exceptions import abort
File "/var/www/myapp/environment/lib/python2.7/site-packages/werkzeug/__init__.py", line 20, in <module>
from werkzeug._compat import iteritems
File "/var/www/myapp/environment/lib/python2.7/site-packages/werkzeug/_compat.py", line 3, in <module>
import functools
ImportError: No module named functools
我emperor.ini文件看起来像这样:
[uwsgi]
daemonize = /var/log/uwsgi/emperor.log
touch-logreopen = /etc/uwsgi/logrotate.trigger
emperor = /etc/uwsgi/apps-enabled
pidfile = /var/run/uwsgi/emperor.pid
die-on-term = true
我的/ etc/uwsgi/apps-available/myapp.ini文件看起来像这样:
[uwsgi]
socket = 127.0.0.1:9000
wsgi-file = /var/www/myapp/MyModule/__init__.py
virtualenv = /var/www/myapp/environment/
pythonpath = /var/www/myapp/environment/lib/python2.7/site-packages
pythonpath = /var/www/myapp/MyModule/
callable = app
no-site = True
processes = 4
threads = 2
logto = /var/log/uwsgi/myapp.log
该文件被链接到/etc/uwsgi/apps-enabled/myapp.ini
为了完整起见,我使用systemd管理在Debian 7.7的服务,我的启动文件看起来是这样的:
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/apps-enabled --uid www-data --gid www-data
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]t
WantedBy=multi-user.target
我曾尝试:
- 在皇帝模式下运行得到了同样的错误,如皇帝模式下运行
- 使用瓶的嵌入式服务器,这实际上工作得很好
- 在虚拟环境中,它产生的错误,它无法加载不同模块
- 重建VM的python 2.7和python 3.2之间切换,重新安装Debian的,其次详细的nginx + uwsgi +烧瓶导向
- 运行不使用的烧瓶中,一个基本的hello world一个应用程序,它在不改变uwsgi或nginx的配置
- 更改MYAPP.INI使用,并且也省略
no-site
工作得很好;省略它会导致有关无法加载一个模块命名的网站 - 使用MYAPP.INI模块声明,像这样的错误:模块= MyModule的:应用程序,同样的问题
- 改变了应用程序的目录结构,最初使用WSGI的.py外面模块目录(/var/www/myapp/wsgi.py)
- 在网上淘的答案超过7小时了
我该如何解决这个问题呢?
编辑1
我还在就这个问题和我已经删除了no-site
选项,但一直没能得到它超越运行。我最初认为它可能是一个权限问题,从不同的用户创建virtualenv,但在运行chown后,它仍然显示错误ImportError:没有名为站点的模块。
我也尝试创建一个简单的hello world烧瓶应用程序,并把我的你好。py文件在virtualenv目录中,因为我在论坛上看到了这个建议,但没有任何帮助。我设置了no-site = True
,我仍然看到ImportError:没有名为flask的模块。不过,通过激活virtualenv并使用内置的Web服务器运行python hello.py
,应用程序仍能正常运行。
除非你知道你在做什么,否则绝对不要使用no-site。检查uWSGI使用的python版本(它是在初始日志中打印的),它必须与virtualenv相同。如果它们不同,你将得到站点模块错误(这是混合环境时的标准python行为) – roberto
@roberto我激活virtualenv和“linux2上的Python 2.7.3 [GCC 4.7.2]”。我关闭了virtualenv,它和时间戳完全一样。但是,我确实注意到uWSGI说了一些喜欢混合解释模式的东西。系统安装了几个不同版本的Python,但在virtualenv中运行的版本是系统的默认版本。我还用'-p/usr/bin/python2'创建了virtualenv,它链接到python2.7。我原本以为是这样,这将是一个简单的解决方案。我只使用无站点,因为它至少得到了Flask的代码库。 –
激活/关闭venv是无用的(它只在当前会话中设置环境变量)。 uWSGI照顾它。请检查uWSGI使用的python版本,它必须与您的virtualenv相同。 – roberto