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

  1. flaskPath = 'D:\flask\apiServerGloryRoad'
  2.  
  3. if flaskPath not in sys.path:
  4. sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad')
  5. sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\test')
  6. sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\apiServer')
  7. sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad\\gloryRoadApi')
  8.  
  9. from gloryRoadApi import app
  10. from apiServer import api
  11.  
  12. application = app
  1.  

注意:这里的格式: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'改为下面的:

  1. sys.path.insert(0, 'D:\\flask\\apiServerGloryRoad')
  2. 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服务程序,进行返回

windows下apache + mod_wsgi + python部署flask接口服务的更多相关文章

  1. Windows下安装使用python的Flask框架

    1.安装python环境: 这里就不赘述了. 2.安装virtualenv虚拟环境: 这里使用使用第三方工具 virtualenv 创建虚拟环境.虚拟环境的好处如下(摘录网络): “ 安装 Flask ...

  2. Win7环境下Apache+mod_wsgi本地部署Django

    django基础已经掌握的同学可以尝试将项目发布已寻找些许成就感,以鼓励自己接下来进行django的进阶学习 以前你总是使用python manage.py runserver进行服务启动,但是却不知 ...

  3. Windows下Apache+mod_python+Django配置

    Windows下Apache+mod_python+Django配置 Apache 首先要安装Apache,我安装的版本是2.2.*: Python python肯定是要安装的,我安装的版本是2.5的 ...

  4. windows下apache+https环境配置

    windows下apache+https环境配置 转 https://www.cnblogs.com/sandaizi/p/7519370.html 1.修改配置文件conf/httpd.conf,去 ...

  5. [MapReduce_add_1] Windows 下开发 MapReduce 程序部署到集群

    0. 说明  Windows 下开发 MapReduce 程序部署到集群 1. 前提 在本地开发的时候保证 resource 中包含以下配置文件,从集群的配置文件中拷贝 在 resource 中新建  ...

  6. Windows下apache+tomcat负载均衡

    Windows下apache+tomcat负载均衡 网上已经有很多的资料,但是很多都比较零碎,需要整合一起才能搭建出理想的负载均衡,正好前段时间搭建了windows与linux下的负载均衡,在此记录, ...

  7. windows下 apache 二级域名相关配置

    小编今天给大家总结下 windows 下 apache的二级域名的相关配置 利用.htaccess将域名绑定到子目录 下面就利用本地127.0.0.1进行测试 我们这里以 www.jobs.com 为 ...

  8. windows下安装Redis并部署成服务

    windows下安装Redis并部署成服务 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 一:下载 下载地址: windows版本: http ...

  9. windows下怎么解决Python双版本问题

    相信大家会在windows下会遇到Python双版本问题 当我们装了Python2和Python3时我们好只能在命令栏调出最高版本的那个低版本的难道消失了吗?今天我们就解决这个问题! 1.下载 我们在 ...

随机推荐

  1. 利用Jenkins打包并远程部署SpringBoot应用

    本文Jenkins版本2.190.2,为19年11月最新 1.安装Jenkins.Git.Maven和JDK Jenkins安装参考:https://www.cnblogs.com/zhi-leaf/ ...

  2. PHP for的1个问题

    PHP for的1个问题 <pre><?php for ($k = 13; $k > 0; $k--) { echo 'wef'; }?></pre>ps: ...

  3. php 500报错解决方案

    php 500报错解决方案 1 先看nginx error.log 指定的错误日记文件路径 找到这个日记文件看 里面信息 2 再看 php-fpm.conf 里面指定的PHP错误日记的路径 具体如下& ...

  4. go-gin-api 路由中间件 - 签名验证(七)

    概览 首先同步下项目概况: 上篇文章分享了,路由中间件 - Jaeger 链路追踪(实战篇),文章反响真是出乎意料, 「Go中国」 公众号也转发了,有很多朋友加我好友交流,直呼我大神,其实我哪是什么大 ...

  5. JS比较软件版本号

    JS比较软件版本号 版本号格式为:a.b.c 1.获取版本号中的数字 function toNumber(n) { // 使用正则表达式,截取字符串为数组,字符串中包含非数值型,如字母,则数组元素中会 ...

  6. D-Bus

    D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信.它是个3层架构的IPC 系统,包括: 1.函数库libdbus ,用于两个应用程序互相联系和交互消息. 2.一 ...

  7. 搭建MQTT服务器

    MQTT协议简介 MQTT 是一个基于发布/订阅模式的消息传输协议.它具有轻量级.开放.简单,易于实现,通信带宽要求低等特点.这些特点使得它对机器与机器的通信(M2M)以及物联网应用(IoT)来说是很 ...

  8. Window应急响应(六):NesMiner挖矿病毒

    0x00 前言 作为一个运维工程师,而非一个专业的病毒分析工程师,遇到了比较复杂的病毒怎么办?别怕,虽然对二进制不熟,但是依靠系统运维的经验,我们可以用自己的方式来解决它. 0x01 感染现象 1.向 ...

  9. nginx报错111: Connection refused

    最近遇到了nginx疯狂抛错,access.log一天一共5W多条,但error.log中有大概9K多条,基本都是111: Connection refused,这到底是为什么呢? 从日志看起 我们还 ...

  10. .NET MVC 支付宝支付(即时到账)

    已经好久没有搞过.NET了,朋友有一个网站 ,需要接入支付宝功能,重新对接了一下. 1.开发前,需要一个企业支付宝账号登录,获取 PID和 配置密钥 官方文档:https://docs.open.al ...