• [Python]Flask简介与gunicorn部署


    使用flask run可非常方便地开发、调试web应用;但其默认服务器(Werkzeug)性能比较低,在生产环境下需要一个高性能的服务器来部署Flask服务,如Gunicorn。

    Flask

    安装模块:pip install flasktoken验证参见《JWT认证与pyjwt包简介》,SSE方式参见《SSE消息推送简介》。

    Flask是一个小而精的轻量级Web框架,方便快速实现一个网站或Web服务。Flask只是一个内核,默认依赖于2个外部库:

    • Jinja2模板引擎;
    • WSGI工具集Werkzeug。

    请求处理

    Flask使用非常简单,只需实例化Flask对象,然后通过route匹配url即可。

    flask中请求默认是get请求,若想要指定其他请求方式,用参数methods指定。

    from flask import Flask, request
    
    # app一定要在各route前实例化
    app = Flask(__name__)
    
    
    @app.route('/list', methods=["GET", 'post'])
    def user_list():
        userList = []
        # get user list
        data = {"users": userList}
        return data, status.HTTP_200_OK
    
    
    @app.route('/add', methods=['post'])
    def user_add():
        token = request.headers.get('Authorization')
        data = request.get_json()
        try:
            # add user
            result = {"userId", userId}
            return result, status.HTTP_200_OK
        except Exception as ex:
            result = {"error": "fail", "message": str(ex)}
            return result, status.HTTP_500_INTERNAL_SERVER_ERROR
        
    
    # 打印请求信息
    # http://127.0.0.1:8080/debug?name=mike
    @app.route('/debug') 
    def print_params():
        # 完整url http://127.0.0.1:8080/debug?name=mike
        url = request.url
        # 主机部分 http://127.0.0.1:8080/
        hostUrl = request.host_url
        # 访问路径 /debug?name=mike
        fullPath = request.full_path
    
        # 参数 mike
        name=request.args.get("name", "")    
        return "ok"
    
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=8080) # debug=True可以在出错时打印详情
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    request对象

    flask的request对象中关于请求参数的获取有几个不同的属性,如args、form、data、json。

    • args属性:请求路径中的查询参数;如/hello?name=mike,其args中的值为{"name": 'mike'}
    • form属性:表单数据(请求头content-type是application/x-www-form-urlencoded或multipart/form-data时);对应值为一个不可变的字典对象。
    • files属性:浏览器上传文件(且form表单需要指定enctype为multipart/form-data)时;
    • data属性:content-type不是multipart/form-data、application/x-www-form-urlencoded这两种类型时;
    • json属性:将content-type指定为application/json, flask就会将接收到的请求体数据做一次json编码转换,将字符串转换为字典对象,赋值给属性json;
    • values属性:是args和form两个字段的组合。

    POST请求获取参数方式:

    • 请求头:request.headers.get('key')
    • Content-Type为application/json,获取json参数:
      request.get_json()['key']
      # request.json.get('key')
      
      # 原始数据
      request.get_data()
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • Content-Type为application/x-www-form-urlencoded:request.values.get('key')
    • Content-Type为multipart/form-data,获取表单参数:
      request.form.get('key')
      # request.form['key']
      
      • 1
      • 2

    Gunicorn

    安装模块pip install gunicorn

    Gunicorn(绿色独角兽,Green Unicorn)是一个Python的WSGI HTTP服务器,来源于Ruby 的Unicorn项目。它采用pre-fork的worker模型;在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求,极大提升了服务器请求负载能力,又可以兼容于多种Python Web框架,实现简单,占用系统资源少,速度也相当快。

    以多thread方式启动(flask在server.py中):
    gunicorn --workers=1 --bind=0.0.0.0:8080 --worker-class=gthread --threads=128 server:app

    配置参数

    启动方式为:gunicorn [OPTIONS] $(MODULE_NAME):$(VARIABLE_NAME),其中MODULE_NAME对应的是python文件名,VARIABLE_NAME对应web应用实例。

    OPTIONS参数:

    • -c CONFIG 或--config=CONFIG:指定参数配置文件,如gunicorn -c gunicorn.conf.py server:app
    • -n proc_name 或者--name=APP_NAME:指定进程名(默认为gunicorn);
    • -b ADDRESS 或者--bind ADDRESS:指定绑定地址(默认为127.0.0.1:8000);
    • -w INT 或者--workers INT:指定进程数(默认为1);若server:app在一定时间内未能成功启动,会重新fork新的进程;
    • -k STRING或者--worker-class STRING:指定工作模式(默认sync,同步模式);
      • sync(同步工作模式):默认的工作模式,请采用排队模式;
      • eventlet(协程异步模式):基于eventlet库(pip install eventlet),利用python协程实现的;
      • gevent(协程异步模式):基于Greentlet库(pip install gevent),利用python协程实现的;
      • tornado模式:利用Tornado框架(pip install tornado)实现的;
      • gthread模式:采用的是线程(pip install gthread)工作模式,利用线程池管理连接。
    • --threads INT:gthread模式下,指定每个worker的线程数(默认1);
    • --worker-connections INT:指定每个worker同时存在的连接数(默认1000),仅Eventlet和Gevent两者模式有效;
    • --max-requests INT:自动重启之前worker处理的最大请求数(默认0,禁用自动重启);连接数超过此值时,会自动重启;
    • -t INT 或者--timeout INT:工作进程在此时间内没有响应则杀死重启(默认30s);
    • --keep-alive INT:连接存活时间(默认2s);
  • 相关阅读:
    编译器设计(十一)——标量优化
    4.2uboot对设备树的支持——dtb的修改原理
    java计算机毕业设计企业运营管理系统的设计与实现源码+数据库+系统+lw文档+mybatis+运行部署
    素数判定算法 初级
    (70)Verilog读文件函数【readmemb】
    分布式消息队列RocketMQ原生API
    一颗小芯片的验证模块划分
    Kibana查询语言(KQL)
    SpringAOP执行流程——从源码画流程图
    2023首届中国水果互联网上海论坛成功举办!
  • 原文地址:https://blog.csdn.net/alwaysrun/article/details/130903552