python框架flask入门之路由及简单实现方法


Posted in Python onJune 07, 2020

路由

简单来说,路由就是一个url到函数的映射,通过路由规则,可以使得url被指定的函数进行处理解析。

我们都知道现在的web系统的URL都是可以自定义的,也就是我们可以指定url和具体的业务控制器相关联,而这些就是通过路由来实现的。

flask中集成了路由处理模块,我们只需要简单地使用route装饰器就可以实现路由匹配。

@app.route('/')
def index():
 return 'Index Page'

@app.route('/hello')
def hello():
 return 'Hello, World'

上面的例子中,我们访问浏览器的时候,比如输入http://127.0.0.1/ 就会返回'index page',当输入http://127.0.0.1/hello 就会返回‘Hello World',这就是路由的基本使用。

@app.route('/user/<username>')
def show_user(username):
 return username

@app.route('/post/<int:post_id>')
def show_post(post_id):
 return 'Post %d' % post_id

@app.route('/path/<path:subpath>')
def show_subpath(subpath):
 # show the subpath after /path/
 return 'Subpath %s' % escape(subpath)

从上面的例子我们可以看出,flask的路由还可以进行参数匹配,比如我们可以通过<>来对参数进行获取,可以获取到文章的id,获取到用户名等参数信息,也就是说,我们可以通过路由匹配来对指定的url进行处理。

关于url中斜线(/)的处理当我们在路由中定义了斜线,那么当我们访问没有斜线的url的时候,它会自动添加斜线当我们在路由中没有定义斜线的时候,那么我们访问有斜线的时候,会提示404

@app.route('/test/')
#当我们访问http://127.0.0.1/test的时候,会重定向到http://127.0.0.1/test/
def test():
  return 'test'

@app.route('slashes')
#当我们访问http://127.0.0.1/slashes/的时候,会提示404,无法匹配到路由
def slashes():
 return 'slashes'

下面看下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.输入路径为:"/"

python框架flask入门之路由及简单实现方法

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

python框架flask入门之路由及简单实现方法

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

python框架flask入门之路由及简单实现方法

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

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

"""
 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就是这样的思路实现的。

效果:

python框架flask入门之路由及简单实现方法

解析实现(3步)

a.当程序启动时,先执行了route()这个装饰器,拿到了所有路径、对应函数并将它们存在map这个字典中,以路径为key,对应函数名为value。(注:在Flask是以Route类来存这些信息的哦,所以还是有些区别的~)

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

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

总结

到此这篇关于python框架flask入门之路由及简单实现方法的文章就介绍到这了,更多相关python框架flask 路由内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
May 23 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
Python编程实现二叉树及七种遍历方法详解
Jun 02 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
python实现自动获取IP并发送到邮箱
Dec 26 Python
python issubclass 和 isinstance函数
Jul 25 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
python 实现检验33品种数据是否是正态分布
Dec 09 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
Python 读取位于包中的数据文件
Aug 07 Python
Python关于拓扑排序知识点讲解
Jan 04 Python
python框架flask入门之环境搭建及开启调试
Jun 07 #Python
python实现一次性封装多条sql语句(begin end)
Jun 06 #Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 #Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 #Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 #Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 #Python
在python中使用pyspark读写Hive数据操作
Jun 06 #Python
You might like
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
Yii框架中使用PHPExcel的方法分析
2019/07/25 PHP
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
纯js实现倒计时功能
2017/01/06 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
js中如何完美的解析数据
2018/03/18 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
vue.js实现带日期星期的数字时钟功能示例
2018/08/28 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
详解微信小程序工程化探索之webpack实战
2020/04/20 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
wxpython 学习笔记 第一天
2009/02/09 Python
python常用函数详解
2016/09/13 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
tensorflow创建变量以及根据名称查找变量
2018/03/10 Python
我就是这样学习Python中的列表
2019/06/02 Python
Python list与NumPy array 区分详解
2019/11/06 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
高档奢华时装在线目的地:FORWARD by elyse walker
2017/10/16 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
课外活动总结范文
2014/07/09 职场文书
十一月早安语录:把心放轻,人生就是一朵自在的云
2019/11/04 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
Mysql 一主多从的部署
2022/05/20 MySQL