緣起
使用django開(kāi)發(fā)了一個(gè)項(xiàng)目,客戶(hù)的技術(shù)體系是全棧window的,所以要求我們提供把項(xiàng)目部署到windows服務(wù)器的服務(wù)。
寫(xiě)這個(gè)原因是舊的在 windows 上運(yùn)行python網(wǎng)站程序的文檔,基本上全過(guò)時(shí)了。
從macOS登陸windows服務(wù)器
嗯,需要安裝 Microsoft Remote Desktop,版本是 8.0.x。需要注意的是微軟官網(wǎng)的下載鏈接是直接鏈接到app store,而該App在中國(guó)區(qū)不上架,所以下載不了。最后解決問(wèn)題是同事在網(wǎng)上找到了個(gè)下載版。
登陸的時(shí)候,還有一個(gè)要注意的就是在配置的session那里勾選Connect to admin session。也許只是用Administrator賬號(hào)登陸的話(huà)才需要,我沒(méi)試其它賬號(hào)。
注:MS Office 2011 for Mac 自帶的那個(gè)RDC不行了,版本2.1.x的,一登陸就證書(shū)不對(duì)之類(lèi)的,是登陸不上去的。
安裝 Python
這個(gè)很容易,直接在python官網(wǎng)下載就行,我下載的是64位的版本,因?yàn)槭?4位的機(jī)器,需要往下拉一下頁(yè)面才能找到,直接點(diǎn)Download按鈕下載的是32位的。
安裝的時(shí)候,有兩個(gè)地方要特別注意,一是要勾選Add to PATH,二是一定要把它安裝到?jīng)]有空格的路徑下,比如c:/python36,不要使用默認(rèn)的c:/Program files/python36,你在后面會(huì)被折騰死,我不會(huì)告訴你我浪費(fèi)了一天的時(shí)間,最后重裝python解決的。
安裝 wfastcgi
在windows上跑django或其它python網(wǎng)站程序,用IIS是最正確的,使用 apache/nginx會(huì)更加難管理。但是IIS不支持wsgi,而django自1.7起就棄用了fastcgi,在1.9的時(shí)候更是刪除了,所以我們編寫(xiě)的網(wǎng)站程序無(wú)法直接跑在IIS上,因?yàn)槲覀冇玫氖?.11版本,太新了。
wfastcgi是當(dāng)前唯一、唯一、唯一可用可靠的把wsgi橋接到fastcgi的方案,之前花好幾天看到的,基本上都過(guò)時(shí)了,那些基本django1.2/1.4版本寫(xiě)的文章,丟掉吧,別看了,完全沒(méi)有用處。github上有個(gè)django-windows-tools的項(xiàng)目,也過(guò)時(shí)了,七八年前的了,別看了;也有一篇相關(guān)的文章,Installing Django on IIS: A Step-by-Step Tutorial流毒甚廣,別看了。那些帶有PyISAPIe、isapie-wsgi字樣的,統(tǒng)統(tǒng)都不靠譜,見(jiàn)到就閃吧。
wfastcgi感覺(jué)生命力會(huì)長(zhǎng)久一些,因?yàn)樗鋵?shí)出自微軟自身,根正苗紅,也有Azure云計(jì)算的需要。開(kāi)發(fā)它的團(tuán)隊(duì)是Python Tools for Visual Studio的那幫人,實(shí)力強(qiáng)勁。
安裝好python以后,開(kāi)個(gè)Power Shell新窗口,運(yùn)行pip install wfastcgi就可以安裝成功了。然后再運(yùn)行一下wfastcgi-enable命令啟用它即可,成功運(yùn)行后,會(huì)輸出一個(gè)目錄,告訴你可以把它加到配置文件(稍后講)。
安裝 git
當(dāng)然了,首先要把項(xiàng)目的代碼 clone 到本地。需要安裝git,具體用法就不說(shuō)了。不過(guò)安裝的時(shí)候,有一個(gè)很重要的點(diǎn),就是問(wèn)你要使用哪個(gè)加密庫(kù)。默認(rèn)是使用 OpenSSL,我是原生黨,所以改選了使用有windows native字樣的那個(gè),結(jié)果后來(lái)使用 git 的時(shí)候,驗(yàn)證賬號(hào)密碼一直出錯(cuò),坑死爹爹了。切記這里不要亂選了。
在這里說(shuō)一下題外話(huà),安裝git的時(shí)候,可以把跟Cygwin相關(guān)的選項(xiàng)取消掉,使用GOW即可,非常好用,基本上常用的命令都有了,安裝GOW之后,在Power Shell中用起來(lái)感覺(jué)跟在macOS的終端下的體驗(yàn)有得一拼。官網(wǎng):https://github.com/bmatzelle/gow ,支持的命令列表:https://github.com/bmatzelle/gow/wiki/executables_list 。
代碼一定要用 manager.py runserver本地跑一下啦,只要依賴(lài)的包裝好了,一般而言是沒(méi)有問(wèn)題的。然后可以進(jìn)入下一步。
配置 web.config
在IIS中新建一個(gè)網(wǎng)站,把域名分配過(guò)去就好。然后在manager.py的同級(jí)目錄新建一個(gè)文本文件web.config,里面的內(nèi)容有個(gè)模板可以套:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python FastCGI"
path="*"
verb="*"
modules="FastCgiModule"
scriptProcessor="<Path to Python>/python.exe|<Path to Python>/lib/site-packages/wfastcgi.py"
resourceType="Unspecified"
requireAccess="Script"/>
</handlers>
</system.webServer>
<appSettings>
<add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
<add key="PYTHONPATH" value="<Path to Django App>" />
<add key="DJANGO_SETTINGS_MODULE" value="<Django App>.settings" />
</appSettings>
</configuration>
scriptProcessor的值,要改為前文說(shuō)過(guò)的運(yùn)行wfastcgi輸出的那個(gè)值。PYTHONPATH的value要改為manager.py的那個(gè)目錄,也就是你項(xiàng)目的根目錄。DJANGO_SETTINGS_MODULE的value中的<Django App>要改為你的項(xiàng)目名。
然后重啟一下你的網(wǎng)站,域名沒(méi)有錯(cuò)的話(huà),應(yīng)該就可以訪(fǎng)問(wèn)了。
嗯,就是這么簡(jiǎn)單,這么霸道。但我不會(huì)告訴你我找資料的那240個(gè)小時(shí)的。
如果你看到頁(yè)面沒(méi)有css樣式了,應(yīng)該是找不到靜態(tài)文件,執(zhí)行一下manager.py collectstatic應(yīng)該就好了。
另外,為了讓靜態(tài)文件的處理不經(jīng)過(guò)Python這一層,建議往static和media目錄下各放一個(gè)web.config文件,內(nèi)容都是:

記得如果你改過(guò)最前面的web.config文件中的name值,這里也要對(duì)應(yīng)。這樣就可以在獲取靜態(tài)文件的時(shí)候快一點(diǎn)了。
參考:
https://pypi.python.org/pypi/wfastcgi
http://kronoskoders.logdown.com/posts/1074588-running-a-django-app-on-windows-iis