[Python]Flask简介与gunicorn部署

news/2025/1/31 3:27:01/

文章目录

    • Flask
      • 请求处理
      • request对象
    • 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 listdata = {"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 userresult = {"userId", userId}return result, status.HTTP_200_OKexcept 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=mikeurl = request.url# 主机部分 http://127.0.0.1:8080/hostUrl = request.host_url# 访问路径 /debug?name=mikefullPath = request.full_path# 参数 mikename=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);

http://www.ppmy.cn/news/95003.html

相关文章

全志V3S嵌入式驱动开发(驱动开发准备)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 之前的文章都是教大家怎么搭建环境、看原理图、编译内核和根文件系统、做镜像,直到现在才进入驱动开发的主题。毕竟整个专栏的目的&…

Go对Json的支持[encoding/json]

数据类型中转json的函数 基本数据转json Marshal使用以下与类型相关的默认编码: 布尔值编码为JSON布尔值。 浮点数、整数和数字值编码为JSON数字。 字符串值编码为JSON字符串,强制为有效的UTF-8; 用Unicode替换符文替换无效字节。 这样JSON就可以安全地嵌入到HTML …

Zrlog接口测试:使用 fetchone() 方法从表中获取一条数据记录

# 导入 PyMySQL 库 import pymysql # 创建数据库对象 db pymysql.connect(# 设置数据库主机的地址host "192.168.199.204",# 设置数据库的用户名user "root",# 设置数据库password "123456",# 设置数据库的名称database "zrlog",…

【redis】Stream、String 超详细介绍

文章目录 一、Stream1.1 写入数据XADD条目 ID 的格式 1.2 获取数据XRANGE 和 XREVRANGEXREAD 监听新条目非阻塞形式阻塞形式 1.3 消费者组XGROUP 创建消费者组XREADGROUP 通过消费者组消费XACK 确认消息消费者组示例 1.4 XPENDING 和 XCLAIM 认领 其他消费者 的待处理消息XPEND…

To_Heart—题解——「NOI国赛 Round9」划分

大概的话就是晚鸢生完的。 可能还有的问题是对形式化题意不敏感?不知道了。 题意 给定长度为 2n 的两个序列 A,B,要求构造一个长度为 2n 的序列 C, C i C_i Ci​ A i A_i Ai​ 或 B i B_i Bi​ 。要求 C 单调不减。求 C 的方案数。 题…

数值计算 - 习题复习

1⃣️求矩阵的计算量 2⃣️求相对误差限 3⃣️根据最大误差求绝对误差限和相对误差限 ⚠️为什么使用微分? 绝对误差通过微分近似来计算基于这样的理念:如果我们在某个点附近考虑一个函数,那么该函数在该点附近的行为可以通过该点的切线来近似…

(八)K8S数据持久化存储

1.Volume讲解 概述: Volume是用于存储容器数据的抽象概念,它可以被挂载到一个或多个Pod中的一个或多个容器中。Volume提供了一种持久性的存储方式,使得容器中的数据可以在容器重启、重新调度或迁移时得以保留。 Kubernetes提供了多种类型的…

P1249 乘积最大

最大乘积 题目描述 一个正整数一般可以分为几个互不相同的自然数的和,如 3 1 2 312 312, 4 1 3 413 413, 5 = 1 4 2 3 5=1423 5=1423, 6 1 5 = 2 4 615=24 …