Python Flask框架路由简单实现

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("33[031m 没有这个路径! 33[0m ")

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

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

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

@route("/call")
def phone(self, *args, **kwargs):
print("33[036m 这个是", self.path, "! 33[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路由实现原理了吗,如果有错误的地方欢迎评论下方指出!

此时此刻,非我莫属
原文地址:https://www.cnblogs.com/taozhengquan/p/12668039.html