flask中的蓝图

news2024/9/24 19:22:32

在这里插入图片描述

flask中的蓝图

在 Flask 中,蓝图(Blueprint)是一种组织路由和服务的方法,它允许你在应用中更灵活地组织代码。蓝图可以大致理解为应用或者应用中的一部分,可以在蓝图中定义路由、错误处理程序以及静态文件等。然后可以在工厂函数中多次注册同一个蓝图到应用上,可以用URL前缀和/或子域来区分。

蓝图的主要用途是:

  1. 在一个应用内部划分逻辑组件,例如在一个大的系统中可能会有用户认证、电子邮件、资产等不同的组件,每个组件可以用一个蓝图来实现。
  2. 在一个中大型的项目中,可以用蓝图来做到模块化,每个蓝图都可以在一个独立的模块(Python的模块,即一个.py文件或者一个包)中定义和实现。
  3. 复用性:可以在不同的应用中复用蓝图。

下面是一个简单的蓝图的创建和注册的例子:

# 在你的模块里创建一个蓝图
from flask import Blueprint
bp = Blueprint('my_blueprint', __name__)

# 在蓝图上定义路由和其他代码
@bp.route('/')
def index():
    return 'Hello, Blueprint!'

# 在你的应用创建时,注册这个蓝图
from flask import Flask
from yourmodule import bp

app = Flask(__name__)
app.register_blueprint(bp)

在这个例子中,你首先创建了一个蓝图,并在上面定义了一个路由。然后,你在创建 Flask 应用时注册了这个蓝图。

用户登录蓝图

from flask import Blueprint, request, session, redirect, url_for, render_template

# 创建一个蓝图
auth = Blueprint('auth', __name__)

# 登录视图
@auth.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        
        # 这里为了简单,我们假设用户名是'user',密码是'password'
        # 实际上,你需要去数据库中验证用户名和密码
        if username == 'user' and password == 'password':
            session['username'] = username
            return redirect(url_for('index'))
        else:
            return 'Invalid username or password'
    else:
        return render_template('login.html')

# 登出视图
@auth.route('/logout')
def logout():
    if 'username' in session:
        session.pop('username')
    return redirect(url_for('index'))

这个蓝图可以在你的应用中使用register_blueprint函数进行注册:

from flask import Flask
from your_module import auth  # 从你的模块导入蓝图

app = Flask(__name__)
app.register_blueprint(auth, url_prefix='/auth')

其中,your_module 需要替换为你的蓝图定义的模块名。url_prefix='/auth'意味着所有注册的路由都会添加一个前缀/auth,所以你的登录和登出URL将分别变为/auth/login/auth/logout

复用蓝图

你只需要将蓝图定义在一个模块中,然后在需要的地方导入并注册这个蓝图就可以了。

举个例子,假设我们已经在auth_module.py模块中定义了上面的auth蓝图:

# auth_module.py
from flask import Blueprint, request, session, redirect, url_for, render_template

auth = Blueprint('auth', __name__)

@auth.route('/login', methods=['GET', 'POST'])
def login():
    # ...
    
@auth.route('/logout')
def logout():
    # ...

然后,你可以在你的多个Flask应用中导入并注册这个蓝图:

# app1.py
from flask import Flask
from auth_module import auth

app1 = Flask(__name__)
app1.register_blueprint(auth, url_prefix='/auth')

# app2.py
from flask import Flask
from auth_module import auth

app2 = Flask(__name__)
app2.register_blueprint(auth, url_prefix='/auth')

在这个例子中,auth蓝图被复用在了两个不同的Flask应用中。在每个应用中,所有的路由都会添加一个/auth的前缀。

所以,要复用一个蓝图,你只需要将蓝图定义在一个模块中,然后在需要的地方导入并注册这个蓝图就可以了。

蓝图路由

当我们在蓝图中定义路由时,生成这些路由的URL需要使用蓝图的名字作为前缀。这样可以避免不同蓝图中的视图函数名发生冲突。以下是一个例子:

首先,我们定义两个蓝图,分别为authmain

# auth.py
from flask import Blueprint, redirect, url_for

auth = Blueprint('auth', __name__)

@auth.route('/login')
def login():
    return "Login Page"

# main.py
from flask import Blueprint, redirect, url_for

main = Blueprint('main', __name__)

@main.route('/')
def index():
    return redirect(url_for('auth.login'))  # 重定向到auth蓝图的login视图

然后,在主程序中注册这两个蓝图:

# app.py
from flask import Flask
from auth import auth
from main import main

app = Flask(__name__)
app.register_blueprint(auth, url_prefix='/auth')
app.register_blueprint(main)

在这个例子中,我们在main蓝图的index视图中生成了一个URL,这个URL指向auth蓝图的login视图。生成这个URL的代码是url_for('auth.login'),其中,auth是蓝图的名字,login是视图函数的名字。这行代码会生成一个/auth/login的URL。

注意,url_for函数生成的URL是相对于应用根URL的。如果你在注册蓝图时添加了一个URL前缀,这个前缀也会被添加到生成的URL中。例如,在上面的例子中,我们在注册auth蓝图时添加了一个/auth的前缀,所以url_for('auth.login')生成的URL是/auth/login

在Flask中,url_for函数用于生成URL。在其最简单的形式中,你可以传递一个视图函数的名字,然后它会返回对应的URL。例如,如果你有一个名为login的视图函数,你可以使用url_for('login')来生成对应的URL。

然而,当你开始使用蓝图时,情况就会变得有些复杂。这是因为你可能会在不同的蓝图中使用相同的视图函数名。为了避免冲突,Flask在内部为每个蓝图中的视图函数添加了一个前缀,这个前缀就是蓝图的名字。所以,如果你在auth蓝图中有一个名为login的视图函数,你需要使用url_for('auth.login')来生成对应的URL。

实际上,'auth.login'只是一个字符串,Flask会在内部将它解析为蓝图的名字和视图函数的名字。

所以,当你在使用url_for函数时,你需要记住:

  • 如果你在主应用中(也就是没有使用蓝图的情况下),你可以直接使用视图函数的名字,例如url_for('login')
  • 如果你在蓝图中,你需要在视图函数的名字前添加蓝图的名字和一个点,例如url_for('auth.login')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vcruntime140_1.dll无法继续执行代码重新安装方法

cruntime140_1.dll是Windows操作系统中的一个动态链接库文件,它包含了一些与C运行时相关的函数和资源。在Windows系统中,许多应用程序和游戏都依赖于vcruntime140_1.dll文件来正常运行。当系统中缺少或损坏了vcruntime140_1.dll文件时,就会出…

Unity源码分享-黄金矿工游戏完整版

Unity源码分享-黄金矿工游戏完整版 项目地址:https://download.csdn.net/download/Highning0007/88118933

flask创建数据库连接池

flask创建数据库连接池 在Python中,您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装,实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系…

superset为何无法上传excel,csv等外部文件

superset为何无法上传excel,csv等外部文件 这是由于没有打开数据库的上传外部文件的权限 1.打开数据库连接设置,选择Allow file uploads to database 2.发现这里的上传链接都可以使用

HTML+CSS+JavaScript:实现京东官网固定导航栏

一、需求 在京东官网首页,只要页面滚动到京东秒杀倒计时的位置,顶部的导航栏就会自动出现且固定在窗口最上方,如下图 我们将模仿京东官网的效果,做一个简易的固定导航栏,如下图 二、代码素材 以下是缺失JS部分的代码…

你应该知道的关于PCB布线的31条建议

1、走线长度应包含过孔和封装焊盘的长度。 2、布线角度优选135角出线方式,任意角度出线会导致制版出现工艺问题。 图1 PCB布线的角度 3、布线避免直角或者锐角布线,导致转角位置线宽变化,阻抗变化,造成信号反射,如图2…

AVL/B-/+ Tree查找

文章目录 0 树表的查找1 二叉排序树1.1 二叉排序树的操作1.1.1 二叉排序树的存储1.1.2 二叉排序树的递归查找1.1.3 二叉排序树的插入1.1.4 二叉排序树的生成1.1.5 二叉排序树的删除 1.2 二叉排序树的查找性能分析 2 平衡二叉树(AVL树)2.1 失衡二叉排序树…

WEB:web2

背景知识 代码审计 题目 由上述可知,这段代码定义了一个函数encode,接受一个字符串参数$str,并返回对其进行加密后的结果 加密算法包括: 使用strrev函数将字符串进行翻转;对翻转后的每个字符,将其ASCII值…

【playbook】Ansible的脚本----playbook剧本

Ansible的脚本----playbook剧本 1.playbook剧本组成2.playbook剧本实战演练2.1 实战演练一:给被管理主机安装Apache服务2.2 实战演练二:使用sudo命令将远程主机的普通用户提权为root用户2.3 实战演练三:when条件判断指定的IP地址2.4 实战演练…

企业如何制定数字化管理决策方案

数字化管理决策是指通过利用数字技术和数据分析来辅助和支持管理决策的过程。它利用计算机、互联网和其他技术来收集、分析和解释大量的数据,从而帮助管理者做出更准确、更有效的决策。 数字化管理决策的关键 数据收集与分析:数字化管理决策依赖于数据…

FreeRTOS之队列

什么是队列? 队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任 务间传递信息。 关于队列的几个名词: 队列项目:队列中的每一个数据; 队列长度:队列能够…

PHP生成动态小程序二维码自定义路径和参数

PHP生成动态小程序二维码自定义路径和参数 小程序路径src 参数params http://test.com?srcindex/index/index&paramsstore_id10<?php $src$_GET[src]; $params$_GET[params];doPageNewQr($src,$params); function doPageNewQr($src,$params){//配置APPID、APPSECRET$A…

品牌触点:特别关注消费者的关键接触点

品牌触点&#xff1a;特别关注消费者的关键接触点 有个专门岗位&#xff1a;触点经理 打造品牌是超级工程 关键触点要持久不断地努力 很受启发 趣讲大白话&#xff1a;让消费者见一次喜欢一次 【趣讲信息科技240期】 **************************** 品牌触点是品牌与消费群体接触…

2023-将jar包上传至阿里云maven私有仓库(云效制品仓库)

一、背景介绍 如果要将平时积累的代码工具jar包&#xff0c;上传至云端&#xff0c;方便团队大家一起使用&#xff0c;一般的方式就是上传到Maven中心仓库&#xff08;但是这种方式步骤多&#xff0c;麻烦&#xff0c;而且上传之后审核时间比较长&#xff0c;还不太容易通过&a…

Spring 6【数据绑定之类型转换(Type Conversion)】(十一)-全面详解(学习总结---从入门到深化)

目录 数据绑定之类型转换(Type Conversion) 数据绑定之类型转换(Type Conversion) 1.PropertyEditor 在Spring框架3.0之前并没有提供类型转换器&#xff0c;而是使用JDK原生的java.beans.PropertyEditor进行类型转换&#xff08;提供了PropertyEditor接口的几个实现类&#x…

指令调度(Instruction Scheduling)

指令调度&#xff08;Instruction Scheduling&#xff09; 指令调度的约束基本机器模型基本块调度全局调度 指令调度是为了提高指令级并行&#xff08;ILP&#xff09;&#xff0c;对于超长指令字&#xff08;VLIW, Very Long Instruction Word&#xff09;和多发射系统&#x…

Jvm的一些技巧

反编译字节码文件 找到对应的class文件所在的目录&#xff0c;使用javap -v -p 命令 查询运行中某个Java进程的Jvm参数 【案例】查询 MethodAreaDemo 这个类运行过程中&#xff0c;初始的元空间大小 MetaspaceSize jps 查询 Java 进程的进程ID ![在这里插入图片描述](https…

GRACE数据反演的新理解

一、问题提出 “重力恢复与气候实验”&#xff08;GRACE&#xff09;为监测地球系统内全球大尺度质量变化提供了一种新途径。自2002年3月发射以来&#xff0c;GRACE一直在生成时间变化的重力场模型&#xff0c;这些模型可用于量化与全球气候变化相关的地球系统不同组成部分内的…

【C++11】——类的新功能

目录 1. 默认成员函数 2. 类成员变量初始化 3. 强制生成默认函数的关键字default 4. 禁止生成默认函数的关键字delect 5. 继承和多态的final与override关键字 6. 测试案例 1. 默认成员函数 原来C类中&#xff08;C11之前&#xff09;&#xff0c;有6个默认成员函数&…

管理类联考——写作——素材篇——论证有效性分析——常见逻辑谬误

批判性思维常见逻辑谬误 有些错误出现在我们澄清或定义某个观点的时候&#xff0c;有些错误出现在我们收集证据或者用证据和理由支撑某个观点的时候&#xff0c;有些错误出现在我们尝试从证据得出结论的时候&#xff0c;有些错误甚至出现在我们评估他人的观点或者理由的时候。…