【python】Flask web框架

文章目录

  • 一、Flask 简介
  • 二、核心组件解析
    • 2.1 路由系统
    • 2. 模板引擎 (Jinja2)
    • 2.3 表单处理与请求上下文
  • 三、现代开发实践
    • 3.1 应用工厂模式
    • 3.2 异步处理支持
  • 四、安全最佳实践
  • 五、性能优化策略
  • 六、扩展生态精选
  • 七、部署方案对比

一、Flask 简介

Flask 是基于 Python 的微型 Web 开发框架,采用 BSD 授权开源协议。其设计初衷在于提供一个简洁、灵活且易于扩展的开发平台,适合构建从小型到中型的应用,以及快速原型开发。与 Django 等重量级框架相比,Flask 仅内置最基础的功能,其余功能均可通过扩展包补充。

  • 微内核架构:仅包含路由、模板引擎等基础组件
  • 高扩展性:通过 150+ 官方扩展实现完整功能
  • 无强制约束:不限定项目结构和组件选择
  • 开发友好:支持交互式调试和热重载

Flask 的基本特性:

  • 轻量级与简洁性
    Flask 的核心代码量较少,遵循最小化原则,允许开发者根据需求灵活构建应用。框架本身只包含基本的路由、请求处理、模板渲染等功能。
  • 灵活性与自由度
    不强制要求特定的项目结构,开发者可以自定义项目组织方式。例如, x 1 x_1 x1 表示一个路由参数,可以根据需要动态定义。
  • 丰富的扩展支持
    市场上有大量扩展包,如 Flask-SQLAlchemy、Flask-Login、Flask-WTF 等,可满足数据库操作、用户认证、表单验证、REST API 构建等多种需求。

二、核心组件解析

2.1 路由系统

在 Flask 中,路由用于将 URL 映射到视图函数。通过装饰器 @app.route() 定义路由,如:
@ a p p . r o u t e ( ′ / a b o u t ′ ) @app.route(′/about′) @app.route(′/about)
该装饰器将 URL “/about” 与相应的视图函数绑定。当浏览器请求该 URL 时,系统自动调用对应函数。

视图函数可以返回字符串、HTML 模板或者 JSON 数据,支持复杂数据的动态展示与处理。

2. 模板引擎 (Jinja2)

Flask 默认采用 Jinja2 模板引擎,用于动态渲染 HTML 页面。Jinja2 的模板语法与数学表达式类似,例如可以使用 x 1 x_1 x1 x 2 x_2 x2 表示变量。

基本示例:

<!doctype html>
<html><head><meta charset="utf-8"><title>{{ title }}</title></head><body><h1>{{ header }}</h1><p>{{ content }}</p></body>
</html>

在视图函数中,调用 render_template 将数据传递给模板:

from flask import render_template@app.route('/page')
def page():return render_template('page.html', title='页面标题', header='欢迎', content='这是内容')

2.3 表单处理与请求上下文

Flask 内置对 HTTP 请求的支持,通过 request 对象获取 GET 和 POST 数据。例如:

from flask import request@app.route('/submit', methods=['GET', 'POST'])
def submit():if request.method == 'POST':data = request.form['data']return f'接收到的数据:{data}'return '<form method="post"><input name="data"><input type="submit"></form>'

此外,Flask 支持会话管理(session),使得在多个请求之间存储用户数据成为可能。

三、现代开发实践

3.1 应用工厂模式

应用工厂模式通过创建函数来生成 Flask 应用实例,实现配置与实例化分离。这种模式的优势体现在:

  • 环境隔离:支持开发/测试/生产环境独立配置
  • 组件解耦:延迟初始化数据库等扩展组件
  • 多实例支持:可同时运行不同配置的应用实例
# 基础工厂模式
def create_app():app = Flask(__name__)register_blueprints(app)return app# 进阶配置加载
def create_app(config=None):app = Flask(__name__)app.config.from_mapping(SECRET_KEY=os.environ.get('SECRET_KEY', 'dev'),DATABASE=os.path.join(app.instance_path, 'app.sqlite'),)if config is not None:app.config.from_pyfile(config)# 确保实例文件夹存在try:os.makedirs(app.instance_path)except OSError:passreturn app

3.2 异步处理支持

Flask 2.0 后通过 async/await 支持异步视图函数,其实现基于以下机制:

  1. 每个请求在独立的事件循环中执行
  2. 通过上下文局部变量保持请求隔离
  3. 兼容传统 WSGI 与新兴 ASGI 标准

典型应用场景:

场景类型同步处理异步处理性能提升
I/O 密集型任务1200ms300ms75%
CPU 密集型任务950ms920ms3%
混合型任务800ms350ms56%
# 数据库异步查询示例
@app.route('/users')
async def user_list():# 并行执行三个异步查询result = await asyncio.gather(async_db.get_users(),async_db.get_logs(),async_db.get_stats())return render_template('users.html', data=result)

四、安全最佳实践

  1. 安全头配置
from flask_talisman import Talisman
Talisman(app, content_security_policy=[])
  1. 会话安全
app.config.update(SESSION_COOKIE_HTTPONLY=True,SESSION_COOKIE_SAMESITE='Lax'
)
  1. 密码存储
from werkzeug.security import generate_password_hash
hash = generate_password_hash('password', method='scrypt')

五、性能优化策略

  1. 缓存加速
from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'RedisCluster'})
  1. 数据库优化
# 使用SQLAlchemy批量操作
from sqlalchemy import bindparam@app.route('/import', methods=['POST'])
def bulk_import():data = request.get_json()stmt = insert(User).values(name=bindparam('name'),email=bindparam('email'))db.session.execute(stmt, data)  # 单次提交所有数据db.session.commit()
  1. 静态文件处理
@app.route('/static/<path:filename>')
def static_files(filename):return send_from_directory(app.config['STATIC_DIR'], filename)

六、扩展生态精选

扩展名称功能描述使用场景
Flask-SQLAlchemyORM 数据库集成复杂数据模型管理
Flask-SocketIOWebSocket 支持实时通信应用
Flask-Admin自动管理界面生成后台管理系统
Flask-RESTfulREST API 快速开发微服务架构
Flask-Migrate数据库迁移工具团队协作开发

七、部署方案对比

方案并发能力适用场景学习曲线
Gunicorn中等传统部署
uWSGI生产环境
Docker容器化部署
Serverless弹性事件驱动型应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32621.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA k8s-device-plugin源码分析与安装部署

在《kubernetes Device Plugin原理与源码分析》一文中&#xff0c;我们从源码层面了解了kubelet侧关于device plugin逻辑的实现逻辑&#xff0c;本文以nvidia管理GPU的开源github项目k8s-device-plugin为例&#xff0c;来看看设备插件侧的实现示例。 一、Kubernetes Device Pl…

MySql索引下推(ICP)是什么?有什么用?

目录 基本介绍为什么需要索引下推&#xff1f;未引入ICP&#xff08;x&#xff09;引入ICP&#xff08;√&#xff09; 如何指导sql优化适用场景sql优化 基本介绍 索引下推&#xff08;Index Condition Pushdown, ICP&#xff09;&#xff0c;是MySQL5.6 引入的优化技术&#…

用户可免费体验!国家超算互联网平台上线阿里开源推理模型接口服

近日&#xff0c;国家超算互联网平台上线阿里巴巴开源推理模型QwQ-32B API接口服务&#xff0c;现在用户可获得免费的100万Tokens。基于国产深算智能加速卡以及全国一体化算力网&#xff0c;平台支持海量用户便捷调用QwQ-32B、DeepSeek-R1等国产开源大模型的接口服务。 了解QwQ…

大数据学习(63)- Zookeeper详解

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91e; &#x1f…

【蓝桥杯python研究生组备赛】003 贪心

题目1 股票买卖 给定一个长度为 N 的数组&#xff0c;数组中的第 i 个数字表示一个给定股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&…

mmdet3d.models.utils的clip_sigmoid理解

Sigmoid 函数 标准的 sigmoid 函数定义为&#xff1a; 容易得出结论&#xff1a; 取值范围(0, 1) clip_sigmoid 是在标准的 sigmoid 函数基础上进行 裁剪&#xff08;clip&#xff09;&#xff0c;即对 sigmoid 输出的结果加以限制&#xff0c;避免其超出特定范围。 import …

侯捷 C++ 课程学习笔记:进阶语法之lambda表达式(二)

侯捷 C 课程学习笔记&#xff1a;进阶语法之lambda表达式&#xff08;二&#xff09; 一、捕获范围界定 1. 局部变量与函数参数 ​非静态局部变量&#xff1a;Lambda 所在作用域内定义的局部变量&#xff08;如函数内部的 int x&#xff09;会被完整复制其当前值。捕获后外部变…

有必要使用 Oracle 向量数据库吗?

向量数据库最主要的特点是让传统的只能基于具体值/关键字的数据检索&#xff0c;进化到了可以直接基于语义的数据检索。这在AI时代至关重要&#xff01; 回到标题问题&#xff1a;是否有必要使用 Oracle 向量数据库&#xff1f; 这实际还要取决于你的具体应用需求。 客观来讲…

论文解读 | AAAI'25 CoRA:基于大型语言模型权重的协作信息感知用于推荐

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 个人信息 作者&#xff1a;刘禹廷&#xff0c;东北大学博士生 内容简介 将协作信息融入大型语言模型&#xff08;LLMs&#xff09;是一种有前景的适应推荐任务的技…

es扩容节点以后写入数据量增加1倍

背景&#xff1a; es扩容一倍的数据节点以后 写入数据量增加1倍 业务反馈业务访问量没增加。 最后定位是监控数据&#xff1a; PUT _cluster/settings {"persistent": {"xpack.monitoring.collection.enabled" : "false"} }这个索引记录的是 节…

G-Star 公益行 | 温暖相约 3.30 上海「开源×AI 赋能公益」Meetup

你是否曾想过&#xff0c;在这个数字化浪潮席卷的时代&#xff0c;公益组织如何突破技术瓶颈&#xff1f;当 AI 成为热门话题&#xff0c;它能为公益事业带来怎样的温度&#xff1f;开源的力量&#xff0c;如何让每一份善意都拥有无限可能&#xff1f; G-Star 公益行&#xff…

MySQL数据库复杂的增删改查操作

在前面的文章中&#xff0c;我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子&#xff0c;进行讲解一些较为复杂且现时需求的例子。 基础知识&#xff1a; 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…

kafka-docker版

Kafka-docker版 1 概述 1.1 定义 Kafka传统定义&#xff1a; Kafka是一个分布式的基于发布/订阅模式的消息队列(MessageQucue)&#xff0c;主要应用于大数据实时处理领域。它是一个开源的分布式事件流平台( Event Streaming Platform)&#xff0c;被数千家公司用于高性能数据…

Zabbix 7.2 + Grafana 中文全自动安装ISO镜像

简介 ​ 基于Zabbix 官方的Alma Linux 8 作为基础镜像。 镜像源都改为国内大学镜像站&#xff0c;自动联网安装ZabbixGrafana。 安装中文字体、Zabbix和Grafana也配置默认中文。 Zabbix 也指定中文字体&#xff0c;绘图无乱码。 配置时区为东八区&#xff0c;Zabbix配置We…

使用pip在Windows机器上安装Open Webui,配合Ollama调用本地大模型

之前的文章分享过在 linux 服务器上安装&#xff0c;并使用Open-webui 来实现从页面上访问本地大模型的访问。也写了文章分享了我在家里 Windows Server 台式机上安装 Ollama 部署本地大模型&#xff0c;并分别使用 Chatbox 和 CherryStudio 来访问本地的大模型。今天我来分享一…

【python运行Janus-Pro-1B文生图功能】

前言 体验了一把本地部署Janus-Pro-1B实现文生图功能。 1、开源项目下载 官方开源项目代码直接从Github上下载。 2、模型下载 模型官方下载需要魔法 Janus-Pro-1B模型文件&#xff1a;Janus-Pro-1B模型文件 百度网盘&#xff1a; https://pan.baidu.com/s/16t4H4z-QZe2UDAg4…

18 | 实现简洁架构的 Handler 层

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…

宇树ROS1开源模型在ROS2中Gazebo中仿真

以GO1为例 1. CMakelists.txt更新语法 cmake_minimum_required(VERSION 3.8) project(go1_description) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find…

LearnOpenGL-笔记-其三

在之前的章节中我们学习了基本的窗口构建方法、着色器的定义与使用以及摄像机的构建&#xff0c;而从今天这个大章节开始我们要来学习光照有关的知识。 颜色 现实世界中有无数种颜色&#xff0c;每一个物体都有它们自己的颜色。我们需要使用&#xff08;有限的&#xff09;数…

cfi网络安全 网络安全hcip

目录 RIP (路由信息协议) 算法 开销 版本 开销值的计算方式 RIPV1和RIPV2的区别 RIP的数据包 Request(请求)包 Reponse(应答)包 RIP的特征 周期更新 RIP的计时器 1&#xff0c;周期更新计时器 2&#xff0c;失效计时器 3&#xff0c;垃圾回收计时器 RIP的核心思…