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. 煎蛋网爬虫之JS逆向解析img路径

    图片使用js onload事件加载 <p><img src="//img.jandan.net/img/blank.gif" onload="janda ...

  2. Python模块——Openpyxl(EXCEL)操作

    一.安装模块 pip install openpyxl 二.文件的操作 2.1文件创建 from openpyxl import Workbook #创建新的excle文件 wk = Workbook ...

  3. leetcode347 python

    通过维护最小堆排序,使用heapq模块 一般使用规则:创建列表 heap = [] 函 数                                                        ...

  4. 基于OpenCV全景拼接(Python)SIFT/SURF

    一.实验内容: 利用sift算法,实现全景拼接算法,将给定的两幅图片拼接为一幅. 二.实验环境: 主机配置: CPU :intel core i5-7300 2.50GHZ RAM :8.0GB 运行 ...

  5. LaTex公式在线转图片

    Reference https://latex.codecogs.com/gif.latex?THE_FORMULAR 注: 请不要包含空格 或者 将整段url放到浏览器里, 会产生空格等字符的替换, ...

  6. 关于 TCP 三次握手和四次挥手,满分回答在此

    尽人事,听天命.博主东南大学研究生在读,热爱健身和篮球,正在为两年后的秋招准备中,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 C ...

  7. Tailwind CSS in Action

    Tailwind CSS in Action Tailwind CSS是一个高度可定制的低级CSS框架,它为您提供了构建定制设计所需的所有构造块,而无需烦恼要覆盖的烦人的自以为是的样式 https:/ ...

  8. Linux bash shell All In One

    Linux bash shell All In One Linux https://tinylab.gitbooks.io/shellbook/content/zh/chapters/01-chapt ...

  9. Web 全栈开发 MySQL 面试题

    Web 全栈开发 MySQL 面试题 MySQL MySQL 读写分离 读写分离原理 MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先部署主从复制,只有主从复制完了,才能在此基础上进行 ...

  10. NGK:APP一站式挖矿高收益项目

    NGK是10月中旬刚上线的公链项目,采用手机挖矿形式.NGK数字增益平台,200美金即可入场,收益可观,分为静态和动态两种,投资算力收益超高.邀请好友挖矿还有额外的返佣. NGK立志为所有人创造无差别 ...