Flask快速入门2(请求扩展、CBV装饰器、闪现、g对象、蓝图、wtforms)

Flask快速入门

目录

  • Flask快速入门
    • 请求扩展
      • before_request
      • after_request
      • teardown_request
      • errorhandler
    • CBV加装饰器
    • 闪现(Flash)
      • 示例
    • g对象
    • 蓝图(blueprint)
    • wtforms

请求扩展

常用的请求扩展:

  • before_request
  • after_request
  • teardown_request
  • errorhandler

before_request

在请求进入视图函数之前执行

@app.route('/')
def home():
    print('home')
    return 'home'

@app.before_request
def before01():
    print('我是before_request')

控制台输出:

image-20240613210628124

after_request

在执行完视图函数后会执行

@app.route('/')
def home():
    print('home')
    return 'home'

@app.after_request
def after01(response):
    print('我是after_request')
    return response

控制台打印:

image-20240613210711434

teardown_request

无论视图代码执行成功或失败都会走teardown_request,即使出现异常也会,一般用来记录日志

@app.teardown_request
def teardown(exc):
	if exc:  
        print(f'出现异常:{exc}')  
    else:  
        print('请求成功结束或没有异常。')  

errorhandler

当视图出现异常时会走errorhandler,并捕获error信息

from flask import Flask, jsonify, abort

@app.errorhandler(404)
def error_404(err):
    print('出现了404报错')
    print(f'err:{err}')
    return jsonify({'error': 'Not Found', 'code': '404'}), 404


@app.route('/notfound')
def not_found():
    # 这里我们故意触发一个 404 错误
    abort(404)

页面返回数据:

image-20240613205933257

控制台输出:

image-20240613205959011

CBV加装饰器

from flask import Flask, url_for, render_template, request, make_response, session, redirect
from flask.views import MethodView
from werkzeug.utils import secure_filename

app = Flask(__name__)


def auth(func):
    def inner(*args, **kwargs):
        res = func(*args, **kwargs)
        print('已走装饰器')
        return res

    return inner


class IndexView(MethodView):
    # 装饰器列表
    decorators = [auth]
    # 指定当前视图类允许的请求方式
    methods = ['GET', 'POST']

    def get(self):
        return 'Hello GET'


app.add_url_rule('/', view_func=IndexView.as_view('index'))
if __name__ == '__main__':
    app.run(debug=True)
  • 注意:该装饰器是非公用的,即要么给CBV使用要么给FBV使用,因为CBV首参数是self

除了decorators方式也可以直接用@auth

class IndexView(MethodView):
    @auth
    def get(self):
        return 'Hello GET'

闪现(Flash)

目的:用于在请求之间传递一次性消息

实现方式:基于Flask的会话(session)对象实现,但比普通会话对象更加灵活和轻量级

特点:设置消息后,在下一个请求中检索并显示,然后自动删除

在Django中有和flash类似的中间件:message

示例

使用闪现必须配置app.secret_key

get_flashed_messages获取全部闪现数据

from flask import Flask, flash, get_flashed_messages

app = Flask(__name__)
app.secret_key = 'abcd'

@app.route('/')
def home():
    flash('闪现')
    return '已经添加闪现'


@app.route('/index')
def index():
    msg = get_flashed_messages()
    if msg:
        return msg
    return '没有查找到flash'

if __name__ == '__main__':
    app.run(debug=True)

先访问http://127.0.0.1:5000

image-20240613202528174

再访问http://127.0.0.1:5000/index获取到闪现数据

image-20240613202604520

如果再次访问index则会返回:

image-20240613202631314

g对象

g对象就是global的缩写,它是一个特殊对象,用于在请求之间存储和传递数据

注意:一般我们不会把g对象放入request对象中,会造成数据污染

from flask import Flask, g


app = Flask(__name__)


@app.before_request
def before():
    g.name = '张三'


@app.route('/')
def index():
    print(g.name)
    return 'home'

控制台输出:

张三

蓝图(blueprint)

Flask中的蓝图(Blueprint)是一个非常重要的概念,它提供了一种组织和管理路由、视图函数、错误处理程序以及静态文件的方法

from flask import Flask, g, Blueprint  
  
app = Flask(__name__)  
# 第一个参数是蓝图名  
bp = Blueprint('demo1', __name__)  
bp2 = Blueprint('demo2', __name__)  
  
# 为bp蓝图定义路由和视图函数  
@bp.route('/')  
def demo1_index():  
    return 'Home from demo1'  
  
# 为bp2蓝图定义路由和视图函数,注意这里使用了不同的函数名和URL路径  
@bp2.route('/bp')  
def demo2_index():  
    return 'Home from demo2'  
  
# 在app中注册蓝图实例bp和bp2  
app.register_blueprint(bp)  
app.register_blueprint(bp2)  
  
if __name__ == '__main__':  
    app.run(debug=True)

此时访问http://127.0.0.1:5000/bphttp://127.0.0.1:5000都能正常返回,但实际上它俩可以算作两个分支

注意:蓝图实例也可以使用请求扩展,一般只有大型项目才会使用蓝图

wtforms

  • WTForms提供了一个简单的接口来定义表单字段和验证规则,并将它们呈现为HTML表单。

  • 它支持多种Web框架,如Flask、Django和Pyramid,使得在Web应用程序中使用表单变得简单方便。

  • 核心功能

  • 创建和定义表单字段:WTForms允许用户定义各种类型的表单字段,如文本字段、密码字段、单选按钮、复选框等。

from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder='templates')

app.debug = True


class LoginForm(Form):
    # 字段(内部包含正则表达式)
    name = simple.StringField(
        label='用户名',
        validators=[
            validators.DataRequired(message='用户名不能为空.'),
            validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
        ],
        widget=widgets.TextInput(), # 页面上显示的插件
        render_kw={'class': 'form-control'}

    )
    # 字段(内部包含正则表达式)
    pwd = simple.PasswordField(
        label='密码',
        validators=[
            validators.DataRequired(message='密码不能为空.'),
            validators.Length(min=8, message='用户名长度必须大于%(min)d'),
            validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",
                              message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')

        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )



@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        form = LoginForm()
        return render_template('login.html', form=form)
    else:
        form = LoginForm(formdata=request.form)
        if form.validate():
            print('用户提交数据通过格式验证,提交的值为:', form.data)
        else:
            print(form.errors)
        return render_template('login.html', form=form)

if __name__ == '__main__':
    app.run()

ml’, form=form)
else:
form = LoginForm(formdata=request.form)
if form.validate():
print(‘用户提交数据通过格式验证,提交的值为:’, form.data)
else:
print(form.errors)
return render_template(‘login.html’, form=form)

if name == ‘main’:
app.run()




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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十大成长型思维:定位思维、商业思维、时间管理思维、学习成长思维、精力管理思维、逻辑表达思维、聚焦思维、金字塔原理、目标思维、反思思维

一、定位思维 定位思维是一种在商业和管理领域中至关重要的思维模式,它涉及到如何在顾客心智中确立品牌的独特位置,并使其与竞争对手区分开来。以下是关于定位思维的清晰介绍: 1、定义 定位思维是一种从潜在顾客的心理认知出发,通…

数据资产管理的未来趋势:洞察技术前沿,探讨数据资产管理在云计算、大数据、区块链等新技术下的发展趋势

一、引言 随着信息技术的飞速发展,数据已成为企业最重要的资产之一。数据资产管理作为企业核心竞争力的关键组成部分,其发展趋势和技术创新受到了广泛关注。特别是在云计算、大数据、区块链等新技术不断涌现的背景下,数据资产管理面临着前所…

随机森林算法进行预测(+调参+变量重要性)--血友病计数数据

1.读取数据 所使用的数据是血友病数据,如有需要,可在主页资源处获取,数据信息如下: import pandas as pd import numpy as np hemophilia pd.read_csv(D:/my_files/data.csv) #读取数据 2.数据预处理 在使用机器学习方法时&…

Excel 常用技巧(二)

Microsoft Excel 是微软为 Windows、macOS、Android 和 iOS 开发的电子表格软件,可以用来制作电子表格、完成许多复杂的数据运算,进行数据的分析和预测,并且具有强大的制作图表的功能。由于 Excel 具有十分友好的人机界面和强大的计算功能&am…

文章解读与仿真程序复现思路——电工技术学报EI\CSCD\北大核心《考虑源网储协同配合下的移动式波浪能发电平台并网优化调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

理解Es的DSL语法(二):聚合

前一篇已经系统介绍过查询语法,详细可直接看上一篇文章(理解DSL语法(一)),本篇主要介绍DSL中的另一部分:聚合 理解Es中的聚合 虽然Elasticsearch 是一个基于 Lucene 的搜索引擎,但…

判断QT程序是否重复运行

打开exe&#xff0c;再次打开进行提示。 main.cpp添加&#xff1a; #include "QtFilePreview.h" #include <QtWidgets/QApplication> #include <windows.h> #include <qmessagebox.h> #pragma execution_character_set("utf-8")bool Ch…

【LeetCode:2779. 数组的最大美丽值 + 排序 + 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

荣耀笔记本IP地址查看方法详解:轻松掌握网络配置技巧

在数字化时代的浪潮中&#xff0c;笔记本电脑已经成为我们生活和工作中不可或缺的重要工具。对于荣耀笔记本用户而言&#xff0c;掌握基本的网络配置技巧显得尤为重要。其中&#xff0c;查看IP地址是连接网络、配置设备、排除故障等场景下的关键步骤。本文将详细介绍荣耀笔记本…

adb shell pm path packageName

在Android命令行中&#xff0c;如果你想要查询某个应用程序的安装位置&#xff0c;可以使用pm命令&#xff08;Package Manager的缩写&#xff09;。这个命令提供了很多关于软件包管理的操作&#xff0c;查询应用安装路径&#xff0c;可以使用path选项。 具体命令如下&#xf…

2024全国大学生信息安全竞赛(ciscn)半决赛(华南赛区)Pwn题解

前言 找华南赛区的师傅要了一份半决赛的Pwn题&#xff0c;听说只有一道题。 题目很简单&#xff0c;可以申请任意大小chunk&#xff0c;并存在UAF、DoubleFree漏洞。 还给了后门函数&#xff0c;不过限制是edit只能写8字节的数据到chunk中。 MyHeap 逆向分析 拖入IDA分析…

ETL可视化工具 DataX -- 简介( 一)

引言 DataX 系列文章&#xff1a; ETL可视化工具 DataX – 安装部署 ( 二) 1.1 DataX 1.1.1 Data X概览 DataX 是阿里云DataWorks数据集成的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServ…

【GD32F303红枫派使用手册】第十六节 USART-DMA串口收发实验

16.1 实验内容 通过本实验主要学习以下内容&#xff1a; 串口DMA工作原理 使用DMA进行串口收发 16.2 实验原理 16.2.1 串口DMA工作原理 在前面ADC章节中&#xff0c;我们介绍了DMA的工作原理&#xff0c;这里就不多做介绍。从GD32F303用户手册中可以查到&#xff0c;各串…

四轴飞行器、无人机(STM32、NRF24L01)

一、简介 此电路由STM32为主控芯片&#xff0c;NRF24L01、MPU6050为辅,当接受到信号时&#xff0c;处理对应的指令。 二、实物图 三、部分代码 void FlightPidControl(float dt) { volatile static uint8_t statusWAITING_1; switch(status) { case WAITING_1: //等待解锁 if…

LED显示屏色差处理方法

LED显示屏以其高亮度、低功耗和长寿命等优点&#xff0c;在广告、信息发布和舞台背景等领域得到广泛应用。然而&#xff0c;由于生产批次的不同&#xff0c;LED显示屏在亮度和色度上可能存在差异&#xff0c;影响显示效果。本文将探讨如何通过逐点校正技术来解决这一问题。 逐点…

【C++】和【预训练模型】实现【机器学习】【图像分类】的终极指南

目录 &#x1f497;1. 准备工作和环境配置&#x1f495; &#x1f496;安装OpenCV&#x1f495; &#x1f496;安装Dlib&#x1f495; 下载并编译TensorFlow C API&#x1f495; &#x1f497;2. 下载和配置预训练模型&#x1f495; &#x1f496;2.1 下载预训练的ResNet…

python-基础篇-函数-是什么

文章目录 定义一&#xff1a;如果在开发程序时&#xff0c;需要某块代码多次执行。为了提高编写的效率以及更好的维护代码&#xff0c;需要把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数。定义一&#xff1a;我们把一些数据喂给函数&#xff0c;让他内部消化&…

七、IP路由原理和路由引入

目录 一、IP路由原理 二、路由引入 2.1、双点双向路由引入 2.2、路由回灌 三、路由策略与路由控制 路由匹配工具&#xff08;规则&#xff09; ACL IP前缀列表 路由控制工具&#xff08;控制&#xff09; 策略工具1 策略工具2 搭配组合 组…

JAVA-CopyOnWrite并发集合

文章目录 JAVA并发集合1_实现原理2_什么是CopyOnWrite?3_CopyOnWriteArrayList的原理4_CopyOnWriteArraySet5_使用场景6_总结 JAVA并发集合 从Java5开始&#xff0c;Java在java.util.concurrent包下提供了大量支持高效并发访问的集合类&#xff0c;它们既能包装良好的访问性能…

【字符函数】

接下来介绍部分字符函数测试 2. 字符转换函数 1.字符分类函数 1.1iscntrl 注&#xff1a;任何控制字符 检查是否有控制字符 符合为真 int main() {int i 0;char str[] "first line \n second line \n";//判断是否遇到控制字符while (!iscntrl(str[i])){p…