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操作系统网络配置
- WinForm 实现点击一个按钮,执行另一个按钮事件
C# 代码如下: private void button1_Click(object sender, EventArgs e) { this.button1.Click += new System.E ...
- windows dos命令
dos命令配置环境变量: path=%path%;D:\Installed software\Professional software\Python27 (https://www.cnblogs ...
- 剑指offer-顺时针打印矩阵-二维数组
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
- MySQL--忘记MYSQL管理员密码
如root用户密码,可以按照以下方式来修改: STEP1: 停止MySQL服务 ps -ef | grep -v 'grep' | grep 'mysqld' | awk '{print $2}' | ...
- day41 python【事物 】【数据库锁】
MySQL[五] [事物 ][数据库锁] 1.数据库事物 1. 什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性 ...
- PipelineDB 1.0.0 发布——使用标准的pg 扩展开发模型
PipelineDB 1.0.0 发布已经发布了,现在的已经成为一个标准的pg 扩展了,语法也有变动 create continous view 修改为了view,create streaem 修改为 ...
- smarty 学习 ——smarty 开发环境配置
smarty 对于开发的便利性不用多说了,直接进行开发环境的配置. 1.下载smarty 开发包 直接在官网进行下载即可 2.引用开发核心库 将libs文件中的东西拷贝到工程. smarty.clas ...
- zeroMQ 学习
zeroMQ 是一个高性能的分布式设计的消息队列,网上有人进行过性能的比较,非常厉害,并且很大约40多种语言的API 可以调用,真实很不错的. 而且有一点就是使用简单,不需要服务器,对于使用C/C++ ...
- JUC集合之 CopyOnWriteArraySet
CopyOnWriteArraySet介绍 它是线程安全的无序的集合,可以将它理解成线程安全的HashSet.有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类A ...