Flask框架学习:蓝图的使用
参考链接:Flask 蓝图的基本使用
在之前的学习中,所有的页面处理逻辑都是放在同一个文件中的,随着业务的增加,把所有代码都放在同一个文件中是不合适的。不仅是阅读变得困难,而且代码的维护也很麻烦。比如:现在我们的页面有以下几个页面:
现在的情况是,我们把这几个页面的处理代码都放在了app.py
这个文件里面,随着页面的继续增加,这个文件里的代码就变得越来越多,越来越难以阅读,这样显示是不好的。所以这时候就用到了蓝图
。
怎么理解蓝图呢?在这里就是把 /news/society/ 和 /news/tech/ 的相关功能组成一个蓝图 news
;程序将 /products/car/ 和 /products/baby/ 的相关功能组成一个蓝图 products
。
这里的一个蓝图就是news,products是一个单独的py文件。
就相当于一个模块下面由多个子模块,以前所有子模块放在一个文件里面,现在是把一个子模块变成一个单独的蓝图。最后再把这些蓝图整合在一起。
这时候程序的文件就变成了这样:2个蓝图,共3个文件
假设访问的页面路径是 /products/car,Flask 框架在蓝图 news 和蓝图 products 中查找匹配该页面路径的路由,发现在蓝图 products 中,存在和路径 /products/car 相应的处理函数 car_products,最后将请求转发给函数 car_products 处理。
蓝图news.py
#这是蓝图文件
from flask import Blueprint#蓝图的url前缀,前缀路径,在蓝图下面还有路径
bp = Blueprint('news',__name__,url_prefix='/news')#他们的绝对路径是/news/society
@bp.route('/society')
def society_news():return '社会新闻板块'@bp.route('/tech')
def tech_news():return 'IT 新闻板块'
首先是导入蓝图Blueprint
然后创建蓝图对象:
第1个参数’news’是蓝图的名称,暂时还不知道用处是什么。
第2个参数 __name__
是该蓝图所在的模块名,该蓝图的实现文件是 news.py,因此 __name__
是 ‘news’;
注意:蓝图文件是需要被导入的,如果是在news.py文件直接右键执行的时候,__name__ == '__main__'
,但是在被导入的时候,代码执行,__name__=='news'
,也就是模块名。
第 3 个参数是指定页面的 URL 前缀为 ‘/news’,它会影响路由中路径的设置。就是说,在news.py文件中的其他路由,它的绝对路径是/news/society,/news/tech,相当于是在/news这个路由下面的子路由。
创建一个蓝图对象,bp
,然后使用bp.route('/society')
设置这个蓝图内的路由,注意:是蓝图内的路由,在这个蓝图下的路由,而蓝图之外,访问需要使用前缀,就是/news/society
.
蓝图 products.py
#这是蓝图文件
from flask import Blueprintbp = Blueprint('products',__name__,url_prefix='/products')@bp.route('/car')
def car_products():return '汽车产品板块'@bp.route('/baby')
def baby_products():return '婴儿产品板块'
现在页面的逻辑被分开了,news和products是分开的,所以需要一个文件来组装他俩,那就是app.py文件
app.py
from flask import Flask
#导入蓝图文件
import news
import productsapp = Flask(__name__)
#注册蓝图,注册的是那个bp对象
app.register_blueprint(news.bp)
app.register_blueprint(products.bp)@app.route('/')
def hello_world(): # put application's code herereturn 'Hello World!'if __name__ == '__main__':app.run()
首先要导入刚才创建的两个py文件,就是蓝图文件。
接着使用注册蓝图的方法app.register_blueprint(news.bp)
,参数就是蓝图文件中创建的蓝图对象bp,这样就把两个蓝图文件组装起来了。
访问
更具拓展性的架构
在刚才的架构中,程序是这样的:
- 程序由主程序和多个蓝图构成;
- 每个蓝图对应一个 Python 文件;
- 所有的蓝图共享相同的模板文件目录;
- 所有的蓝图共享相同的静态文件目录。
当然这里没有用到模板文件和静态文件,如果用到的话,他们应该都放在templates和static文件夹下面。
还有一种方式的拓展性会更好:
使用一个独立的目录实现蓝图
在这种架构中,程序的扩展性最好:
- 程序由主程序和多个蓝图构成;
- 每个蓝图对应一个独立的目录,存储与这个蓝图相关的文件;
- 每个蓝图有一个独立的模板文件目录;
- 每个蓝图有一个独立的静态文件目录。
这时候的文件结构是这样的:
每一个蓝图文件有自己的static和templates文件夹,静态文件static与模板文件templates的寻找规则如下:
如果项目中的 static/templates文件夹中存在相应的静态文件/模板文件,则使用 static/templates 文件夹下的静态文件/模板文件;
如果项目中的 static/templates 文件夹中没有相应的静态文件/模板文件,则使用定义蓝图的时候指定的 static/templates 文件夹下的静态文件/模板文件。
这里会尝试的用到蓝图自己的模板文件与静态文件。
首先我们需要创建news和products两个包文件:python package.
创建完成后,会自动生成__init__.py文件,这个文件里将实现具体的代码,然后在分别给在两个包下面创建自己的static和templates文件夹。
文件结构如下:
实现 /news/_init_.py
from flask import Blueprint,render_template#每一个蓝图有自己的static和templates文件夹,需要设置路径
bp = Blueprint('news',__name__,url_prefix='/news',template_folder='templates',static_folder='static')@bp.route('/society')
def society_news():return render_template('society_news.html')@bp.route('/tech')
def tech_news():return render_template('tech_news.html')
这里需要设置以下templates和static文件的路径,template_folder='templates',static_folder='static'
这时候模板和静态文件会在这个路径下寻找。
对应的模板文件
实现/news/templates/society_news.html
:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>社会新闻板块</title><link rel="stylesheet" type="text/css" href="{{ url_for('news.static',filename='css/society_news.css') }}" />
</head>
<body><p>新闻板块</p>
<ul><li id="society">社会新闻板块</li><li>科技新闻板块</li><li>{{ url_for('news.static',filename='css/society_news.css') }}</li>
</ul>
</body>
</html>
加载css文件:
<link rel="stylesheet" type="text/css" href="{{ url_for('news.static',filename='css/society_news.css') }}" />
这里是news.static,不是news/static。
url_for('news.static',filename='css/society_news.css')
返回的是路径 /news/static/css/society_news.css
实现/news/static/css/society_news.css
li {font-size: 20px;
}
#society {color: red;
}
实现app.py
from flask import Flask
# from news import bp as news_bp
import news
import productsapp = Flask(__name__)
app.register_blueprint(news.bp)
#app.register_blueprint(products.bp)@app.route('/')
def hello_world(): # put application's code herereturn 'Hello World!'if __name__ == '__main__':app.run()
在我们导入import news
的时候,这个包下面的__init__.py
文件就会自动执行。
执行访问:
这个例子的结构就会更加的具有逻辑性。
Flask框架学习:蓝图的使用相关推荐
- Flask 框架学习_1
Flask 框架学习_1 Flask 框架 与 Django框架区别 Flask: 小巧.灵活,让程序员自己决定定制哪些功能,非常适用于小型网站. 对于普通的工人来说将毛坯房装修为城市综合体还是很麻烦 ...
- Flask框架学习整理——从零开始入门Flask
文章目录 Flask框架 一. 简介 二. 概要 三. 知识点(附代码) 1. Flask基础入门 1)路由route的创建: 2)endpoint的作用 3)request对象的使用 4)请求钩子b ...
- flask框架学习笔记
flask_day01 pycharm创建项目,连接到远程gitee仓库,创建仓库flask_study,分支helloworld, 自带第一个程序"helloworld",运行程 ...
- 谈谈Python的Flask框架学习与福利分享
在秋天中暑 熬过了炎炎夏日,却在这个初秋的日子中暑了.本来休息不好,今天又跑了一天,结果回来坐车吹空调冷热交替的崩溃了... 脑壳疼 回家就躺倒睡了一觉,感觉舒服点了,起床开电脑却又不知道学点什么,想 ...
- 【Python】flask框架学习 flask框架的基本使用
flask框架是什么? Flask 是一个轻量级的 Web 框架,用于构建 Web 应用程序.它基于 Python 编程语言和 Werkzeug 工具包,提供了简单易用的 API,可以轻松地创建 RE ...
- Flask框架学习(持续更新)
文章目录 目录 文章目录 前言 一.Flask是什么 二.Flask基础 1.路由规则 2.Flask-Cors 解决跨域问题 3.Flask-Uploads 接受浏览器上传的文件 4.Flask蓝图 ...
- Python开发-flask框架学习
最近闲来无事,帮别人一起看看python3与flask,据说他想搞个登录注册的小demo,然后就给看了下,顺便简单的跟他说明了下.本文只是记录我在给别人讲解怎么使用python3与flask还有mon ...
- Python Flask框架学习
1.安装flask框架 在自己python的环境下直接通过pip安装,不写版本会默认最新版本,安装同时安装其他的库,属于flask的依赖包. pip install flask 2.快速使用flask ...
- Flask框架学习笔记(1)
1.Flask简介 Flask和Django一样,也是一个基于MVC设计模式的Web框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 wdb 应用程序可以使一 ...
- Python Flask框架学习笔记14
数据库一对一的关系: 实现一对一的关系,只需要在一对多的基础上,将"多"的那一端设置为"一"即可. 书上举得例子是:用户拓展表. 在公司业务增长的情况下,需要存 ...
最新文章
- mac redies install
- 线程运行程序c语言,理解线程1 C语言示例的程序
- C语言文件操作(五)将txt格式16进制编码转化为txt格式汉字
- 学会做“男人”—Linux Man的使用技巧
- intellij默认maven仓库配置路径+默认New Project 工程路径
- 华为5720设置静态路由不通_【干货分享】交换机与路由器在环路中的处理机制了解一下!...
- 本地mysql无法监听_查询数据库出错,监听器无法监听
- Spring Cloud学习笔记-009
- 前馈神经网络对mnist数据集实战
- MATLAB xlswrite 写数据 到 Excel文件
- paip.html调试工具--显示控件名称与值
- SpringMVC工作原理及其流程
- [hdu3873] Invade the Mars
- 如何通过树莓派/Python/smtp发送电子邮件
- SIM800C AT指令编程
- 定时执行mysql数据库任务方案
- 【UE Unreal Camera】【保姆级教程二】手把手教你通过UE获取摄像头帧数据
- Oracle日期函數
- 盖世汽车 2021中国汽车智能座舱与用户体验大会视频
- windows mobile注册表修改小全
热门文章
- 解决方案 | 解决Adobe Acrobat 2020安装报错的一些问题,如无法打开键
- 2019辽宁公务员考试行测常识大全:公务员常识40000问(四十八)(2)
- git pull 强制覆盖原版本
- 罗振宇《时间的朋友2018》+视频4小时 百度网盘
- MyEclipse8.5开发环境配置,SVN插件安装问题(转载)
- Web网站模板-健身房宣传响应式网站模板(HTML+CSS+JavaScript)
- 【渝粤教育】国家开放大学2018年春季 0034-21T现代管理原理 参考试题
- F.grid_sample
- java other_在Java中,方法成为public / private / other是什么意思?
- ios16更新了什么内容 ios16更新内容汇总