windows下apache + mod_wsgi + python部署flask接口服務python
緣由1:安裝虛擬環境是爲了使項目的環境和全局環境隔離開,在虛擬環境中,咱們可獨立的安裝須要的包,不影響系統中全局python環境的配置,一臺機器可根據不一樣項目建立多個虛擬環境,相互不會影響mysql
緣由2:根據網上的採坑經驗,若是在全局python環境下配置wsgi文件,會出現找不到系統中安裝的python包的狀況sql
在下載apache文件時,發現能下載vc版本都時對應python3的,想找python2的沒找到。。。shell
因此只能從新裝python3環境,重裝虛擬環境,從新安裝python包,下載apache文件express
在裝虛擬環境前,可在項目根目錄下放一個Pipfile文件(用來指定安裝包的),這樣,建立python會把本目錄名稱做爲虛擬環境名稱的前綴,方便識別apache
激活虛擬環境後,在目錄前方能夠看到安裝的虛擬環境名稱flask
pip install flask-sqlalchemywindows
pip install PyMySQLapi
pip install requestsrestful
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中打開項目文件,在interpreter中選擇虛擬環境中的python做爲解釋器,並查看安裝包是否能夠load出來
pycharm配置好解釋器後,在終端上是能夠看到虛擬環境的名稱
參考:https://blog.csdn.net/mist99/article/details/80771289
https://www.apachehaus.com/cgi-bin/download.plx
點擊對應的版本,跳到指定位置,直接下載
參考:https://blog.csdn.net/k295330167/article/details/80616519
安裝過程比較簡單,解壓出來,運行幾個命令,配置一下配置文件
運行目錄:在apache的bin目錄下
若是apache版本和python的版本能夠對應的話,此處啓動應該沒啥問題,若是失敗的話,那多是apache的vc版本和python不對應,或者位數不對應(個人都是64位),能夠從新下一個,很簡單,只要能找到文件。
重點在配置httpd.conf文件後,是否可以正常啓動
爲啥要用whl文件?參考:https://blog.csdn.net/zhangtao0417/article/details/81564444
網上大多建議去下載xxx.so文件,而後loadModule進去,可是python3不到對應版本的.so文件,能夠經過python安裝mod_wsgi文件來達到loadModule的目的。
python3找不到對應版本(VC15)的.so文件,因此走.whl文件路線
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
在虛擬環境下,進入項目根目錄放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
(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"
執行完後,把結果中的三行配置信息記錄下來
把上面加載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
參考:https://blog.csdn.net/zhangtao0417/article/details/81564444
在項目根目錄下新建一個.wsgi文件,定義application
#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]
至此,apache服務算是搭建成功了80%~
接下來本應該很快搞定的地方,除了一個小坑,由於調查思路放在總體框架上,卡住了一天的時間!
在wsgi文件中能夠引入其餘模塊的對象,在這裏須要從項目中引入ap和api
在引入時須要把項目目錄添加到系統環境變量中,讓wsgi可以識別到須要引入的對象位置
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')
在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
問題解決!
all granted
,若是用order開頭的,會報錯
不用這兩行了:
Order allow,deny
Allow from all
用apache部署了flask服務後,不用運行flask api代碼,直接訪問apache中配置的地址就能夠訪問api服務,每次訪問時,apache會把請求轉給flask api服務程序,進行返回