Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术

news/2024/9/19 18:48:03/ 标签: python, 前端, flask, fastapi, django, 开发语言, 后端

Python Web 框架篇:Flask、Django、FastAPI介绍及其核心技术

目录

  1. 🐍 Flask
    • Flask 核心概念(路由、视图函数、模板渲染)
    • Flask Blueprint 模块化应用
    • Flask 扩展(Flask-SQLAlchemy、Flask-WTF、Flask-Migrate 等)
  2. 🌍 Django
    • Django 项目架构
    • Django ORM 及模型定义
    • Django 中间件
    • Django 信号机制
    • Django Form 和 Template 引擎
  3. 🚀 FastAPI
    • FastAPI 核心概念(路由、请求模型、响应模型)
    • Pydantic 数据验证与序列化
    • 异步编程与并发处理
    • FastAPI 中的依赖注入

1. 🐍 Flask

Flask 是一个轻量级的 Python Web 框架,以其灵活、简单且易于扩展的特性深受开发者的青睐。通过 Flask,可以快速创建并部署 Web 应用,同时保留对项目结构的高度控制。其核心概念包括路由、视图函数和模板渲染等。

Flask 核心概念(路由、视图函数、模板渲染)

路由是 Flask 的基础,通过 @app.route() 装饰器将 URL 与对应的视图函数绑定。每当用户访问该 URL,Flask 就会执行相应的视图函数并返回结果。

python">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 应用。

python">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 库,简化了与数据库的交互。

python">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 会自动生成对应的数据库表。

python">from django.db import modelsclass User(models.Model):username = models.CharField(max_length=100)email = models.EmailField()

通过 ORM,开发者可以使用 Python 代码直接操作数据库,而不需要编写 SQL 语句。

Django 中间件

中间件是 Django 请求处理链中的关键组件,它可以在请求到达视图之前或响应发出之前对其进行修改。Django 提供了多种内置中间件,如身份验证、跨站点请求伪造(CSRF)保护等。

python"># settings.py
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',
]

开发者还可以自定义中间件,处理特定的需求。

Django 信号机制

Django 的信号机制允许不同部分的代码在某些事件发生时进行通信。信号是一种发布-订阅模式,常用于在模型保存、删除等操作时触发特定逻辑。

python">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 类进行表单处理和验证,极大简化了表单数据的验证和处理流程。

python">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 提供了请求和响应模型,可以明确指定请求参数的类型和格式。

python">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 模型定义请求和响应的数据结构,保证数据的一

致性和准确性。

python">from pydantic import BaseModelclass Item(BaseModel):name: strdescription: str = Noneprice: float

Pydantic 数据验证与序列化

在 FastAPI 中,Pydantic 被用于验证请求数据,确保传入的数据符合预期格式和类型要求。

python">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 关键字实现非阻塞的视图函数,从而有效处理并发请求。

python">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 提供了强大的依赖注入系统,开发者可以通过定义依赖函数,将常用的逻辑抽象出来并注入到多个路由函数中。

python">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}

依赖注入不仅提高了代码的复用性,还帮助开发者更好地组织和管理项目中的业务逻辑。


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

相关文章

Centos7.9部署Gitlab-ce-16.9

一、环境信息 软件/系统名称版本下载地址备注Centos77.9.2009https://mirrors.nju.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.isogitlab-cegitlab-ce-16.9.1https://mirror.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-16.9.1-ce.0.el7.x86_64.rpm…

半监督学习能否帮助训练更好的模型?

数据科学家面临的最常见挑战之一是缺乏足够的标记数据来训练一个可靠且准确的模型。标记数据对于监督学习任务&#xff0c;如分类或回归至关重要。然而&#xff0c;在许多领域&#xff0c;获取标记数据既昂贵又耗时&#xff0c;有时甚至是不切实际的。另一方面&#xff0c;未标…

CSS学习18--伸缩布局

伸缩布局 一、伸缩布局二、属性设置 一、伸缩布局 给父级display: flex; 给孩子flex: 1; 自由变动 <html><head><style>section {width: 1000px;height: 200px;border:1px solid pink;margin:100px auto;/*父级盒子添加f1ex*/dispLay:flex;/*伸缩布局模式*/…

HW | AMD GPU上 “nvidia-smi -lms” 的等价指令——MI300X实时查看GPU使用率

文章目录 .实验背景.nvidia-smi -lms.rocm-smi 等价指令.结语. . 实验背景 最近在使用AMD MI300X GPU进行实验&#xff0c;MI300X是目前AMD最先进的几款数据中心GPU之一。该GPU的软件指令和NVIDIA的不同&#xff0c;主要因为底层的驱动命名不同&#xff08;在我理解确实是这样…

小型洗衣机什么牌子好又便宜?五款备受好评机型测评,闭眼入

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

HarmonyOs 应用基础--Swiper-样式结构重用-GridGridItem

目录 九、Swiper-样式&结构重用-Grid&GridItem 1. Swiper 1.1. 适用场景 1.2. 基本用法 1.3. 常用属性方法 1.4. 调整导航点 1.5. 案例-小米有品 2. 样式&结构重用 2.1. Styles 2.2. Extend 2.3. Builder 2.4. Extend、Styles、Builder 对比 3. 网格布…

opencv图像透视处理

引言 在图像处理与计算机视觉领域&#xff0c;透视变换&#xff08;Perspective Transformation&#xff09;是一种重要的图像校正技术&#xff0c;它允许我们根据图像中已知的四个点&#xff08;通常是矩形的四个角&#xff09;和目标位置的四个点&#xff0c;将图像从一个视…

C语言---循环程序设计万字总结(2)

选择、循环结构 最简单的结构是 if-else &#xff08;类比日常生活中 如果…否则…&#xff09; 其次&#xff0c; switch&#xff0c; 最后是三大循环结构&#xff0c; while do-while for 选择、循环结构是后续学习的基石&#xff0c; 尤其是与数组和指针 关联性很强 一、选…

Python\Scripts文件夹中只有pip3.exe而缺少pip.exe

解决办法&#xff1a; 以管理员身份运行命令提示符 执行如下命令 mklink D:\Python\Scripts\pip.exe D:\Python\Scripts\pip3.exe&#xff08;命令中的路径应填入你的Python安装路径&#xff0c;并且Python\Scripts路径也正常放入系统变量中&#xff09; 然后就可以检查你的…

美团面试题:生成字符串的不同方式

美团面试题:生成字符串的不同方式 引言问题分析动态规划思路伪代码C代码实现代码解析复杂度分析优化建议结论引言 小红拿到了一个空字符串 s s s,她希望通过两种操作生成一个给定的字符串 t t t。我们需要计算生成字符串

springboot项目编写发送异常日志到企微工具包

1.创建基础Bean public final class ThreadFactory implements java.util.concurrent.ThreadFactory {private static final AtomicInteger poolNumber new AtomicInteger(1);private final ThreadGroup group;private final AtomicInteger threadNumber new AtomicInteger(1…

学校不会教的找工作信息差,靠谱招聘网站分享给你

1、国家大学生就业服务平台 2、中国公共招聘网 3、中国国家人才网

机器学习 第10章 降维与度量学习

目录 k近邻学习低维嵌入主成分分析&#xff08;PCA&#xff09;核化线性降维&#xff08;KPCA&#xff09;流形学习等度量映射&#xff08;Isomap&#xff09;局部线性嵌入 度量学习 k近邻学习 k 近邻&#xff08;KNN&#xff09;学习是一种常用的监督学习方法&#xff0c;其工…

3.无人机介绍

学习无人机相关科研知识,首先要了解无人机的相关知识,以及无人机系统的组成. 目录 无人机初步介绍 无人机分类 无人机初步介绍 无人驾驶飞机简称“无人机”&#xff0c;英文缩写为"UAV"&#xff0c;是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机&am…

基于协同过滤算法+SpringBoot+Vue+MySQL的商品推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及…

新手常见错误:java.lang.NumberFormatException: For input string: “xxxx“

目录 ​编辑 故事背景 文言一心解答&#xff1a; 思考&#xff1a; 文心一言总结&#xff1a; 报错总结&#xff1a; 解决方案&#xff1a; 结语&#xff1a; 故事背景 写代码的时候遇到的报错 文言一心解答&#xff1a; 这个错误 java.lang.NumberFormatException:…

OpenCV 与 YoloV3的结合使用:目标实时跟踪

目录 代码分析 1. YOLO 模型加载 2. 视频加载与初始化 3. 视频帧处理 4. 物体检测 5. 处理检测结果 6. 边界框和类别显示 7. 帧率&#xff08;FPS&#xff09;计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO&#xff08…

机器学习和深度学习的区别是什么?

目录 前言1. 定义与起源2. 模型复杂度3. 数据需求4. 计算资源需求5. 应用范围和场景6. 学习方式与特点总结 前言 机器学习和深度学习在多个方面存在显著差异&#xff0c;这些差异主要体现在定义与起源、模型复杂度、数据需求、计算资源需求、应用范围和场景&#xff0c;以及学…

Maven聚合与继承

聚合 当我们一次想要构建多个项目时&#xff0c;而不是到每一个模块的目录下分别执行mvn命令。这个时候就需要使用到maven的聚合特性 这里第一个特殊的地方是packaging&#xff0c;值设置为pom。我们正常开发的其他模块中都没有声明packaging&#xff0c;默认使用了默认值jar&a…

【论文阅读】DETRs Beat YOLOs on Real-time Object Detection

文章目录 摘要一、介绍二、相关工作2.1 实时目标检测器2.2 端到端目标检测器 三、检测器的端到端速度3.1 分析 NMS3.2 端到端速度基准 四、实时 DETR4.1 模型概述4.2 高效混合编码器4.3不确定性最小的查询选择4.4 缩放的RT - DETR 五、实验5.1 与SOTA对比5.2 混合编码器的消融研…