蓝图
为什么要使用蓝图
  1. 模块化组织:将应用分解为可重用的模块(组件)。每个蓝图封装了相关的视图、静态文件、模板等。

  2. 按功能划分:将大型应用按功能模块划分(例如:用户认证、博客、管理后台),每个功能一个蓝图。

  3. 路由分组:将相关联的路由组合在一起,形成逻辑单元,避免所有路由都堆积在主应用文件中。

  4. 动态注册:蓝图可以先定义后注册,在应用初始化时再注册到应用实例上,适合工厂模式。

  5. 代码复用:同一个蓝图可以在多个Flask应用中使用,实现代码复用。

  6. URL前缀管理:注册蓝图时可设置统一URL前缀(如所有用户相关路由都以/user开头)。

  7. 独立模板/静态文件:每个蓝图可以有自己的模板目录和静态文件目录。

  8. 中间件作用域:蓝图可以有自己的请求钩子(before_request, after_request等),只对自身注册的路由生效。

  9. 解决视图命名冲突:不同蓝图可以有相同命名的视图函数(通过蓝图名.函数名区分)。

开始使用
  • 基础项目结构

    simple_flask_app/
    ├── app.py          # 主应用文件
    ├── blueprints/
    │   ├── main.py     # 主蓝图
    │   └── user.py     # 用户蓝图
    ├── templates/      # 模板文件
    │   ├── home.html     # 主蓝图页面
    │   └── users.html     # 用户页面
  • 创建app.py文件作为项目主入口文件

    from flask import Flask
    from blueprints.main import main_bp
    from blueprints.user import user_bp
    ​
    # 创建Flask应用
    app = Flask(__name__)
    ​
    # 注册蓝图
    app.register_blueprint(main_bp, url_prefix='/')        # 主蓝图使用根路径
    app.register_blueprint(user_bp, url_prefix='/users')    # 用户蓝图使用/users前缀
    ​
    # 运行应用
    if __name__ == '__main__':app.run(debug=True, port=5000)

创建蓝图
  • 在blueprints文件夹中,创建main.py和user.py文件,用于不同模块的蓝图路由

  • main.py

  • from flask import Blueprint, render_template
    ​
    # 创建主蓝图
    '''第一个参数:'main' (蓝图名称)这是蓝图的标识名,必须是唯一的字符串,用于:在应用中识别这个特定的蓝图在 url_for() 函数中引用该蓝图的端点在应用的其他部分访问这个蓝图
    '''
    main_bp = Blueprint('main', __name__)
    ​
    ​
    # 主蓝图的路由
    @main_bp.route('/')
    def home():return render_template('home.html')
    ​
    ​
    @main_bp.route('/about')
    def about():return "<h1>关于我们</h1><p>这是关于我们的页面</p>"
    ​
    ​
    @main_bp.route('/contact')
    def contact():return "<h1>联系我们</h1><p>电话: 123-456-7890</p>"
    ​

  • user.py

  • from flask import Blueprint, render_template
    ​
    # 创建用户蓝图
    user_bp = Blueprint('user', __name__)
    ​
    ​
    # 用户蓝图的路由
    @user_bp.route('/')
    def user_home():return render_template('users.html')
    ​
    ​
    @user_bp.route('/profile')
    def profile():return "<h1>用户资料</h1><p>这是用户的个人资料页面</p>"
    ​
    ​
    @user_bp.route('/dashboard')
    def dashboard():return "<h1>控制面板</h1><p>用户控制面板内容</p>"
创建视图页面
  • 在templates中,创建home.html文件,用于主蓝图的显示和跳转效果的演示

  • 下述代码中{{user.xxx}}或者{{main.xxx}}前缀名称是在创建蓝图的时候设置的,main_bp = Blueprint('main', __name__)

  • home.html页面

  • <!DOCTYPE html>
    <html>
    <head><title>首页</title><style>body {font-family: Arial, sans-serif;margin: 40px;}nav {background: #f0f0f0;padding: 10px;margin-bottom: 20px;}nav a {margin-right: 15px;text-decoration: none;color: #333;}</style>
    </head>
    <body><nav><a href="{{ url_for('main.home') }}">首页</a><a href="{{ url_for('main.about') }}">关于</a><a href="{{ url_for('main.contact') }}">联系</a><a href="{{ url_for('user.user_home') }}">用户主页</a><a href="{{ url_for('user.profile') }}">用户资料</a></nav>
    ​<h1>欢迎来到主页</h1><p>这是一个使用 Flask 蓝图的简单示例。</p>
    ​<h2>项目结构</h2><ul><li>主蓝图处理网站主要页面</li><li>用户蓝图处理所有用户相关页面</li><li>蓝图使用URL前缀进行分组</li></ul>
    </body>
    </html>

  • users.html页面

  • <!DOCTYPE html>
    <html>
    <head><title>用户主页</title><style>body {font-family: Arial, sans-serif;margin: 40px;}nav {background: #e0f7fa;padding: 10px;margin-bottom: 20px;}nav a {margin-right: 15px;text-decoration: none;color: #00796b;}.user-section {border-left: 4px solid #00796b;padding-left: 15px;margin-top: 20px;}</style>
    </head>
    <body><nav><a href="{{ url_for('main.home') }}">返回首页</a><a href="{{ url_for('user.user_home') }}">用户主页</a><a href="{{ url_for('user.profile') }}">用户资料</a><a href="{{ url_for('user.dashboard') }}">控制面板</a></nav>
    ​<h1>用户主页</h1><p>这是用户蓝图的首页。</p>
    ​<div class="user-section"><h2>用户蓝图功能</h2><p>所有用户相关的功能都在此蓝图中实现:</p><ul><li>用户资料管理</li><li>控制面板</li><li>用户设置(待添加)</li></ul></div>
    </body>
    </html>

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

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

相关文章

设计模式详解

1.创建类型1.1 简单工厂startuml抽象产品接口 interface Product { Operation(): string } 具体产品A class ConcreteProductA { Operation(): string } 具体产品B class ConcreteProductB { Operation(): string } 工厂类 class Factory { CreateProduct(type: string): Produ…

前端查漏补缺

插槽默认、具名&#xff08;多个插槽&#xff09;、作用域&#xff08;接收子组件数据&#xff09;//具名 <div class"container"><header><slot name"header"></slot></header><main><slot></slot></…

网络协议UDP、TCP

一、网络协议 UDPUDP用户数据报协议&#xff1a;传输层网络编程模型B/S模型&#xff1a;browser/server&#xff08;浏览器/服务器&#xff09;客户端是通用的客户端&#xff08;浏览器&#xff09;一般只做服务器开发客户端要加载的数据均来自服务器C/S模型&#xff1a;client…

STM32 TIM_SelectInputTrigger()函数

一、函数功能与定位​TIM_SelectInputTrigger()是STM32定时器外设的关键配置函数&#xff0c;用于设置从模式定时器的触发源&#xff08;Trigger Source&#xff09;​。其核心作用是将定时器的内部事件或外部信号映射为触发信号&#xff08;TRGI&#xff09;&#xff0c;进而控…

Lecture 6 Kernels, Triton 课程笔记

本讲座&#xff1a;基准测试/分析 编写内核 总结 编程模型&#xff08;PyTorch、Triton、PTX&#xff09;与硬件之间的差距 > 性能奥秘 理解扩展的基准测试 用于理解 PyTorch 函数内部结构的分析&#xff08;用内核触底&#xff09; 看 PTX 汇编&#xff0c;了解 CUDA 内核…

Spring Boot 整合网易163邮箱发送邮件实现找回密码功能

在开发用户系统时&#xff0c;发送邮件是一项常见需求&#xff0c;例如用户忘记密码时&#xff0c;通过邮箱发送验证码来验证身份并重置密码。本文将结合 Spring Boot 和 163 邮箱&#xff0c;演示如何实现邮件发送功能。 一、前提条件 普通用户的 163 邮箱可以在 Spring Boot…

如何在mac玩windows游戏?3个工具推荐,不用换电脑!

Mac电脑虽然很流畅&#xff0c;但它也存在局限性&#xff0c;其中一点游戏玩家应该深有体会&#xff0c;那就是无法直接玩Windows专属游戏&#xff0c;只能对着琳琅满目的游戏望眼欲穿。别急&#xff0c;我有办法让你在mac玩windows游戏&#xff0c;下面就来分享我的经验。一、…

自回归(Auto-Regressive, AR),自回归图像生成过程

根据论文中“**T2I Generation via Next-Token Prediction**”一节&#xff0c;自回归&#xff08;Auto-Regressive, AR&#xff09;文本到图像&#xff08;T2I&#xff09;模型的图像生成过程可分为三个主要步骤&#xff0c;其原理和损失函数如下&#xff1a;---### &#x1f…

在mysql中,modify ,change ,rename to的作用是什么

在 MySQL 中&#xff0c;MODIFY、CHANGE 和 RENAME TO 都是 ALTER TABLE 语句的一部分&#xff0c;用于修改表的结构&#xff0c;但它们的作用和使用场景有所不同。1. MODIFY作用&#xff1a;用于修改表中现有列的定义&#xff0c;但不能修改列名。你可以使用 MODIFY 来更改列的…

【JVM】JVM的内存结构是怎样的?

JVM的内存结构是Java程序运行时内存管理的核心&#xff0c;不同区域有明确的职责。 一、整体划分 包括两大部分&#xff0c;分为线程私有区域(随线程创建/销毁&#xff0c;无需垃圾回收)和线程共享区域(所有线程共用&#xff0c;需要垃圾回收管理)。 线程私有区域&#xff1a;程…

青少年软件编程(python五级)等级考试试卷-客观题(2023年12月)

更多内容和历年真题请查看网站&#xff1a;【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 五级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年软件编程&#xff08;python五级&#xff09;等级考试试卷-客观题&#xff08;2023年12月&#xff0…

网络编程-创建TCP协议服务器

int socket(int domain, int type, int protocol);头文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用户

分配用户&#xff0c;不要将当前正在登录的用户绑定。否则&#xff0c;在加入当前用户之后&#xff0c;取消或者添加其他用户时会被注销当前登录。

Java Stream常见函数与应用案例

1. Java Stream核心概念与基础函数 1.1 Stream API的设计哲学与核心特性 Java Stream API的设计哲学源于函数式编程范式&#xff0c;其核心特性体现在数据处理模式的转变上。与传统集合操作相比&#xff0c;Stream API采用声明式编程风格&#xff0c;支持链式调用&#xff0c;显…

【Canvas与徽章】中国制造金色玻璃光徽章

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中国制造金色玻璃光徽章 Draft1</title><style type"tex…

终结系统裸奔:Debian老旧版本安全加固终极指南

核心警示:Debian 8与10已结束官方支持,暴露于0day漏洞风险中。本文提供的加固方案仅为迁移前的临时防护措施,非长久之计。 一、老旧Debian系统的致命隐患 支持状态: Debian 8(Jessie):2018年终止安全更新 Debian 10(Buster):2024年7月结束主流支持 风险清单: 无补…

Ape.Volo项目源码学习(1:源码下载及运行)

Ape.Volo项目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分离开箱则用的中后台快速开发框架&#xff0c;其使用Async/Await异步编程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息队列、CORS 跨域配置、数据库操作&#xff08;读写分离、多库、分表&#xff09;、支…

2-4.Python 编码基础 - 流程控制(判断语句、循环语句、break 语句与 continue 语句)

一、判断语句 1、if 语句 &#xff08;1&#xff09;基本格式 if 【判断条件】:【满足条件时执行的代码块】&#xff08;2&#xff09;演示 number 10if number > 0:print("这个数是正数")# 输出结果这个数是正数2、if - else 语句 &#xff08;1&#xff09;基本…

大模型自我进化框架SE-Agent:开启软件工程自动化新时代

一、引言&#xff1a;当大模型学会“自我进化” 在软件开发领域&#xff0c;传统模式下人类工程师面对复杂任务时&#xff0c;往往需要经历反复调试、多轮迭代才能产出高质量代码。而随着大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;一种名为**SE-Agent&#xff…

UE官方文档学习 C++ TAarry 查询(四)多种查询方式

一.IndexofByKey 返回索引通过值&#xff0c;返回来查找键。二IndexOfByPredicate通过定义二元谓词&#xff0c;来判定是否有符合谓词判定的元素。符合条件True的&#xff0c;才返回Index。这里所谓Lamda,函数就是 把函数当作参数输入&#xff0c;里面的参数值传递前加个[]。这…