当前位置: 首页 > news >正文

python 利用装饰器实现类似于flask路由

例子1:

def f1():print(1111)def f2():print(2222)if __name__ == '__main__':print(33)

打印结果:

33

在例子1中,f1() 与f2() 都没有被调用,只执行了print(33)

f1与f2,是没有被调用的,但是如果f1 和 f2 上面有注解,就会被调用执行。

2、 python 利用装饰器实现类似于flask路由

注释类 Grass

# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 02 -21
# @File: grass.pyfrom types import FunctionTypeclass Grass(object):# 字典,key 是 用户输入的路由# value,是调用对应的函数url_map = {}def router(self,url):def decorator(f: FunctionType):self.add_url_to_map(url,f)# return freturn decorator# f 指的是一个函数def add_url_to_map(self,url,f):self.url_map[url] = fdef run(self):while True:url = input("请输入URL: ")try:print(self.url_map[url]())except Exception as e:print(404)print(e)

运行入口

# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 02 -21
# @File: blog.pyfrom grass import Grassapp = Grass()@app.router("/home")
def home():print("欢迎来到首页")return "首页"@app.router("/index")
def index():print("欢迎来到列表页")return "列表页"if __name__ == '__main__':app.run()

运行app.run()

然后输入 :

/home

/index

/mine

 

分析实现逻辑:

当运行app.run() 时,代码运行逻辑是

1、先执行1 实例化Grass对象

2、装饰器@app.router("/home") 运行

3、装饰器@app.router("/index") 运行

4、最后才是app.run() 运行

 

装饰器@app.router("/home") 运行逻辑

 

装饰器@app.router("/home"),运行

@app.router("/home") 对应 def router(self,url):

1、“/home” 传给 def router(self,url),url =“/home”

2、@app.router("/home"),运行得到 decorator函数

3、然后将home函数作为参数,传递给decorator函数

4、self.add_url_to_map(url,f)

将 url(“/home”) 与 home 函数组成 字典。

在字典中,字符串 /home 对应home 函数

 

http://www.lryc.cn/news/16866.html

相关文章:

  • git 拉取远程分支到本地
  • Answering Multi-Dimensional Range Queries under Local Differential Privacy
  • 手把手搭建springboot项目05-springboot整合Redis及其业务场景
  • Flutter基础语法(六)var、final、const、late
  • Linux之安装node
  • 二叉树、二叉搜索树、二叉树的最近祖先、二叉树的层序遍历【零神基础精讲】
  • 【算法】【数组与矩阵模块】求最长可整合子数组和子数组的长度
  • 数据结构:循环队列的实现(leetcode622.设计循环队列)
  • [qiankun]实战问题汇总
  • Kafka(6):服务端常用参数配置
  • 2023爱分析·云原生智能运维中台市场厂商评估报告:秒云(miaoyun.io)
  • hadoop容器化部署
  • 【07-JVM面试专题-JVM运行时数据区的虚拟机栈你知道吗?它的基本结构是什么呢?你知道栈帧的结构吗?那你说说动态链接吧?】
  • Java性能优化-GC优化基础
  • 【Tomcat】IDEA编译Tomcat源码-手把手教程
  • 如何弄小程序?公司企业可以这样做小程序
  • 【Git】IDEA集合Git和码云
  • [USACO03FALL / HAOI2006] 受欢迎的牛 G(C++,强连通分量)
  • Vue 动态路由接口数据结构化为符合VueRouter的声明结构及菜单导航结构、动态路由懒加载方法
  • Python----------字符串
  • 日志收集笔记(架构设计、Log4j2项目初始化、Lombok)
  • 一文教你玩转 Apache Doris 分区分桶新功能|新版本揭秘
  • 数据挖掘,计算机网络、操作系统刷题笔记54
  • 将数组中的每个元素四舍五入到指定的精度numpy.rint()
  • Web安全之服务器端请求伪造(SSRF)类漏洞详解及预防
  • LeetCode:239. 滑动窗口最大值
  • JS 函数参数(动态参数、剩余参数)
  • 365天深度学习训练营-第J3周:DenseNet算法实战与解析
  • Parisland NFT 作品集
  • uniapp: 基础开发官网文档