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

    此时此刻,非我莫属
  • 相关阅读:
    16 Errors and Exceptions
    13 Asynchronous Programming
    wpf入门
    iframe cross domain
    ini_set("error_log",$error_path)设置
    MySQL中merge表存储引擎用法
    php中静态属性静态方法的用法
    PHP的SESSIONID生成原理
    composer的基本 使用
    相邻省份数组
  • 原文地址:https://www.cnblogs.com/taozhengquan/p/12668039.html
Copyright © 2011-2022 走看看