本文介紹了如何在Windows上部署Python Flask應用,相關環境如下:
- 操作系統:windows 7
- Python:3.4
- WFastCGI: 2.2
應用所用到的包版本如下:
Flask==0.10.1
Flask-SQLAlchemy==2.1
itsdangerous==0.24
Jinja2==2.8
MarkupSafe==0.23
pyodbc==3.0.10
SQLAlchemy==1.0.9
Werkzeug==0.11.2
wheel==0.24.0
1. WFastCGI
wfastcgi.py使用WSGI和FastCGI提供了IIS和Python之間的橋接,類似於Apache HTTP服務器上的mod_python.
它能夠用於任何支持WSGI的Python web應用或者框架,而且提供了IIS處理請求和進程池的高效方法。
2. 安裝
2.1 下載安裝包
通過PyPI安裝:
pip install wfastcgi
2.2 IIS安裝FastCGI和URL重寫
IIS需要安裝FastCGI和URL重寫,這個可以通過Microsoft Web Platform Installer來安裝。下載過Microsoft Web Platform Installer點擊運行,會出現如下的界面。
在搜索欄分別輸入cgi和url重寫,點擊添加按鈕:
注:windows10上的IIS 10現在不支持url重寫。
3. 啟用wfastcgi
一旦wfastcgi
和IIS安裝完畢,用管理員的身份運行wfastcgi-enable
來在IIS上啟用wfastcgi
配置。這個能配置一個路由處理器的CGI應用。
wfastcgi-enable
要在卸載之前禁用wfastcgi
,運行wfastcgi-disable
:
wfastcgi-disable
pip uninstall wfastcgi
注意: 卸載wfastcgi
不會自動的取消注冊CGI應用。
如果傳遞給wfastcgi-enable
或者wfastcgi-disable
的第一個參數是一個有效的文件,整個命令行就用來注冊或取消注冊這個CGI處理器。
例如,下面的命令就是在IIS Express上啟用wfastcgi,而且指定主機配置。
wfastcgi-enable "C:\Program Files (x86)\IIS Express\appcmd.exe"
/apphostconfig:C:\Path\To\applicationhost.config
你也可以使用wfastcgi-disable
來禁用相同配置的wfastcgi:
wfastcgi-disable "C:\Program Files (x86)\IIS Express\appcmd.exe"
/apphostconfig:C:\Path\To\applicationhost.config
4. 使用PTVS創建Python Web項目
PTVS是Visual Studio的一個插件,能夠讓VS支持Python開發,下載並安裝后,就可以使用它來開發Python項目了。
使用PTVS創建一個Flask項目(Django項目類似):
PTVS會自動根據模板創建一個項目,點擊運行,就會在項目根目錄下創建一個web.config文件。我在下面對文件進行了一些修改說明。
?xml version="1.0"?>
<configuration>
<system.diagnostics>
<!--如果不用此節點可以移除-->
</system.diagnostics>
<appSettings>
<add key="WSGI_ALT_VIRTUALENV_HANDLER" value="TgwlDataCenter.app" /><!--value指定Flask實例,PTVS會自動生成,也可以自己定義-->
<add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS" value="%ROOTDIR%\env\Scripts\activate_this.py" /><!--value指定激活虛擬路環境用到的內容-->
<add key="WSGI_HANDLER" value="ptvs_virtualenv_proxy.get_virtualenv_handler()" /><!--也是虛擬路徑的WSGI_HANDLER,不用修改-->
<add key="PYTHONPATH" value="%ROOTDIR%" /><!--項目根目錄-->
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<add name="Python FastCGI" path="handler.fcgi" verb="*" modules="FastCgiModule" scriptProcessor="%INTERPRETERPATH%|%WFASTCGIPATH%" resourceType="Unspecified" requireAccess="Script" /><!--scriptProcessor的值就是你在運行wfastcgi-enbale時輸出的值-->
</handlers>
<rewrite>
<rules>
<rule name="Static Files" stopProcessing="true">
<match url="^/static/.*" ignoreCase="true" /><!--靜態文件不用CGI處理,直接使用IIS返回靜態文件-->
<action type="Rewrite" url="^/TgwlDataCenter/static/.*" appendQueryString="true" />
</rule>
<rule name="Configure Python" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
</conditions>
<action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
scriptProcessor
的值是wfastcgi-enable
命令執行時輸出的,不同機器值也不一樣。path
和verb
的值也可以進一步自定義來限制request的類型。
name
值可以在子文件夾的web.config
文件中使用,來屏蔽handler的作用。比如,在/static
子文件夾中添加一個web.config
文件,包含<remove name="Python FastCGI"/>
來阻止IIS通過Python應用來解析靜態文件。
app setting被轉換為環境變量,並且能夠在Python應用中通過os.getenv
來獲取。下面這些變量由wfastcgi
使用。
注意:部署時需要將%ROOTDIR%
全部替換為項目根目錄,%INTERPRETERPATH%|%WFASTCGIPATH%
替換為wfastcgi-enable
命令執行時輸出,我的是C:\Python34\python.exe|C:\Python34\lib\site-packages\wfastcgi.py
此時,將項目部署到IIS上就可以了,創建方法同普通的ASP.NET網站創建方法相同。
作者:作者:liulixiang1988#gmail.com (#換成@)