为什么uWSGI无法找到Flask的functools模块?

时间:2015-01-03 11:47:15

标签: python nginx flask debian uwsgi

我想知道如何使用virtualenv在uWSGI中运行Flask Web应用程序。我有一个uWSGI的全局安装,Flask在我的项目的虚拟环境目录中安装了pip。

在emperor模式下启动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

我尝试过:

  • 未在emperor模式下运行会出现与在emperor模式下运行相同的错误
  • 使用Flask的嵌入式服务器,实际上工作正常
  • 在虚拟环境中切换python 2.7和python 3.2,产生了无法加载不同模块的错误
  • 重建虚拟机,重新安装Debian,按照详细的nginx + uwsgi + flask指南进行操作
  • 运行一个不使用Flask的应用程序,这是一个基本的hello世界,它在没有更改uwsgi或nginx配置的情况下运行良好
  • 更改myapp.ini以使用并省略no-site;省略它会导致无法加载名为site
  • 的模块的错误
  • 使用myapp.ini模块声明如下:module = MyModule:app,同样的问题
  • 更改应用程序目录结构,最初使用模块目录外的wsgi.py(/var/www/myapp/wsgi.py)
  • 现在在互联网上搜索超过7个小时的答案

我该如何解决这个问题?

编辑1

我还在努力解决这个问题,但我已经删除了no-site选项,但却无法让它超越它。我最初认为从一个不同的用户创建virtualenv可能是一个权限问题,但是在运行chown之后它仍然显示 ImportError:No module named site 的错误。

我还尝试创建一个简单的hello world Flask应用程序并将我的 hello.py 文件放在virtualenv目录中,因为我在论坛中看到了这个建议,它没有帮助。我设置no-site = True,我仍然看到 ImportError:没有名为flask的模块。尽管如此,通过激活virtualenv并使用内置Web服务器运行python hello.py,应用程序运行良好。

1 个答案:

答案 0 :(得分:0)

我将系统重新映像到Arch Linux以删除尽可能多的变量,从源代码下载和构建uWSGI,开始安装特定的Python版本并实现了Flask所支持的Python 3.2。当我在Debian上安装它时,它安装了Python 3.2,Arch的软件包安装了3.4.2。由于Flask支持3.4.x,因此问题得以解决。

就Python 2.7不起作用而言,我不知道。