Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术
Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术
目录
- 🐍 Flask
- Flask 核心概念(路由、视图函数、模板渲染)
- Flask Blueprint 模块化应用
- Flask 扩展(Flask-SQLAlchemy、Flask-WTF、Flask-Migrate 等)
- 🌍 Django
- Django 项目架构
- Django ORM 及模型定义
- Django 中间件
- Django 信号机制
- Django Form 和 Template 引擎
- 🚀 FastAPI
- FastAPI 核心概念(路由、请求模型、响应模型)
- Pydantic 数据验证与序列化
- 异步编程与并发处理
- FastAPI 中的依赖注入
1. 🐍 Flask
Flask 是一个轻量级的 Python Web 框架,以其灵活、简单且易于扩展的特性深受开发者的青睐。通过 Flask,可以快速创建并部署 Web 应用,同时保留对项目结构的高度控制。其核心概念包括路由、视图函数和模板渲染等。
Flask 核心概念(路由、视图函数、模板渲染)
路由是 Flask 的基础,通过 @app.route()
装饰器将 URL 与对应的视图函数绑定。每当用户访问该 URL,Flask 就会执行相应的视图函数并返回结果。
from flask import Flask, render_templateapp = Flask(__name__)# 路由示例
@app.route('/')
def homepage():return "Welcome to Flask Homepage!"# 模板渲染示例
@app.route('/hello/<name>')
def hello(name):return render_template('hello.html', name=name)if __name__ == '__main__':app.run(debug=True)
视图函数 是用于处理请求并返回响应的核心逻辑。在 Flask 中,视图函数可以返回字符串、HTML 模板或 JSON 数据。通过模板渲染机制,开发者可以将数据动态传递到前端界面,极大简化了页面展示的流程。
<!-- hello.html -->
<!DOCTYPE html>
<html><head><title>Hello, Flask</title></head><body><h1>Hello, {{ name }}!</h1></body>
</html>
Flask 通过 Jinja2 模板引擎实现模板渲染,允许开发者将变量嵌入 HTML 模板中,从而动态生成页面。
Flask Blueprint 模块化应用
Flask 的 Blueprint 功能允许开发者将大型应用程序拆分成多个模块,每个模块可以独立开发和维护。这样可以提高应用的可扩展性和代码的可维护性,特别适合大型 Web 应用。
from flask import Flask, Blueprint# 创建蓝图
bp = Blueprint('admin', __name__, url_prefix='/admin')@bp.route('/')
def admin_home():return "Welcome to the Admin Panel!"app = Flask(__name__)
app.register_blueprint(bp)if __name__ == '__main__':app.run(debug=True)
上面的例子展示了如何通过 Blueprint 创建一个独立的管理后台模块。通过 Blueprint,可以将不同的功能模块化,保持代码的清晰和可维护性。
Flask 扩展(Flask-SQLAlchemy、Flask-WTF、Flask-Migrate 等)
Flask 通过其丰富的扩展生态,能够轻松实现数据库操作、表单验证和数据库迁移等功能。最常用的扩展之一是 Flask-SQLAlchemy,它是一个 ORM 库,简化了与数据库的交互。
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)# 定义数据库模型
class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), nullable=False)@app.route('/')
def index():users = User.query.all()return ', '.join([user.username for user in users])if __name__ == '__main__':db.create_all()app.run(debug=True)
通过 Flask-WTF,可以轻松处理 Web 表单的验证。Flask-Migrate 则提供了方便的数据库迁移工具,帮助管理数据库结构的更新。
2. 🌍 Django
Django 是一个全栈 Web 框架,提供了包括 ORM、模板引擎、URL 路由、中间件和信号机制在内的完整工具集。它遵循“Django 式”的开发风格,能帮助开发者快速开发复杂的 Web 应用。
Django 项目架构
Django 的项目架构由多个应用组成,每个应用负责一组功能。开发者可以通过命令行创建项目和应用,Django 会自动生成必要的目录结构。
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
一个典型的 Django 项目结构如下:
myproject/manage.pymyproject/__init__.pysettings.pyurls.pymyapp/migrations/__init__.pymodels.pyviews.pyurls.py
Django ORM 提供了一种直观的方式定义和操作数据库模型。模型定义非常简洁,可以通过类来描述表结构,Django 会自动生成对应的数据库表。
from django.db import modelsclass User(models.Model):username = models.CharField(max_length=100)email = models.EmailField()
通过 ORM,开发者可以使用 Python 代码直接操作数据库,而不需要编写 SQL 语句。
Django 中间件
中间件是 Django 请求处理链中的关键组件,它可以在请求到达视图之前或响应发出之前对其进行修改。Django 提供了多种内置中间件,如身份验证、跨站点请求伪造(CSRF)保护等。
# settings.py
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',
]
开发者还可以自定义中间件,处理特定的需求。
Django 信号机制
Django 的信号机制允许不同部分的代码在某些事件发生时进行通信。信号是一种发布-订阅模式,常用于在模型保存、删除等操作时触发特定逻辑。
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User@receiver(post_save, sender=User)
def user_saved(sender, instance, created, **kwargs):if created:print(f'New user created: {instance.username}')
信号使得项目中的模块可以解耦,提升了代码的灵活性和可维护性。
Django Form 和 Template 引擎
Django 的表单系统通过 Form
类进行表单处理和验证,极大简化了表单数据的验证和处理流程。
from django import formsclass ContactForm(forms.Form):name = forms.CharField(max_length=100)email = forms.EmailField()message = forms.CharField(widget=forms.Textarea)
Django 的模板引擎允许开发者通过模板标签和过滤器来渲染动态内容,帮助分离业务逻辑和前端显示。
3. 🚀 FastAPI
FastAPI 是一个现代的、高性能的 Web 框架,专注于异步编程和快速开发。它提供了自动生成文档、数据验证等功能,非常适合开发高并发的 Web 应用和 API 服务。
FastAPI 核心概念(路由、请求模型、响应模型)
FastAPI 的路由与 Flask 类似,通过装饰器将 URL 路径与视图函数绑定。不同的是,FastAPI 提供了请求和响应模型,可以明确指定请求参数的类型和格式。
from fastapi import FastAPIapp = FastAPI()# 定义路由
@app.get('/')
def read_root():return {"message": "Welcome to FastAPI"}# 定义带参数的路由
@app.get('/hello/{name}')
def say_hello(name: str):return {"message": f"Hello, {name}!"}
FastAPI 通过 Pydantic 实现了强大的数据验证与序列化,开发者可以使用 Pydantic 模型定义请求和响应的数据结构,保证数据的一
致性和准确性。
from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str = Noneprice: float
Pydantic 数据验证与序列化
在 FastAPI 中,Pydantic 被用于验证请求数据,确保传入的数据符合预期格式和类型要求。
from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()# 定义请求模型
class Item(BaseModel):name: strprice: floatin_stock: bool = True@app.post("/items/")
def create_item(item: Item):return {"item": item}
Pydantic 会自动处理类型转换和验证,开发者无需手动处理数据的验证逻辑。
异步编程与并发处理
FastAPI 完全支持异步编程,开发者可以通过 async
关键字实现非阻塞的视图函数,从而有效处理并发请求。
import asyncio
from fastapi import FastAPIapp = FastAPI()@app.get('/async-task')
async def async_task():await asyncio.sleep(2)return {"message": "Async Task Completed!"}
通过异步编程,FastAPI 可以轻松处理数千个并发请求,极大提高了应用的性能。
FastAPI 中的依赖注入
FastAPI 提供了强大的依赖注入系统,开发者可以通过定义依赖函数,将常用的逻辑抽象出来并注入到多个路由函数中。
from fastapi import Depends, FastAPIapp = FastAPI()# 定义依赖函数
def get_token_header():return "Bearer token"# 路由中使用依赖
@app.get('/protected')
def protected_route(token: str = Depends(get_token_header)):return {"token": token}
依赖注入不仅提高了代码的复用性,还帮助开发者更好地组织和管理项目中的业务逻辑。
相关文章:

Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术
Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术 目录 🐍 Flask Flask 核心概念(路由、视图函数、模板渲染)Flask Blueprint 模块化应用Flask 扩展(Flask-SQLAlchemy、Flask-WTF、Flask-Migrate 等&#…...

【Qt网络编程基础】Tcp服务器和客户端(只支持一对一)
目录 一、编写思路 1、服务器 总体思路 详细思路 1. 构造函数 (Widget::Widget) 2. 启动监听 (Widget::on_btn_start_clicked) 3. 停止监听 (Widget::on_btn_cease_clicked) 4. 发送消息 (Widget::on_btn_info_clicked) 5. 接收消息 (Widget::receive_message) 6. 处…...

平台开发到落地详解:从食堂采购系统源码到可视化供应链管理数据大屏
随着数字化转型的加速,越来越多的企业和组织开始重视供应链的智能化与可视化管理。在食堂采购领域,供应链管理的复杂性与日俱增,而传统的手工操作往往效率低下、容易出错。因此,开发食堂采购系统并结合可视化数据大屏的解决方案&a…...

静态内部类
目录 一、什么是静态内部类二、静态内部类的意义 一、什么是静态内部类 在 Java 中,静态内部类(也称为静态嵌套类)是定义在一个类内部的类,但它与外部类没有关联,即它不持有外部类的引用。静态内部类可以访问外部类的…...

Vue+SpringBoot+数据库整体开发流程 1
本篇文章通过springboot整合mybatis-plus去实现后端对数据库的增删改查,以及响应给前端的url,让前端获得数据。 目录 一、简单搭建一个Vue项目 检查node.js版本 使用vue-cli创建空项目 Vue-cli工程中每个文件夹和文件的用处 二、Mysql数据库 创建数…...

百度Apollo打通与ROS的通信,扩展自动驾驶系统生态
技术文档|打通与ROS的通信,扩展自动驾驶系统生态_Apollo开发者社区 (baidu.com)...

Web3 项目安全手册
现如今针对 Web3 项目的攻击手法层出不穷,且项目之间的交互也越发复杂,在各个项目之间的交互经常会引入新的安全问题,而大部分 Web3 项目研发团队普遍缺少的一线的安全攻防经验,并且在进行 Web3 项目研发的时候,重点关…...

AI边缘计算在安防领域的智能化革新:赋能安防系统的智能化升级
随着人工智能(AI)和边缘计算技术的快速发展,两者在安防视频领域的应用日益广泛,为传统安防系统带来了革命性的变革。AI边缘计算技术通过将AI算法和模型部署在边缘设备上,实现了数据处理和智能决策的即时响应࿰…...

vscode配置C/C++环境(保姆级详细教程)
一. 引言 VSCode,全称为Visual Studio Code,是一款由微软开发的免费、开源的轻量级代码编辑器,它支持多种编程语言和平台,并提供丰富的扩展功能,让开发者能够更高效地编写代码。 大家能来搜用如何在VSCode配置C/C环境…...

MDK keil STM32 局部变量不能查看值,显示为not in scope
用MDK调试程序,查看变量时watch窗口总是和 一、方法1:优化级别改为Level 0 1 编译器把这个局部变量给优化掉了,并没有在内存中生成,把优化级别改为Level 0,重新编译。 Keil默认优化是等级3,最高优化&…...

表连接查询之两个left join与递归SQL
一、如下SQL1 SELECT i.*,su1.name as createName,su2.name as updateNameFROM information ileft join sys_user su1 on su1.idi.create_idleft join sys_user su2 on su2.idi.update_id 二、分析 1、SELECT i.*,su.name as createName,sua.name as updateName FROM informati…...

2024.9.10
打的模拟赛难度很大,T1就2200分? 其中转化成差分数组上的问题很巧妙 还用了将数分成2的多次方的形式,这种套路在最近的几场比赛和题中都见到过,值得归纳一下 T3是长链剖分和对顶堆维护,太难写了还没写出来 T4仍然是概率题,但是并没有见过类似的出题方式,其中关键是:最大独…...

22_图论中的高级数据结构
菜鸟:老鸟,我最近在处理一个网络节点数据的问题,发现代码运行得特别慢。你能帮我看看有什么优化的方法吗? 老鸟:当然可以。你处理的是图结构对吗?你是如何存储和操作这些节点的? 菜鸟…...

axure判断
在auxre中我们也可以实现判断的功能,当目标等于什么内容时则执行下方的功能。 一、判断输入框中是否有值 画布添加一个输入框、一个文本标签删除其中内容,添加一个按钮,输入框命名为【文本显示】文本标签命名为【提示】 给按钮新增一个交互…...

【开源大模型生态7】华为的盘古大模型
鹏程盘古模型是全球首个全开源2000亿参数的自回归中文预训练语言大模型,在知识问答、知识检索、知识推理、阅读理解等文本生成领域表现突出。 2070亿参数,64层。 这里注意几个概念。 参数(Parameters): 参数是指构成模…...

SprinBoot+Vue远程教育网站的设计与实现
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…...

docker的基本操作
目录 一,应用部署 创建容器 进入容器 创建有端口的容器 通过ssh进入容器 二、镜像操作 搜索镜像 拉取镜像 查看本地镜像 删除镜像 导入镜像 三、容器操作 创建并启动容器 使用 docker run 命令创建并启动一个容器 创建一个有端口号的容器 查看正在运…...

理解 RabbitMQ:生产者、连接、通道、交换机、队列与消费者的消息流
在分布式消息系统中,RabbitMQ 是一个非常流行的消息代理。它的核心理念是解耦应用程序的生产者和消费者,使得消息能够可靠地从一方传递到另一方。本文将带你深入了解 RabbitMQ 中 生产者、连接、通道、交换机、队列 和 消费者 之间的消息流,并…...

【截图服务 +打包】pkg打包 puppeteer
目录 最后结论 windows打包成服务 定制executablePath 服务遇到的问题 使用java开一个线程启动 遇到的问题与解决 版本匹配问题 打出包后的运行报错问题 linux下的安装 安装n 库缺少 程序运行后的报错 制作 运行报错与修改后成功 参考文档 最后结论 pkg -t win…...

深入理解Servlet的并发处理机制小波制图流程图
在Java Web开发中,Servlet是处理HTTP请求的核心组件。理解Servlet如何处理并发请求对于开发高性能Web应用至关重要。本文将深入探讨Servlet的生命周期、实例化过程以及多线程处理机制。 Servlet的生命周期和实例化 Servlet遵循单例模式,对于每个Servle…...

Ajax和XMLHttpRequest之间的关系
Ajax和XMLHttpRequest之间的关系是非常密切的。Ajax(Asynchronous JavaScript and XML)是一种网页开发技术,用于创建交互式的应用程序或网站。而XMLHttpRequest是Ajax的核心技术之一。 XMLHttpRequest:这是一个JavaScript对象&…...

Linxu系统:kill命令
1、命令详解: kill命令是用于向进程发送信号,通常用来终止某个指定PID服务进程,kill命令可以发送不同的信号给目标进程,来实现不同的操作,如果不指定信号,默认会发送 TERM 信号(15)&…...

解决缺少genconfig
编译鸿蒙L0系统时,遇到报错: [OHOS INFO] Returned 127. [OHOS INFO] stderr: [OHOS INFO] [OHOS INFO] env: “genconfig”: 没有那个文件或目录 [OHOS INFO] [OHOS INFO] See //kernel/liteos_m/BUILD.gn:34:1: whence it was imported. [OHOS INFO] …...

百易云资产管理运营系统 house.save.php SQL注入漏洞
1 产品简介 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能,帮助企业…...

【安卓13 源码】Input子系统(3) - EventHub增加设备的流程
由前面的分析知道,在创建inputreader 线程的时候,会去循环执行 looponce 方法。主要的处理工作是: 通过 getEvents() 从 EventHub 获取未处理的事件,这些事件分为两类:一类是原始输入事 件即从设备节点中读取出的原始…...

基于JAVA+SpringBoot+Vue的网上商城系统的设计与实现
基于JAVASpringBootVue的网上商城系统的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接…...

Mysql基础练习题 1729.求关注者的数量 (力扣)
编写解决方案,对于每一个用户,返回该用户的关注者数量。 #按 user_id 的顺序返回结果表 题目链接: https://leetcode.cn/problems/find-followers-count/description/ 建表插入语句: Create table If Not Exists Followers(us…...

【鸿蒙HarmonyOS NEXT】页面和自定义组件生命周期
【鸿蒙HarmonyOS NEXT】页面和自定义组件生命周期 一、环境说明二、页面和自定义组件生命周期三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、页面和自定义组件生命周期 需要明确几个概念: 页面…...

Node.js Express 框架
Node.js Express 框架 介绍 Express 是一个快速、开放、极简的 Node.js Web 框架。它为构建 Web 应用程序和服务提供了一个强大的工具集,使得开发过程更加高效和便捷。Express 的设计哲学是提供一个最小的 API,让开发者可以轻松地构建自定义的 Web 应用程序。它被广泛用于构…...

生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute
可以录音播放的生日贺卡与传统的纸质贺卡相比,它有着创意以及个性的特点,仅需少量的电子元器件,即可实现录音功能,搭配上文字,让声音存储在生日贺卡里,让贺卡也变得有温度,祝福我想亲口对TA说。…...