Flask+Apache+virtualenv 架在Windows上

Peter Chen
8 min readJul 18, 2020

--

這篇的目的是要使用Apache,將Flask API架在Windows上,其中會使用virtualenv來建立Python的虛擬環境,為的是如此一來,每個專案的Python環境(安裝的套件版本等)可以各自獨立,再利用mod_wsgi,就可以實現每個Flask API有各自的Python虛擬環境。

首先說明我的Windows是Windows 10,我也有試過Windows Server 2016在這個做法下也是可行的,Windows 7則會失敗;然後我Python版本是3.7.3。

第一步先到Apache官網下載Apache,

官網網址:https://www.apachelounge.com/download/

這裡我下載的是VC15、Win64版,它是一個zip檔,將裡面名為「Apache24」資料夾解壓縮出來,放到適當的位置,我們這裡因為要示範可以裝多個Apache的狀況(因為在Windows上的Apache上放Python Flask或是Django的狀況,Python程式碼有變動的情況,需要自己手動重啟Apache,如此一來,若是一個Apache上放多個專案的Flask,例如放了專案A的Flask API A1以及專案B的Flask API B1,A1改了Python程式碼後需要重啟,這樣重啟過程也會影響到B1,所以我們這裡示範裝多個Apache的情況),我們先在C槽底下建一個名為「Multiple Apaches」的資料夾,然後在其底下建一個名為「test」的資料夾,我們將解壓縮出來的「Apache24」資料夾放到「test」資料夾底下。

接著,假設在D槽建一個名為「PycharmProjects」的資料夾,在其底下建一個名為「test_flask」的資料夾,接著為了要建立Python虛擬環境,在命令提示字元輸入以下指令(將Python虛擬環境建立在test_flask資料夾裡):

先安裝virtualenv(以系統管理員身分執行命令提示字元)

C:\WINDOWS\system32>pip install virtualenv

接著執行

C:\WINDOWS\system32>D:
D:\>cd D:\PycharmProjects\test_flask
D:\PycharmProjects\test_flask>virtualenv -p "C:\Program Files\Python 3.7.3\python.exe" venv

上面的指令最後一個裡,第二個參數為Python執行擋路徑,第三個參數為欲建立的Python虛擬環境名稱。

建立成功後可以看到下圖,有一個名為venv的資料夾已建立

Python虛擬環境建立完成

接著,我們在test_flask資料夾底下建立test_flask.py,內容為:

可以看到第三行,等於需要在url最後的最後加入「/hello_flask」,才會call下面這個hello_flask function。

並且在test_flask資料夾底下建立test_flask.wsgi,內容為:

可以看到2到4行的程式碼用意為啟用venv這個虛擬環境。

然後,要在這個虛擬環境裡安裝flask,所以輸入以下指令(不需使用系統管理員身分執行):

C:\Users\PeterChen>D:
D:\>cd D:\PycharmProjects\test_flask\venv\Scripts
D:\PycharmProjects\test_flask\venv\Scripts>activate
(venv) D:\PycharmProjects\test_flask\venv\Scripts>pip install flask

執行完即安裝完成flask。

接著在Python主環境(非虛擬環境)安裝mod_wsgi(以系統管理員身分執行命令提示字元)

C:\WINDOWS\system32>pip install mod_wsgi

安裝完成後執行以下指令

C:\WINDOWS\system32>mod_wsgi-express module-config

會出現下面三行

LoadFile "c:/program files/python 3.7.3/python37.dll"
LoadModule wsgi_module "c:/program files/python 3.7.3/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "c:/program files/python 3.7.3"

將其複製下來,貼到「C:\Multiple Apaches\test\Apache24\conf\httpd.conf」檔案內容的最下方。

然後在「C:\Multiple Apaches\test\Apache24\conf\httpd.conf」檔案內容的最下方加上如下內容,可以避免多個API(或網站)互相衝到:

WSGIApplicationGroup %{GLOBAL}

然後接著在「C:\Multiple Apaches\test\Apache24\conf\httpd.conf」檔案內容的最下方貼上以下內容:

<VirtualHost *:80>
DocumentRoot "D:\PycharmProjects\test_flask"
ServerName localhost
<Directory "D:\PycharmProjects\test_flask">
Require all granted
</Directory>
WSGIScriptAlias /test_flask D:\PycharmProjects\test_flask\test_flask.wsgi
</VirtualHost>

可以看到「WSGIScriptAlias /test_flask D:\PycharmProjects\test_flask\test_flask.wsgi」的部分,

表示我們取一個別名「/test_flask」,表示需要在url裡輸入這個別名。

這裡範例是使用80 port,同樣可以看到在這個檔案裡,有「Listen 80」這行文字,若是要用其他port,要相對應的加入,例如加入「Listen 5000」等。

然後記得在「C:\Multiple Apaches\test\Apache24\conf\httpd.conf」檔案裡,將「access.log」和「error.log」的路徑改成絕對路徑,例如:

CustomLog "C:/Multiple Apaches/test/Apache24/logs/access.log" common

以及

ErrorLog "C:/Multiple Apaches/test/Apache24/logs/error.log"

這樣,log也會確實寫到指定的路徑底下了(當遇到無法存取API的情況時,需要到error.log去看錯誤訊息)

接著,為了啟用Apache Servive,在命令提示字元輸入以下指令(以系統管理員身分執行):

C:\WINDOWS\system32>cd C:\Multiple Apaches\test\Apache24\bin
C:\Multiple Apaches\test\Apache24\bin>httpd.exe -k install -n "Apache-test_flask"

可以看到上面最後一個指令的最後一個參數為Service的名稱,

成功之後,可以在「服務」裡看到有一個名為「Apache-test_flask」的服務,右鍵點選啟動。(如下圖,可以看到啟動類型為自動,表示當電腦開機,這個服務也會自動啟起來了)

啟動Apache服務

最後,在瀏覽器url裡輸入:

http://127.0.0.1/test_flask/hello_flask

或是

http://localhost/test_flask/hello_flask

就可以看到它回傳「Hello Flask!」了,大功告成!

--

--