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_filenameapp = Flask(__name__)def auth(func):def inner(*args, **kwargs):res = func(*args, **kwargs)print('已走装饰器')return resreturn innerclass 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):@authdef get(self):return 'Hello GET'

闪现(Flash)

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

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

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

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

示例

使用闪现必须配置app.secret_key

get_flashed_messages获取全部闪现数据

from flask import Flask, flash, get_flashed_messagesapp = Flask(__name__)
app.secret_key = 'abcd'@app.route('/')
def home():flash('闪现')return '已经添加闪现'@app.route('/index')
def index():msg = get_flashed_messages()if msg:return msgreturn '没有查找到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, gapp = 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 widgetsapp = Flask(__name__, template_folder='templates')app.debug = Trueclass 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.xdnf.cn/news/1452041.html

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

相关文章

Stable-Diffusion-WebUI 常用提示词插件

SixGod提示词插件 SixGod提示词插件可以帮助用户快速生成逼真、有创意的图像。其中包含,清空正向提示词”和“清空负向提示词、提示词起手式包含人物、服饰、人物发型等各个维度的提示词、一键清除正面提示词与负面提示词、随机灵感关键词、提示词分类组合随机、动…

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

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

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

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

波卡近期活动一览| Polkadot Decoded 2024 重磅来袭,300 万 DOT 将用于 DeFi 增长

Polkadot 生态近期活动精彩纷呈,线上线下火热进行中!此外,Polkadot 2.0 的关键升级即将到来,Gavin Wood 博士也将在最新访谈节目中分享更多关于波卡的未来发展蓝图。波卡 DAO 通过提案,分配 300 万 DOT 支持 DeFi 生态…

12.容器间的互联(--link 是单方向的!!!)

容器间的互联(–link 是单方向的!!!) –link意思就是链接容器进行通信 用法:--link 容器名字:随意设置别名;例如:--link nginx:nginx 注释:同一个容器中,可…

动态功能连接评估方法的变异性

摘要 背景:动态功能连接(dFC)已成为理解大脑功能的一种重要测量指标。虽然已经开发了各种各样的方法来评估dFC,但目前尚不清楚方法的选择会如何影响结果。在这里,本研究旨在考察常用dFC方法的结果变异性。 方法:本研究在Python中…

公司面试题总结(六)

31.说一说 webpack 的构建流程是什么? ⚫ 初始化流程: ◼ 从配置文件和 Shell 语句中读取与合并参数 ◼ 初始化需要使用的插件和配置插件等执行环境所需要的参数 ⚫ 编译构建流程: ◼ 从 Entry 发出,针对每个 Module 串行…

仙侠手游【天道情缘】修复版服务端+GM后台+详细教程

下载地址:仙侠手游【天道情缘】修复版服务端GM后台详细教程

【立体几何】如何使用两个正方体(特殊骰子)摆出所有日期1~31

问题 如何使用两个正方体(特殊骰子)摆出所有日期? 解答 下标列举了所有日期 日期十位数个位数011号正方体:02号正方体:02号正方体:11号正方体:1021号正方体:02号正方体:02号正方体:21号正方…

Facebook:数字时代的文化交流平台

在当今信息爆炸的数字时代,Facebook已经成为了一个不可或缺的社交媒体平台,不仅在个人生活中起到了联系社交的作用,更在全球范围内促进了文化交流和理解。本文将深入探讨Facebook作为文化交流平台的重要性,并分析其在数字时代如何…

从零手写实现 nginx-17-nginx.conf 全局的默认配置

前言 大家好,我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的,可以参考我的另一个项目: 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

开源医疗大模型Llama3-Aloe-8B-Alpha,性能超越 MedAlpaca 和 PMC-LLaMA

前言 近年来,大型语言模型 (LLM) 在医疗领域展现出巨大潜力,能够帮助医生和研究人员更快地获取信息、分析数据,并提高医疗服务效率。然而,目前市场上大多数医疗 LLM 都是闭源模型,限制了其在学术研究和应用领域的推广…

OpenGL3.3_C++_Windows(10)

最终演示 ​ demo演示 Assimp模型渲染 模型导入库Assimp:导入很多种不同的模型文件格式,加载至Assimp的通用数据结构(树形)中,不论导入的是什么种类的文件格式,用同一种方式访问我们需要的数据。 Assimp库…

【Java】多态、final关键字、抽象类、抽象方法

多态(Polymorphism) 【1】多态跟属性无关,多态指的是方法的多态,而不是属性的多态。 【2】案例代入: public class Animal {//父类:动物: public void shout(){ System.out.println("我是小动物&am…

JAVA-CopyOnWrite并发集合

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

无人机的发展

朋友们,你们知道吗?无人机的发展之路可谓是科技界的一股清流,风头正劲啊!从最初简单的遥控飞机到现在各种智能功能的加持,无人机真是越来越神奇了! 首先,无人机在航拍领域大放异彩!无…

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

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

ChatGPT 提示词技巧一本速通

一、基本术语 概念 定义 案例 提示词 prompt 向AI模型提出的问题或者指示,告诉它我们希望得到什么样的回答或结果,是与模型互动的主要形式。 任务:生成一封电子邮件邀请。 提示词:请帮我写一封邀请同事参加下周五团队建设活…

Vue引入element-plus-04

我们这次开发是使用vue的脚手架来进行开发,前面我们已经使用过最原生的方式去编写我们的vue的语法,从今天开始就使用vue的脚手架,但是前提是你需要用于node的环境 在我们开始之前,我们至少需要有node npm是什么? npm是一个强大的包管理工具,它…

Stable Diffusion【应用篇】【艺术写真】:粘土风之后陶瓷风登场,来看看如何整合AI艺术写真吧

在国外的APP Remini引爆了粘土滤镜后,接着Remini又推出了瓷娃娃滤镜。相当粘土滤镜,个人更喜欢瓷娃娃滤镜,因为陶瓷工艺更符合东方艺术审美。 下面我们就来看看陶瓷特效在AI写真方面的应用。话不多说,我们直接开整。 关于粘土整…