在 Windows 平臺部署基於 Python 的網站是一件非常折騰的事情,Linux/Unix 平臺下有很多選擇,本文記錄了 Flask 部署到 IIS 的主要步驟,希望對你有所幫助。
涉及工具和平臺
- Windows 7 x64
- Python 3.4+
- Flask
完成 Hello Flask 網站
這是一個最簡單的 Flask 網站:
1 2 3 4 5 6 7 8 9 10 |
# hello.py from flask import Flask app=Flask(__name__) @app.route('/',methods=['GET']) def index(): return "Hello Flask!" if __name__=='__main__': app.run(debug=True) |
執行python hello.py
後沒有錯誤說明你的 Python 環境一切正常,可以繼續後面的步驟。
安裝 IIS,啟用 CGI
在控制皮膚中找到開啟或者關閉 Windows 功能,安裝 IIS 和 CGI,如下圖。
安裝 URL 重寫元件
IIS 需要安裝 URL 重寫元件,這個可以通過Microsoft Web Platform Installer來安裝。下載Microsoft Web Platform Installer後執行,搜尋url
,分別安裝。
注:據說 Windows10 上的 IIS 10 現在不支援 url 重寫?待驗證
安裝 wfastcgi
通過pip就可以安裝:
1 |
pip install wfastcgi |
啟用 wfastcgi
剩下的事情就只有一些配置了。首先以管理員身份執行wfastcgi-enable
來在IIS上啟用wfastcgi,這個命令位於c:python_dirscripts
,也就是你需要確保此目錄在系統的PATH裡,或者你需要cd到這個目錄後再執行。
1 2 |
# cd to python_dirscripts if it is not in PATH wfastcgi-enable |
記住命令執行成功後返回的資訊:
1 2 3 |
C:Python34Scripts> wfastcgi-enable Applied configuration changes to section "system.webServer/fastCgi" for "MACHINE/WEBROOT/APPHOST" at configuration commit path "MACHINE/WEBROOT/APPHOST" "C:Python34python.exe|C:Python34libsite-packageswfastcgi.py" can now be used as a FastCGI script processor |
“C:Python34python.exe|C:Python34libsite-packageswfastcgi.py” 在下文的配置檔案中需要使用。
Tips: 使用命令 wfastcgi-disable
可以將其移除。
建立 web.config 檔案
下面是一個web.config
檔案的例子,你只需要修改對應部分就可以使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <handlers> <!-- scriptProcessor 的值來自命令列工具 wfastcgi-enable --> <add name="FlaskFastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python34\python.exe|C:\Python34\lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" /> </handlers> <security> <!-- URL 重寫中的特殊字元,比如加號+等等 --> <requestFiltering allowDoubleEscaping="true"></requestFiltering> </security> </system.webServer> <appSettings> <!-- Required settings --> <!-- 在這裡指定Falsk app在模組中的具體位置 --> <add key="WSGI_HANDLER" value="hello.app" /> <add key="PYTHONPATH" value="~/" /> <!-- Optional settings --> <!-- 需要先建立日誌目錄,否則報錯 --> <add key="WSGI_LOG" value="C:\logs\oboeqa_web.log" /> <add key="WSGI_RESTART_FILE_REGEX" value="" /> </appSettings> </configuration> |
配置 IIS 目錄及許可權
假設你的 Flask 程式將部署在 C:websitehello 下面,那麼你的目錄結構大致如此。
1 2 3 4 |
C:WEBSITE └───hello hello.py web.config |
現在你需要讓IIS使用者擁有訪問和執行你的網站指令碼的許可權,進入 C:website 目錄,執行下面兩條命令:
1 2 3 |
cd C:website icacls . /grant "NT AUTHORITYIUSR:(OI)(CI)(RX)" icacls . /grant "BuiltinIIS_IUSRS:(OI)(CI)(RX)" |
建立並訪問你的網站
現在你離成功只差一步之遙,開啟 IIS 管理皮膚,新建一個網站。
你只需要填上網站名稱,實體地址和相應的埠號,點選確認。
開啟瀏覽器,就可以訪問你配置好的網站。如果有錯誤,可以去檢查 web.config
中配置的日誌檔案。
簡單總結
寫完之後發現其實要完成的步驟並不是特別複雜,但是從摸索到實踐的過程確實不易。本文僅討論了部署的主要步驟,其實真正的生產環境你要考慮的問題可能更多,比如使用virtualenv 對網站進行隔離,安全問題,靜態檔案解析等等。
最後的驚喜
據說部署Python 網站到 IIS 還有更簡單的辦法,那就是安裝宇宙最強的IDE – Visual Studio 2015 (VS2017 暫不支援 Python 開發),個人開發者可以免授權使用社群版。在 VS 中你可以使用 PTVS 來快捷開發並部署Python 程式,真正讓你一鍵無憂。
PTVS 支援了常見的 Python Web 框架,比如 Flask,Django,Bottle,Jade 等等,除錯的時候只需要按 F5,部署右鍵選擇 publish,跟著嚮導一步兩步你就可以完成魔鬼的步伐。