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路由实现原理了吗,如果有错误的地方欢迎评论下方指出!

最新文章

  1. JavaWeb——Servlet
  2. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
  3. 计蒜客_计数和数数(C语言实现)
  4. 《利用Python进行数据分析: Python for Data Analysis 》学习随笔
  5. Codeforces Round #372 (Div. 2) A B C 水 暴力/模拟 构造
  6. POJ 1751 Highways (最小生成树)
  7. 打开Excel时提示"您尝试打开的文件**.xls的格式与文件扩展名指定的格式不一致"
  8. uniq和sort的用法
  9. 移植qt5.3.1到arm
  10. 关于Edittext默认弹出软键盘为数字键
  11. js模块加载详解
  12. 跟我一起写Makefile(转)
  13. C语言实现输出一组数字中的所有奇数
  14. Mysql时间差计算
  15. Pycharm中选择Python解释器
  16. CSS3实战开发: 折角效果实战开发
  17. JS面试典型常见问题与解答
  18. jquery scroll()滚动条事件
  19. [微信小程序]——bug记录
  20. ORACLE数据泵还原(IMPDP命令)

热门文章

  1. 牛客小白月赛28 J.树上行走 (并查集,dfs)
  2. 四、Jmeter 集合点(实际场景应用)
  3. While &amp; For 循环
  4. hdu-1941 Find the Shortest Common Superstring
  5. HDU - 4455 Substrings(非原创)
  6. 计组CPU设计实验关键材料和关键设计
  7. Spring(三) Spring IOC 初体验
  8. HLOD System
  9. ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛
  10. javascript 克隆对象/数组的方法 clone()