Python Flask框架路由的简单实现

  也许你听说过Flask框架。也许你也使用过,也使用的非常好。但是当你在浏览器上输入一串路由地址,跳转至你所写的页面,在Flask中是怎样实现的,你是否感到好奇? 如果你不清楚,那就往下看看吧 ~

Flask demo代码

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
return '<a href="/home">Hello World!</a>'

@app.route("/home")
def home():
return "这个是主页"

@app.route("/login")
def login():
return "这个是登录" if __name__ == '__main__':
app.run(debug=True)

当你在浏览器地址上输入路径,进入不同视图函数。

  1.输入路径为:"/"

  2.输入路径为:"/home"

  3.输入路径为:"/login"


是不是很神奇~  接下来让我们看看他是如何实现的吧!

Flask原理

    1. 当启动 app.run()后, @app.route()装饰器会将 路径信息、函数信息 传入 self.add_url_rule(rule, endpoint, f, **options)
    2. self.add_url_rule(rule,endpoint, f,**potions) 接收到路径信息、函数信息封装打包放进全局的 self.url_map.add(rule)  
    3. 这个时候的全局的self.url_map里面的信息为
    4. 当请求url进来会到 self.url_map匹配然后执行相应的方法函数,返回相应的方法结果。知道是这样的流程 我们就可以得到下面的结果

简单实现(废话不多说,直接上码!)

"""
Flask 路由简单实现
map: {"/home":"home", "/login":"login", ...}
"""
map = dict()

def route(path):
def decorator(f):
print(path, f.__name__, "<-----------start---------->")
map[path] = f.__name__
return f
return decorator

class TestFlaskRoute:

def __init__(self, path):
self.path = path

def find_url(self):
try:
getattr(TestFlaskRoute, map.get(self.path)).__call__(self)
except:
print("\033[031m 没有这个路径! \033[0m ")

@route("/login")
def login(self, *args, **kwargs):
print("\033[036m 这个是登录! \033[0m")
pass

@route("/home")
def home(self, *args, **kwargs):
print("\033[036m 这个是主页! \033[0m")
pass

@route("/")
def index(self, *args, **kwargs):
print("\033[036m Hello World! \033[0m")
pass

@route("/call")
def phone(self, *args, **kwargs):
print("\033[036m 这个是", self.path, "! \033[0m")
pass

if __name__ == '__main__':
while True:
url = input("请输入URL路径:")
app = TestFlaskRoute(url)
app.find_url()

  在这里我们用模拟浏览器输入方式来完成,当我们输入"/",它会去找对应路径下 index() 执行 ; 输入"/home",它会去找对应路径下 home() 执行;输入"/login", 它会去找对应路径下 login() 执行,怎样是不是很神奇,是不是很像Flask。其实Flask就是这样的思路实现的。

效果:

解析实现(3步)

  a.当程序启动时, 先执行了route()这个装饰器,拿到了所有路径、对应函数并将它们存在map这个字典中,以路径为key, 对应函数名为value。(注:在Flask是用全局 self.url_map 来存这些路由方法信息的哦,我们这里简单实现用的是字典,所以还是有些区别的~)

  b.当你输入路径或者在浏览器上输入路径,会以key的形式到map字典中匹配,取出value(函数名)。

  c. 得到value通过getattr()得到函数地址, 然后用内置__call__()方法,执行这个函数

结束语

  明白了Flask路由实现原理了吗,如果有错误的地方欢迎评论下方指出!

Python Flask框架路由简单实现的更多相关文章

  1. Linux ubantu中安装虚拟/使用环境virtualenv以及python flask框架

    今天学习了python flask框架的安装过程以及使用案例,感觉网上讲的东西都没有从我们这种初学者的角度去考虑(哈哈),最后还是奉上心得: 1.安装virtualenv $ sudo apt-get ...

  2. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (I)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架(I 第一部) 0. 本系列教程 1. 准备 a.python b. flask c. flask 环境安装 d. f ...

  3. python flask框架学习——开启debug模式

    学习自:知了课堂Python Flask框架——全栈开发 1.flask的几种debug模式的方法 # 1.app.run 传参debug=true app.run(debug=True) #2 设置 ...

  4. python flask框架学习(二)——第一个flask程序

    第一个flask程序 学习自:知了课堂Python Flask框架——全栈开发 1.用pycharm新建一个flask项目 2.运行程序 from flask import Flask # 创建一个F ...

  5. python flask框架学习(一)——准备工作和环境配置与安装

    Flask装备: 学习自:知了课堂Python Flask框架——全栈开发 1.Python版本:3.6 2.Pycharm软件: 3.安装虚拟环境: (1)安装virtualenv: pip ins ...

  6. #3使用html+css+js制作网页 番外篇 使用python flask 框架 (II)

    #3使用html+css+js制作网页 番外篇 使用python flask 框架 II第二部 0. 本系列教程 1. 登录功能准备 a.python中操控mysql b. 安装数据库 c.安装mys ...

  7. Python Flask框架

    Python有很多Web框架,可谓是百家争鸣,我这里列出几个比较叼的几个框架 Django      市场占有率最高,官方文档几近完美,但是适合比较大的项目,小项目会显得累赘. Tornado    ...

  8. python flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pi ...

  9. Python——Flask框架——程序的结构

    一.项目结构 |-flasky |-app Flask程序一般都保存在这里 |-templates/ |-static/ |main/ |-__init__.py |-errors.py |-form ...

随机推荐

  1. Interop.Word Documents.Open is null

    问题描述 程序在Windows Server 2012 R2调用Word组件正常,但是换到Windows Server 2008 R2之后,程序异常. 代码 Microsoft.Office.Inte ...

  2. Revit二次开发环境配置(Revit 2020 +Visual Studio 2019)

    Revit二次开发环境搭建(Revit 2019+Visual Studio 2017)准备内容 Revit 2019开发环境的搭建,需要安装的内容如下: Revit 2019(主要的开发环境) Vi ...

  3. OpenStack Train版-3.安装glance镜像服务

    安装glance镜像服务 创建数据库并授权 mysql -u root create database glance; GRANT ALL PRIVILEGES ON glance.* TO 'gla ...

  4. Chapter Zero 0.2.2 内存

    目录 内存 内存的多通道设计 DRAM 和 SRAM 只读存储器(ROM) RAM.ROM以及硬盘的区别(转自百度) 内存 CPU的数据都是来自主存储器(main memory),个人计算机的主寄存器 ...

  5. mysql+python+pymysql的一些细节问题

    报错 (1044, "Access denied for user 'erio'@'localhost' to database 'library'") 就是权限问题了,没什么好说 ...

  6. (转载)RTMP协议中的AMF数据 http://blog.csdn.net/yeyumin89/article/details/7932585

    为梦飞翔   (转载)RTMP协议中的AMF数据 http://blog.csdn.net/yeyumin89/article/details/7932585 这里有一个连接,amf0和amf3的库, ...

  7. 杭电多校HDU 6579 Operation (线性基 区间最大)题解

    题意: 强制在线,求\(LR\)区间最大子集异或和 思路: 求线性基的时候,记录一个\(pos[i]\)表示某个\(d[i]\)是在某个位置更新进入的.如果插入时\(d[i]\)的\(pos[i]\) ...

  8. WMI在渗透测试中的重要性

    0x01 什么是wmi WMI可以描述为一组管理Windows系统的方法和功能.我们可以把它当作API来与Windows系统进行相互交流.WMI在渗透测试中的价值在于它不需要下载和安装, 因为WMI是 ...

  9. 正则表达式: javascript Unicode 中文字符 编码区间:\u4e00-\u9fa5

    正则表达式: javascript Unicode 中文字符  编码区间:\u4e00-\u9fa5 RegExp 对象 javascript Unicode 中文字符的 编码区间: \u4e00-\ ...

  10. React Hooks: useContext All In One

    React Hooks: useContext All In One useContext https://reactjs.org/docs/hooks-reference.html#useconte ...