Flask学习(五):flask中添加装饰器

一、注意装饰器函数所在的位置:

代码示例如下:

from flask import Flaskapp = Flask(__name__)def wapper(func):def inner(*args, **kwargs):print("执行了装饰器")return func(*args, **kwargs)return inner@wapper
@app.route("/index1")
def index():return "Index"if __name__ == "__main__":app.run()

执行结果:

        由上述代码执行结果可知,装饰器wapper并没有被执行到,这是由于请求过来之后,执行完index并返回视图,因为wapper装饰器在app.route上面,所以并未执行到wapper装饰器,若想执行wapper装饰器,则需要将wapper放到route下面。

@app.route("/index1")
@wapper
def index():return "Index"

执行结果如下:

        由上述程序执行结果可知,当装饰器wapper放到route下面的时候,route会把装饰器wapper和index函数当做一个整体去执行,因此按照装饰器的执行顺序,就会先执行wapper返回inner函数引用,然后在执行请求,返回视图。

二、由第一条衍生出第二个问题,当多个请求共同被一个装饰器装饰的时候,程序会出现错误,示例及结果如下:

from flask import Flask
from werkzeug.routing import BaseConverterapp = Flask(__name__)def wapper(func):def inner(*args, **kwargs):print("执行了装饰器")return func(*args, **kwargs)return inner@app.route("/index1")
@wapper
def index():return "Index"@app.route("/index2")
@wapper
def index2():return "Index"if __name__ == "__main__":app.run()

执行结果:

        这是因为两个请求被一个装饰器装饰,执行装饰器后返回的是同样的inner函数的引用,因此存在两个inner函数,故而程序会报错,如果需要解决此问题就需要在执行装饰器的时候返回的函数引用是传入的函数参数,而不是内部闭包函数。因此需要在装饰器函数的内部函数上添加@functools.wraps(func)

        @functools.wraps(func) (作用是在装饰函数时保留被装饰函数的元数据,比如函数名、注释、参数列表等。因为装饰器通常会改变函数的元数据,导致被装饰函数的某些特性丢失),代码如下所示:

def wapper(func):def inner(*args, **kwargs):print("执行了装饰器")return func(*args, **kwargs)return inner

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

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

相关文章

CTF题型 匿名函数考法例题总结

CTF题型 匿名函数考法&例题总结 文章目录 CTF题型 匿名函数考法&例题总结一 .原理分析二 .重点匿名函数利用1.create_function()如何实现create_function代码注入 2.array_map()3.call_user_func()4.call_user_func_array()5.array_filter() 三.例题讲解1.[Polar 靶场 …

【WEB3安全基建项目Secwarex】空投指南

GoPlusSecurity是WEB3安全基建项目,3月8日完成400万美元的私募融资,目前总融资已经高达1500万美元,其中包括Binance Labs、Huobi Incubator、Kucoin Ventures、Avalanche等知名机构参投。 1、打开网址:secwarex.io,点…

【考研数学】武忠祥全年各阶段用书搭配

正常来说,你已经跟了武忠祥老师,那武老师的高数辅导讲义和严选题,应该你都有入手了,这个时候你再加一本1800,如何能够保证有充分的时间,将这些习题册做透,将它们的最大作用发挥出来呢&#xff0…

Vue3 v-model的使用

简介 使用场景&#xff1a;1 用于表单input、textarea以及select元素上创建双向数据绑定 2 用于组件间数据的通信 一个小栗子&#xff0c;第一个使用场景的代码 <template><div class"box"><div class"intro"><el-input v…

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1&#xff09;priority_queue()/priority_queue(first, last) 2&#xff09;push&#xff08;x&#xff09; 3&#xff09;pop&#xff08;&#xff09; 4&#…

Vue+Element-UI Table表格实现复选框单选效果(隐藏表头上的全选Checkbox)

实现效果 完整代码 <div class"box-pos"><el-table ref"table" :header-cell-style"{ color: #FFF, background: #333 }":cell-style"{ color: #FFF, background: #333 }" :data"grListData" style"width: 1…

前端知识点03(JS)

文章目录 前端知识点03&#xff08;JS&#xff09;1、JS中this指向问题2、script中的async和defer的区别3、setTimeOut和setInterval4、Es6和ES5的区别5、ES6的新特性 &#x1f389;写在最后 前端知识点03&#xff08;JS&#xff09; hello hello~ &#xff0c;这里是 code袁~&…

python日常刷题(一)

前言&#xff1a;本文记录2024年3月11日至2024年3月19日牛客网所做的基础题目&#xff08;错题本&#xff09;&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;本专栏&#xff1a;python日常刷题 &#x1f380;CSDN主页&#xff1a;愚润求学 文章目录…

软件的安装与卸载(YUM)

YUM&#xff1a;yum 是一个方便的"应用商店"&#xff0c;你可以通过它轻松地安装、更新和删除软件包&#xff0c;就像从应用商店中下载和安装应用程序一样。&#xff08;这个得用root身份&#xff0c;普通用户权限不够&#xff09; 常用命令&#xff1a; 1.安装软件…

路径优化算法 | matlab遗传算法多配送中心路径优化

在MATLAB中使用遗传算法来解决多配送中心路径优化问题,通常涉及到复杂的组合优化问题。多配送中心路径优化问题(也称为车辆路径问题,Vehicle Routing Problem with Multiple Depots, VRPMD)是旅行商问题(TSP)的扩展,其中存在多个配送中心,每个配送中心有一定数量的车辆…

工作需求ElementUi组件的使用

加油&#xff0c;新时代打工人&#xff01; 组件源码 <template><div mouseenter"mousein true" mouseleave"mousein false"><el-input type"text" clearable autocomplete"off" v-model"searchDoc.originName…

7.安全性基础知识

主要议题&#xff1a; 安全防护体系&#xff1a;7层次&#xff0c;要记7层次的名称以及这些层次与哪些方面相关&#xff1b; 安全保护等级&#xff1a;5等级&#xff0c;要记5等级安全性的高低排序&#xff0c;掌握每个等级的特点&#xff1b; 用户认证机制&#xff1a;用户认…

[小程序开发] npm

一、自定义构建npm 1、在project.config.json文件中的 "miniprogramRoot"指定小程序源码目录。 "miniprogramRoot": "miniprogram/", 2、在project.config.json文件中的setting.packNpmManually为true&#xff0c;开启自定义node_modules和minip…

bert源码分析之tokenization

import collections# 集合模块 import re# 正则模块 import unicodedata#判断字符类别模块 import six#判断版本 import tensorflow as tf # 用于检查传入的参数do_lower_case和真正的模型是否一致 # do_lower_case: 一个布尔值&#xff0c;表示是否将文本转换为小写 # init_ch…

python网络爬虫实战教学——urllib的使用(2)

文章目录 专栏导读1、前言2、URLError3、HTTPError4、urlparse5、urlunparse 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN 数据分析领域优质创作者&#xff0c;专注于分享python数据分析领域知识。 ✍ 本文录入于《python网络爬虫实战教学》&#xff0c;本专栏针对…

牛客刷题 | HJ68 成绩排序, HJ69 矩阵乘法,HJ70 矩阵乘法计算量估算

HJ68 成绩排序 题目链接 思路建立字典&#xff0c;key代表名字&#xff0c;value为数字&#xff0c;最后sorted函数按规定排序。注意名单中的名字会重名&#xff0c;所以key应该是名字加上编号&#xff0c;以免同名的分数被覆盖。将编号填充为3位数&#xff0c;方便最后输出名…

第1章 数据管理

思维导图 1.1 引言 从数据中获取的价值不可能凭空产生或依赖于偶然&#xff0c;需要有目标、规划、协作、和保障&#xff0c;也需要管理和领导力。定义&#xff1a; 数据管理是为了交付、控制、保护并提升数据和信息资产的价值&#xff0c;在其整个生命周期中制定计划、制度、…

【Web】浅聊Hessian反序列化原生jdk利用与高版本限制绕过

目录 前言 原理分析 EXP Hessian2 低版本 直接Runtime命令执行 Hessian2 高版本 利用Unsafe加载恶意字节码二次调用触发初始化 利用TemplatesImpl实例化恶意类 jdk高版本打JNDI 前文&#xff1a;【Web】浅聊Hessian异常toString姿势学习&复现 前言 上篇文章介绍…

mysql笔记:23. 在Mac上安装与卸载MySQL

文章目录 下载MySQL安装包1. 打开MySQL官网&#xff0c;点击DOWNLOADS2. 点击GPL Downloads3. 点击MySQL Community Server打开下载页面4. 选择需要的文件进行下载5. ARM or x86 DMGbrewTAR卸载1. 在系统中卸载2. 在终端中卸载 MySQL对Mac电脑的适配十分强大&#xff0c;再加上…

Oracle with as用法

一、简介 with…as关键字&#xff0c;是以‘with’关键字开头的sql语句&#xff0c;在实际工作中&#xff0c;我们经常会遇到同一个查询sql会同时查询多个相同的结果集&#xff0c;即sql一模一样&#xff0c;这时候我们可以将这些相同的sql抽取出来&#xff0c;使用with…as定…