• 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:flaskapiServerGloryRoad>pip install "mod_wsgi-4.6.5+ap24vc15-cp37-cp37m-win_amd64.whl"

    Processing d:flaskapiservergloryroadmod_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:UsersLenovo.virtualenvsapiServerGloryRoad-f6VPf2KBScripts>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:flaskapiServerGloryRoad

             WSGIScriptAlias / D:flaskapiServerGloryRoad est.wsgi

             <Directory "D:flaskapiServerGloryRoad">

                       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:flaskapiServerGloryRoad'

    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:flaskapiServerGloryRoad')

    报错提示信息:

    ImportError: cannot import name 'app' from 'test'

    (C:\Users\Lenovo\AppData\Local\Programs\Python\Python37\Lib\test\__init__.py)

    开始以为可能原因有:apache服务问题、apache配置文件问题、虚拟环境配置问题

    各种搜索,百度,bing,最后,确定大体框架上没有问题,还是工程本身的问题

    原因:

    添加环境变量时用的sys.path.insert(0, 'D:flaskapiServerGloryRoad'),少个’’;

    是因为添加环境变量时用的是一个’’,实际需要两个’\’,原因是通过打印环境变量的日志发现目录字符中间的\处有特殊字符,没有被识别到这个目录!!!!

    一个小地方,卡了一天!!!!!!

    解决方案:

    把添加环境变量的字符串’ D:flaskapiServerGloryRoad'改为下面的:

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

  • 相关阅读:
    删除某个目录下面指定名字的文件夹的命令
    ubuntu 12.04 下面安装vmware workstation 8.0.4
    最近一段时间总结
    ejb 学习笔记HelloWorld入门实例
    状态会话bean的session周期与Web上的session周期
    ubuntu做路由器
    Heron and His Triangle 递推 高精度 打表 HDU6222
    洛谷训练赛 A.Misaka Network
    HZNU Training 1 for Zhejiang Provincial Competition 2020 Xeon第三场训练赛
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/xiaxiaoxu/p/10964907.html
Copyright © 2020-2023  润新知