內容已過期,分割線以下為原文存檔。
故事背景
這次我需要將一個Flask應用部署到本地的Windows服務器上。操作系統是64位的,程序是基於Python 3開發的,大體就是這樣。
部署選項
根據Flask的部署指南,可供選擇的方式還是蠻多的,IIS、Apache、nginx……
本着享受生活不折騰的原則,我們應該選擇標准的、方便的、用戶多的技術。
再按照頁面上的提示,“Just remember that your Flask application object is the actual WSGI application“,於是,mod_wsgi(Apache)就成了我的不二選擇。
Running mod_wsgi on Windows
在Windows上運行Apache with mod_wsgi需要一些技巧。
有4點是必須嚴格遵守的:
- 不能混用32位和64位的文件
- 安裝Python時要選擇“Install for all users”
- 構建Apache使用的編譯器版本要與構建Python的一致
- 構建mod_wsgi使用的編譯器版本要與構建Python的一致
下載
mod_wsgi的下載地址是https://github.com/GrahamDumpleton/mod_wsgi/releases,但不是每一次更新都有預編譯好的二進制文件。
我使用的是mod_wsgi 4.4.12,對應的Python是3.3.5或者3.4.2。
Apache的下載地址是https://www.apachelounge.com/download/VC10/,我使用64位的版本。
安裝
安裝Python時要選擇“Install for all users”。另外,自定義項目里的“Add python.exe to Path”也最好選上。
把Apache24文件夾解壓縮到c:\Apache24。(因為配置文件里是默認的這個路徑,如果要放在別的地方,就自己修改下相應的配置)
ps.為了方便排錯,可以在這里先測試一下Apache是否正常。運行httpd.exe,然后訪問http://localhost/,如果沒有問題應該可以看到測試頁。
把mod_wsgi-py34-VC10.so復制到c:\Apache24\modules目錄下,文件名改成mod_wsgi.so,然后把
LoadModule wsgi_module modules/mod_wsgi.so
添加到配置文件(httpd.conf)里。
測試
將測試文件保存為c:\mydir\myapp.wsgi
1 def application(environ, start_response): 2 status = '200 OK' 3 output = b'Hello World!' 4 5 response_headers = [('Content-type', 'text/plain'), 6 ('Content-Length', str(len(output)))] 7 start_response(status, response_headers) 8 9 return [output]
在配置文件里添加:
1 <VirtualHost *:80> 2 WSGIScriptAlias /myapp c:\mydir\myapp.wsgi 3 <Directory c:\mydir> 4 Require all granted 5 </Directory> 6 </VirtualHost>
重新運行httpd.exe,然后訪問http://localhost/myapp,看到Hello World!就說明安裝成功了。
部署Flask應用
使用pip安裝Flask:
pip install flask
把Flask例程保存為c:\mydir\hello.py
1 from flask import Flask 2 app = Flask(__name__) 3 4 @app.route("/") 5 def hello(): 6 return "Hello World!" 7 8 if __name__ == '__main__': 9 app.run()
mod_wsgi要求WSGI應用的入口叫“application”,所以我們還需要創建一個.wsgi文件來做轉換。把下面的代碼保存為c:\mydir\myapp.wsgi
1 import sys 2 sys.path.insert(0, 'c:\\mydir') 3 from hello import app as application
將c:\mydir加入系統環境的Path變量是為了確保我們的hello模塊可以被解釋程序找到。
重啟Apache,查看一下配置好的成果吧。
擴展閱讀
Working with Virtual Environments