内容:

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. 51Nod:1265 四点共面

    计算几何 修改隐藏话题 1265 四点共面  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出三维空间上的四个点(点与点的位置均不相同),判断这4个点 ...

  2. 1010. Radix (25) pat

    Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The an ...

  3. 【问题】解决在微信公众号里面网站无法访问:oops something went wrong:(

    最近在用一个第三方微信公众平台托管工具连接微信公众平台时,发现一个问题——在微信里面的官网网站链接没法在微信里面打开(无论是手机端还是PC端),会出现Oops! Something went wron ...

  4. hdu2064

    hdu2064 汉诺塔变形,数学题 #include<stdio.h> ]; int main(){ A[]=; int i; ;i<=;i++){ A[i]=*A[i-]+; } ...

  5. 思维题(两点逼近)LeetCode11 Container with Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  6. S5PV210 移植无线wifi网卡 MT7601

    一.准备工作 1.MT7601驱动下载 点击下载 2.插入usb WiFi 启动开发板linux,lsusb查看usb驱动 Bus 001 Device 003: ID 148f:7601看到的是该驱 ...

  7. FastAdmin 如何用 composer bower 安装

    FastAdmin 如何安装 composer bower 众所周知的原因,compower bower 安装并不怎么稳定. 刚开始安装时还有侥幸,用软件安装里的设置端口代理,composer 倒是可 ...

  8. virtualbox centos安装增强工具和问题详解

    virtualbox centos安装增强工具和问题详解 VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox 在虚拟机中安装 ...

  9. thinkphp3.2用户登录ajax提交验证

    html代码 <if condition="!isset($_SESSION['account'])"> <div class="load lf&quo ...

  10. C# 解析 json Newtonsoft果然强大,代码写的真好

    C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...