内容:

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中的蓝图与红图的更多相关文章

  1. 第九篇 Flask 中的蓝图(BluePrint)

    第九篇 Flask 中的蓝图(BluePrint)   蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? ...

  2. Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...

  3. Flask 中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开 怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查 ...

  4. 9,Flask 中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西,在Flask中的蓝图 blueprint 也是非常宏伟的,它的作用就是将 功能 与 主服务 分开. 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的 ...

  5. 第八篇 Flask中的蓝图

    随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的.这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦.如下示例:我们在一个文件中写入多个路由,这会使代码维护变得困难. 如图所示,如 ...

  6. Flask中的蓝图(BluePrint)、

    蓝图 1.初识Flask蓝图(BluePrint) 创建一个项目然后将目录结构做成: user.py中的内容 from flask import Blueprint, render_template ...

  7. flask中的蓝图(BluePrint)

    蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...

  8. Flask 中的蓝图

    相当与django中的App 基础模板 1.初识Flask蓝图(blueprint) 创建一个项目然后将目录结构做成: s_view.py 文件中的内容   from flask import Blu ...

  9. flask 中使用蓝图将路由分开写在不同文件

    flask 若想将不同的路由写在不同的文件中(如将 user 对象的相关接口写在一个文件中,将 customer 对象的相关接口写在另一个文件中),可以使用蓝图来实现. 有关蓝图的定义:A Bluep ...

随机推荐

  1. Linux操作系统网络配置

  2. WinForm 实现点击一个按钮,执行另一个按钮事件

    C# 代码如下: private void button1_Click(object sender, EventArgs e) { this.button1.Click += new System.E ...

  3. windows dos命令

    dos命令配置环境变量: path=%path%;D:\Installed software\Professional software\Python27   (https://www.cnblogs ...

  4. 剑指offer-顺时针打印矩阵-二维数组

    输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1     2  3    4 5     6  7    8 9   10 11 12 13 14 15 16 ...

  5. MySQL--忘记MYSQL管理员密码

    如root用户密码,可以按照以下方式来修改: STEP1: 停止MySQL服务 ps -ef | grep -v 'grep' | grep 'mysqld' | awk '{print $2}' | ...

  6. day41 python【事物 】【数据库锁】

    MySQL[五] [事物 ][数据库锁]   1.数据库事物 1. 什么是事务  事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性 ...

  7. PipelineDB 1.0.0 发布——使用标准的pg 扩展开发模型

    PipelineDB 1.0.0 发布已经发布了,现在的已经成为一个标准的pg 扩展了,语法也有变动 create continous view 修改为了view,create streaem 修改为 ...

  8. smarty 学习 ——smarty 开发环境配置

    smarty 对于开发的便利性不用多说了,直接进行开发环境的配置. 1.下载smarty 开发包 直接在官网进行下载即可 2.引用开发核心库 将libs文件中的东西拷贝到工程. smarty.clas ...

  9. zeroMQ 学习

    zeroMQ 是一个高性能的分布式设计的消息队列,网上有人进行过性能的比较,非常厉害,并且很大约40多种语言的API 可以调用,真实很不错的. 而且有一点就是使用简单,不需要服务器,对于使用C/C++ ...

  10. JUC集合之 CopyOnWriteArraySet

    CopyOnWriteArraySet介绍 它是线程安全的无序的集合,可以将它理解成线程安全的HashSet.有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类A ...