windows下apache + mod_wsgi + python部署flask接口服務


 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服務程序,進行返回


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM