flask中的蓝图与红图
内容:
1.flask中的蓝图
2.flask子域名实现
3.flask中的红图
1.flask中的蓝图
一个大型项目中视图比较多,如果仅仅是写在app.py中不方便管理,蓝图就可以做到分功能分目录结构
(1)什么是蓝图
蓝图:用于实现单个应用的视图、模板、静态文件的集合。
蓝图就是模块化处理的类
简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。 在Flask中,使用蓝图可以帮助我们实现模块化应用的功能。
蓝图的功能:
- 批量url
- 自定义模板路径/静态文件路径
- 请求扩展:针对app、针对某个蓝图
(2)蓝图的运行机制
蓝图是保存了一组将来可以在应用对象上执行的操作。
注册路由就是一种操作,当在程序实例上调用route装饰器注册路由时,这个操作将修改对象的url_map路由映射列表。当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一个项。
当执行应用对象的 register_blueprint() 方法时,应用对象从蓝图对象的 defered_functions 列表中取出每一项,即调用应用对象的 add_url_rule() 方法,这将会修改程序实例的路由映射列表
(3)蓝图基本使用
首先在views包下的user.py创建蓝图并注册蓝图路由:
from flask import redirect, render_template, Blueprint
main = Blueprint('user', __name__)
@main.route('/index')
def index():
return "index"
注意:蓝图的名字千万不要与你下面的视图函数的名字重复,否则无法导入蓝图,程序报错!
然后在app.py中实例化注册该路由:
from flask import Flask
from views.user import main as route_user app = Flask(__name__) # 将蓝图注册到app:
app.register_blueprint(route_user, url_prefix="/user") if __name__ == '__main__':
print(app.url_map)
app.run(debug=True, host='localhost')
注意url_prefix是给注册的蓝图添加路由前缀
(4)蓝图应用
蓝图简单程序目录结构:

run.py:
from pro_flask import app if __name__ == '__main__':
app.run()
pro_flask下的__init__.py:
from flask import Flask app = Flask(__name__, template_folder='templates', static_folder='statics', static_url_path='/static') from .views.account import account
from .views.blog import blog
from .views.user import user app.register_blueprint(account)
app.register_blueprint(blog)
app.register_blueprint(user)
views下的user.py:
from flask import Blueprint
user = Blueprint('user', __name__)
@user.route("/index")
def index():
return "index"
蓝图复杂程序目录结构:

run.py:
from pro_flask import app if __name__ == '__main__':
app.run()
pro_flask下的__init__.py:
from flask import Flask
from .admin import admin
from .web import web app = Flask(__name__)
app.debug = True app.register_blueprint(admin, url_prefix='/admin')
app.register_blueprint(web)
应用以web为例,admin同理:
web应用下的__init__.py:
from flask import Blueprint web = Blueprint(
'web',
__name__,
template_folder='templates', # 指定应用自己的模板文件路径
static_folder='static' # 指定应用自己的静态文件路径
)
from . import views
web应用下的views.py:
from . import web
@web.route('/index')
def index():
return 'Web.Index'
2.flask子域名实现
(1)什么是子域名
子域名类似xxx.douban.com的形式,比如book.douban.com、movie.douban.com、music.douban.com、time.douban.com
(2)flask子域名实现
# __author__ = "wyb"
# date: 2018/8/31 from flask import Flask app = Flask(import_name=__name__)
app.config['SERVER_NAME'] = 'wyb666.com:80' # 子域名 -> xxx.wyb666.com
# 静态子域名 -> xxx是固定的
# subdomain指定子域名
@app.route("/", subdomain="admin")
def static_index():
"""
Flask supports static subdomains
This is available at static.your-domain.tld
"""
return "static.your-domain.tld" # 动态子域名 -> xxx不是固定的
# subdomain指定子域名(下面的<username>类似正则表达式)
@app.route("/dynamic", subdomain="<username>")
def username_index(username):
"""
Dynamic subdomains are also supported
Try going to username.your-domain.tld/dynamic
"""
return username + ".your-domain.tld" if __name__ == '__main__':
app.run()
(3)本地如何测试
上述程序运行后在浏览器中输入admin.wyb666.com将出现如下画面:

这是由于DNS解析的原因,DNS解析可以大致理解为访问一个网站,输入网址后将解析成IP地址访问 (域名->IP地址)
本地flask程序运行的IP是127.0.0.1,这里并没有对应关系,在Windows中可以通过修改host来实现添加或改变这个对应关系
在本地运行,本地访问时要修改host文件,将上述的子域名与127.0.0.1对应:
127.0.0.1 www.wyb666.com
127.0.0.1 admin.wyb666.com
127.0.0.1 wyb.wyb666.com
、、、
然后运行程序再访问就可以了:

(4)蓝图子域名实现
当然上面的方法实际上在项目中用到的很少,一般大型项目毫无疑问要使用到蓝图来搭建项目结构,同样蓝图也可以实现子域名:
蓝图子域名:xxx = Blueprint('account', __name__, subdomain='admin')
注意:
- 前提需要给配置SERVER_NAME: app.config['SERVER_NAME'] = 'wyb666.com:5000'
- 访问时:admin.wyb666.com:5000/login.html
3.flask中的红图
(1)什么是红图
蓝图是模块级别的拆分,它不是设计来让你拆分视图函数的。
要实现比模块级别下更具体的视图函数的拆分,例如在用Flask制作REST API时版本号下根据不同业务对象的函数拆分时,我们就需要自定义一个跟蓝图功能相同的模块。在这里,为了体现它跟蓝图的异曲同工之妙,我们将它命名为红图!
如图所示:

(2)红图实现
实现Redprint,主要是参考blueprint的源码(原理)进行一些改造,如下所示:
class Redprint:
def __init__(self, name):
self.name = name
self.mound = [] def route(self, rule, **options):
def decorator(f):
self.mound.append((f, rule, options))
return f
return decorator def register(self, bp, url_prefix=None):
if url_prefix is None:
url_prefix = '/' + self.name
for f, rule, options in self.mound:
endpoint = options.pop("endpoint", f.__name__)
bp.add_url_rule(url_prefix + rule, endpoint, f, **options)
(3)详细原理与使用方法
详细推荐看此:https://blog.csdn.net/wang6821906/article/details/81437608
flask中的蓝图与红图的更多相关文章
- 第九篇 Flask 中的蓝图(BluePrint)
第九篇 Flask 中的蓝图(BluePrint) 蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? ...
- Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开 怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查 ...
- 9,Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西,在Flask中的蓝图 blueprint 也是非常宏伟的,它的作用就是将 功能 与 主服务 分开. 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的 ...
- 第八篇 Flask中的蓝图
随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的.这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦.如下示例:我们在一个文件中写入多个路由,这会使代码维护变得困难. 如图所示,如 ...
- Flask中的蓝图(BluePrint)、
蓝图 1.初识Flask蓝图(BluePrint) 创建一个项目然后将目录结构做成: user.py中的内容 from flask import Blueprint, render_template ...
- flask中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- Flask 中的蓝图
相当与django中的App 基础模板 1.初识Flask蓝图(blueprint) 创建一个项目然后将目录结构做成: s_view.py 文件中的内容 from flask import Blu ...
- flask 中使用蓝图将路由分开写在不同文件
flask 若想将不同的路由写在不同的文件中(如将 user 对象的相关接口写在一个文件中,将 customer 对象的相关接口写在另一个文件中),可以使用蓝图来实现. 有关蓝图的定义:A Bluep ...
随机推荐
- linux-performance
1. top 2. cat /proc/meminfo nvidia@tegra-ubuntu:~/zrj/laneseg_TRT$ cat /proc/meminfo MemTotal: kB Me ...
- 有道词典 安卓版 更新日志 - imsoft.cnblogs
手机词典 更新日志: 2014年4月23日 v5.0.4版本 · 新增“全球发音”功能,带来世界各国的英文口音,体验原汁原味的英语发音: · 新增“发现频道”,打造移动 ...
- OVSSL企业证书认证
最近,在做http->https的转化,虽然我没有操作证书的安装过程,但是在这个过程中学习到不少知识呢. 因为我没有操作,所以操作上我就不知道了.下面是这个过程中要注意的一些事项: 1.公司名称 ...
- 【vue】Vue调试神器vue-devtools安装
转载:https://segmentfault.com/a/1190000009682735 前言 vue-devtools是一款基于chrome游览器的插件,用于调试vue应用,这可以极大地提高我们 ...
- codeforces315Div1 B Symmetric and Transitive
http://codeforces.com/contest/568/problem/B 题意就是给一个有n个元素的集合,现在需要求有多少个A的二元关系p,使得p是对称的,是传递的,但不是自反的. 首先 ...
- 五、概念数据模型(CDM生成LDM,PDM和OOM)
概念数据模型 概念数据模型(Conceptual Data Model,CDM):表达的是数据整体逻辑结构,该结构独立于任何软件和数据存储结构,即它只是系统分析人员,应用程序设计人员,维护人员和用 ...
- 使用OPRT库来实现局域网视频实时传输
转载,侵删 4.代码设计 目的:使用OPRT库来实现局域网视频实时传输 参考samle_venc.c进行ortp开发 4.1.程序流程如下 step1:定义变量,VPSS,VENC,零散变量 step ...
- webpack的3个路径配置项: assetsRoot、assetsSubDirectory、assetsPublicPath
在 vue-cli 构建模版的配置文件config.js中有assetsRoot,assetsSubDirectory和assetsPublicPath这三个路径配置项 assetsRoot:构建输出 ...
- ElementUI 知识点
类型是number的el-input 去掉滚轮事件: @mousewheel.native.prevent <el-input type="number" @mousewhe ...
- @Resource、@Autowired、@Qualifier 区别(表格显示)
@Resource.@Autowired.@Qualifier 区别(表格显示) 区别项 @Resource @Autowired @Qualifier 谁提供的 jdk提供,包是javax.anno ...