您现在的位置是:首页 >其他 >[Python]Flask简介与gunicorn部署网站首页其他
[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);