windows下apache + mod_wsgi + python部署flask接口服務
用python3安裝虛擬環境
為啥要裝虛擬環境?
原因1:安裝虛擬環境是為了使項目的環境和全局環境隔離開,在虛擬環境中,我們可獨立的安裝需要的包,不影響系統中全局python環境的配置,一台機器可根據不同項目創建多個虛擬環境,相互不會影響
原因2:根據網上的采坑經驗,如果在全局python環境下配置wsgi文件,會出現找不到系統中安裝的python包的情況
填坑:為啥用python3?
在下載apache文件時,發現能下載vc版本都時對應python3的,想找python2的沒找到。。。
所以只能重新裝python3環境,重裝虛擬環境,重新安裝python包,下載apache文件
運行py -3 –m pip install pipenv 命令安裝虛擬環境
在裝虛擬環境前,可在項目根目錄下放一個Pipfile文件(用來指定安裝包的),這樣,創建python會把本目錄名稱作為虛擬環境名稱的前綴,方便識別
運行pipenv shell激活虛擬環境
激活虛擬環境后,在目錄前方可以看到安裝的虛擬環境名稱
安裝flask項目需要的包
pip install flask-sqlalchemy
pip install PyMySQL
pip install requests
pip install flask_restful
pip install python-dotenv
pip install mysqlclient #python3中連接mysql的,與python2不同
用python3安裝了虛擬環境后,可以直接用pipenv shell激活虛擬環境,而不需要用py -3 –m pipenv shell這樣
另外,激活了py 3的虛擬環境后,安裝包的時候,不需要在用py -3 –m pip install這樣顯示的指定python3了,直接用pip install 就可以,因為虛擬環境本身用的就是python3的解釋器
pycharm運行工程,看是否正常運行
裝完了虛擬環境和包后,在pycharm中打開項目文件,在interpreter中選擇虛擬環境中的python作為解釋器,並查看安裝包是否可以load出來
pycharm配置好解釋器后,在終端上是可以看到虛擬環境的名稱
apache服務部署
下載apache,注意vc版本號:
參考:https://blog.csdn.net/mist99/article/details/80771289
我裝的python:v.1916,應該裝v.15
apache下載地址:
https://www.apachehaus.com/cgi-bin/download.plx
點擊對應的版本,跳到指定位置,直接下載
解壓后,放到本地某個位置
安裝apache:
參考:https://blog.csdn.net/k295330167/article/details/80616519
安裝過程比較簡單,解壓出來,運行幾個命令,配置一下配置文件
安裝apache服務:httpd –k install
運行目錄:在apache的bin目錄下
啟動apache:httpd –k start
重啟apache:httpd – k restart
如果apache版本和python的版本可以對應的話,此處啟動應該沒啥問題,如果失敗的話,那可能是apache的vc版本和python不對應,或者位數不對應(我的都是64位),可以重新下一個,很簡單,只要能找到文件。
重點在配置httpd.conf文件后,是否能夠正常啟動
安裝whl文件
為啥要用whl文件?參考:https://blog.csdn.net/zhangtao0417/article/details/81564444
網上大多建議去下載xxx.so文件,然后loadModule進去,但是python3不到對應版本的.so文件,可以通過python安裝mod_wsgi文件來達到loadModule的目的。
python3找不到對應版本(VC15)的.so文件,所以走.whl文件路線
下載whl地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
whl文件要和apache的vc版本對應:
把whl文件放到flask項目的根目錄下
安裝whl文件
在虛擬環境下,進入項目根目錄放whl文件的地方
(apiServerGloryRoad-f6VPf2KB) D:\flask\apiServerGloryRoad>pip install "mod_wsgi-4.6.5+ap24vc15-cp37-cp37m-win_amd64.whl"
Processing d:\flask\apiservergloryroad\mod_wsgi-4.6.5+ap24vc15-cp37-cp37m-win_amd64.whl
Installing collected packages: mod-wsgi
Successfully installed mod-wsgi-4.6.5+ap24vc15
到虛擬環境所在的目錄下的Scripts下加載module-config
(apiServerGloryRoad-f6VPf2KB) C:\Users\Lenovo\.virtualenvs\apiServerGloryRoad-f6VPf2KB\Scripts>mod_wsgi-express module-config
LoadFile "C:/Users/Lenovo/AppData/Local/Programs/Python/Python37/python37.dll"
LoadModule wsgi_module "c:/users/lenovo/.virtualenvs/apiservergloryroad-f6vpf2kb/lib/site-packages/mod_wsgi/server/mod_wsgi.cp37-win_amd64.pyd"
WSGIPythonHome "c:/users/lenovo/.virtualenvs/apiservergloryroad-f6vpf2kb"
執行完后,把結果中的三行配置信息記錄下來
配置httpd.conf
把上面加載mudule時產生的三行信息復制到conf文件做最后邊
需要配置的地方:參考下面鏈接
https://blog.csdn.net/k295330167/article/details/80616519
其中涉及權限的地方,在vc15上按照下面的就可以,網上說的Order開頭的在新版里不支持了
1):
<VirtualHost *:5000 >
ServerAdmin localhost
DocumentRoot D:\flask\apiServerGloryRoad
WSGIScriptAlias / D:\flask\apiServerGloryRoad\test.wsgi
<Directory "D:\flask\apiServerGloryRoad">
Require all granted
Require host ip
</Directory>
</VirtualHost>
2)
<Directory />
Require all granted
Require host ip
</Directory>
3)
Listen 5000
看apache日志,分析錯誤
參考:https://blog.csdn.net/zhangtao0417/article/details/81564444
配置wsgi文件
在項目根目錄下新建一個.wsgi文件,定義application
部署時,在test.wsgi文件中直接寫代碼測試,先不引用其他文件的app:
test.wsgi文件:
#encoding = 'utf-8'
def application(environ,start_response):
status = "200 Ok"
output = b"Hello wsgi"
response_headers=[('Content-type','text/plain'),('Content-Length',str(len(output)))]
start_response(status,response_headers)
return[output]
配置好wsgi文件后,重啟apache:httpd –k restart
訪問:http://127.0.0.1:5000
至此,apache服務算是搭建成功了80%~
接下來本應該很快搞定的地方,除了一個小坑,因為調查思路放在整體框架上,卡住了一天的時間!
從項目文件引入app
在wsgi文件中可以引入其他模塊的對象,在這里需要從項目中引入ap和api
在引入時需要把項目目錄添加到系統環境變量中,讓wsgi能夠識別到需要引入的對象位置
wsgi文件:import sys
flaskPath = 'D:\flask\apiServerGloryRoad'
if flaskPath not in sys.path: sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad') sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\test') sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\apiServer') sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\gloryRoadApi') from gloryRoadApi import app from apiServer import api application = app
注意:這里的格式:sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad')
最大坑:ImportError: cannot import name 'app' from 'test' (一天)
在test.wsgi里,從其他文件導入app時,提示無法映入’app’
在wsgi文件引入app時,報錯了
sys.path.insert(0, 'D:\flask\apiServerGloryRoad')
報錯提示信息:
ImportError: cannot import name 'app' from 'test'
(C:\\Users\\Lenovo\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\test\\__init__.py)\r
開始以為可能原因有:apache服務問題、apache配置文件問題、虛擬環境配置問題
各種搜索,百度,bing,最后,確定大體框架上沒有問題,還是工程本身的問題
原因:
添加環境變量時用的sys.path.insert(0, 'D:\flask\apiServerGloryRoad'),少個’\’;
是因為添加環境變量時用的是一個’\’,實際需要兩個’\\’,原因是通過打印環境變量的日志發現目錄字符中間的\\處有特殊字符,沒有被識別到這個目錄!!!!
一個小地方,卡了一天!!!!!!
解決方案:
把添加環境變量的字符串’ D:\flask\apiServerGloryRoad'改為下面的:
sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad') sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\test')
路徑修改好后,重新啟動apache:httpd –k restart
問題解決!
填坑:apache24權限是:Require
all granted
,如果用order開頭的,會報錯
不用這兩行了:
Order allow,deny
Allow from all
用apache+wsgi部署flask服務的作用:
用apache部署了flask服務后,不用運行flask api代碼,直接訪問apache中配置的地址就可以訪問api服務,每次訪問時,apache會把請求轉給flask api服務程序,進行返回