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服务程序,进行返回