使用flask run可非常方便地开发、调试web应用;但其默认服务器(Werkzeug)性能比较低,在生产环境下需要一个高性能的服务器来部署Flask服务,如Gunicorn。
安装模块:pip install flask
;token验证参见《JWT认证与pyjwt包简介》,SSE方式参见《SSE消息推送简介》。
Flask是一个小而精的轻量级Web框架,方便快速实现一个网站或Web服务。Flask只是一个内核,默认依赖于2个外部库:
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可以在出错时打印详情
flask的request对象中关于请求参数的获取有几个不同的属性,如args、form、data、json。
{"name": 'mike'}
。POST请求获取参数方式:
request.headers.get('key')
request.get_json()['key']
# request.json.get('key')
# 原始数据
request.get_data()
request.values.get('key')
request.form.get('key')
# request.form['key']
安装模块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,同步模式);
pip install eventlet
),利用python协程实现的;pip install gevent
),利用python协程实现的;pip install tornado
)实现的;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);