2015-01-03 251 views
1

我想知道如何使用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,應用程序仍能正常運行。

+0

除非你知道你在做什麼,否則絕對不要使用no-site。檢查uWSGI使用的python版本(它是在初始日誌中打印的),它必須與virtualenv相同。如果它們不同,你將得到站點模塊錯誤(這是混合環境時的標準python行爲) – roberto

+0

@roberto我激活virtualenv和「linux2上的Python 2.7.3 [GCC 4.7.2]」。我關閉了virtualenv,它和時間戳完全一樣。但是,我確實注意到uWSGI說了一些喜歡混合解釋模式的東西。系統安裝了幾個不同版本的Python,但在virtualenv中運行的版本是系統的默認版本。我還用'-p/usr/bin/python2'創建了virtualenv,它鏈接到python2.7。我原本以爲是這樣,這將是一個簡單的解決方案。我只使用無站點,因爲它至少得到了Flask的代碼庫。 –

+0

激活/關閉venv是無用的(它只在當前會話中設置環境變量)。 uWSGI照顧它。請檢查uWSGI使用的python版本,它必須與您的virtualenv相同。 – roberto

回答

0

我將系統重新映像到Arch Linux以儘可能多地刪除變量,從源代碼下載並構建uWSGI,開始安裝特定的Python版本,並且實現了Python 3.2不受Flask支持。當我將它安裝在Debian上時,它使用Python 3.2安裝,Arch的軟件包安裝了3.4.2。由於Flask支持3.4.x,所以問題解決了。

至於Python 2.7不工作,我不知道。

相關問題