您现在的位置是:首页 >其他 >[Python]Flask简介与gunicorn部署网站首页其他

[Python]Flask简介与gunicorn部署

alwaysrun 2024-06-30 00:01:02
简介[Python]Flask简介与gunicorn部署

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

Flask

安装模块:pip install flask;token验证参见《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可以在出错时打印详情

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()
    
  • Content-Type为application/x-www-form-urlencoded:request.values.get('key')
  • Content-Type为multipart/form-data,获取表单参数:
    request.form.get('key')
    # request.form['key']
    

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);
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。