1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中

我们在这单个文件中可以定义路由、视图函数、定义模型等等。

但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程序文件中,是非常不合适的。

这不仅会让代码阅读变得困难,而且会给后期维护带来麻烦。

2. 问题怎么解决呢

一个程序执行文件中,功能代码过多。  让代码实现模块化

       尝试用模块的导入的方式解决

       把一个文件拆开,把视图函数按照不同的功能进行划分,分成不同的文件,然后建立一个主文件,在主文件中。利用模块导入的方法,

  这是我的文件目录

可以在其他文件里面把视图函数放出去,然后利用装饰器传入参数的方式进行在主文件中把其他视图的路由进行绑定

from flask import Flask
from Blueprint_le.goods import get_goods
from Blueprint_le.users import register
# 循环引用,解决的方法,推迟一方的导入,让一方先完成
# 使用装饰器的函数使用方法,解决模块分割的问题
app = Flask(__name__)
app.route("/get_goods")(get_goods)
app.route("/register")(register)@app.route("/")
def index():return "index page"if __name__ == '__main__':print(app.url_map)app.run()

3. 什么是蓝图?

蓝图:用于实现单个应用的视图、模板、静态文件的集合。

   蓝图就是模块化处理的类。

简单来说,蓝图就是一个存储操作路由映射方法的容器,主要用来实现客户端请求和URL相互关联的功能。

在Flask中,使用蓝图可以帮助我们实现模块化应用的功能。

4.蓝图的运行机制:

蓝图是保存了一组将来可以在应用对象上执行的操作。

注册路由就是一种操作,当在程序实例上调用route装饰器注册路由时,这个操作将修改对象的url_map路由映射列表。

当我们在蓝图对象上调用route装饰器注册路由时,它只是在内部的一个延迟操作记录列表defered_functions中添加了一       个项。当执行应用对象的 register_blueprint() 方法时,应用对象从蓝图对象的 defered_functions 列表中取出每一项,即      调用应用对象的 add_url_rule() 方法,这将会修改程序实例的路由映射列表。

5.蓝图的使用

(1)创建蓝图对象

'''Blueprint必须指定两个参数,admin表示蓝图的名称,__name__表示蓝图所在模块'''
admin = Blueprint('admin',__name__)

(2)  注册蓝图的路由

@admin.route('/')
def admin_index():return 'admin_index'

(3) 在程序中注册该蓝图

app.register_blueprint(admin,url_prefix='/admin')

6.蓝图的使用例子

     以目录的形式定义蓝图以及蓝图里面模板目录的处理

1. 首先我的目录结构和我的程序和模板存放的目录为:

2. 使用目录分割,在cart目录里面的_ _ init _ _.py里面创建蓝图,并且要把视图加载进来

from flask import Blueprint'''创建蓝图          修改模板路径为当前templates的路径,还有一个设置静态的目录static_folder'''
app_cart = Blueprint("app_cart", __name__, template_folder="templates")'''在__init__.py执行的时候,把视图加载进来,让蓝图与应用程序知道有视图的存在'''
# Blueprint_le.cart.views :  从路径里面的views.py导入get_cart视图函数
from Blueprint_le.cart.views import get_cart

3. 在views.py里面使用蓝图,定义视图函数,

定义模板 cart.html存放在cart里面的templates下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>cart page</h1>
</body>
</html>

views.py

from flask import render_template
from Blueprint_le.cart import app_cart@app_cart.route("/get_cart")
def get_cart():return render_template("cart.html")

4.不使用目录的分割形式也可以,例如建立order.py,建立蓝图

from flask import Blueprint'''创建一个蓝图的对象,蓝图就是一个小模块的抽象的模块'''app_orders = Blueprint("app_orders", __name__)@app_orders.route("/get_orders")
def get_orders():return "get orders page"

5.然后建立一个main.py在里面实现主要的代码:

from flask import Flask
from Blueprint_le.orders import app_orders
from Blueprint_le.cart import app_cartapp = Flask(__name__)'''注册蓝图     ,    url_prefix:给访问的路径加一个前缀'''
app.register_blueprint(app_orders, url_prefix="/orders")
app.register_blueprint(app_cart, url_prefix="/cart")@app.route("/")
def index():return "index page"if __name__ == '__main__':# 打印出所有的路由print(app.url_map)app.run(debug=True)

6.  首先可以访问 没有使用目录分割的orders,    运行程序,浏览器访问   127.0.0.1:5000/orders/get_orders

 然后可以访问使用目录分割的cart,浏览器访问 127.0.0.1:5000/cart/get_cart

7.  如果蓝图里面的小目录里面没有找到模板,则会去顶级的templates的目录里面去找

    如果在蓝图的小目录的templates的模板和总的templates的模板重名的话,则会使用总的templates里的模板

  

Flask框架(flask中的蓝图Blueprint)相关推荐

  1. Flask 中的蓝图 Blueprint

    Flask 中的蓝图 Blueprint 在实际的项目开发中,需要实现的功能是很多的,通常来说一个功能至少需要一个视图函数,代码量比较大. 如果将所有视图函数都写在同一个 py 文件中,功能没有问题, ...

  2. Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)

    1.  SQLAlchemy是一个关系型数据库框架, 它提供了高层的ORM和底层的原生数据库的操作. flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展. 2. 安装 ...

  3. Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)

    1.请求上下文与应用上下文 请求上下文(request context) request和session都属于请求上下文对象. 应用上下文(application context) current_a ...

  4. Flask框架(flask中设置和获取session)

    1. session 数据是保存到后端的数据库中 2.session中的从狭义和广义上分:   (1)session,广义上 :          是一种机制:在前端当中存一个session_id , ...

  5. Flask框架(flask中对cookie的处理(设置cookie、获取cookie、删除cookie))

    在Flask中对cookie的处理 1. 设置cookie: 设置cookie,默认有效期是临时cookie,浏览器关闭就失效 可以通过 max_age 设置有效期, 单位是秒 resp = make ...

  6. Flask框架(flask中设置响应信息的方法,返回json数据的方法)

    设置响应信息的方法 1.  返回自定义的响应头,有两种方式: (1)  第一种是:视图函数return的时候,使用元组,返回自定义的信息           返回的时候的状态码可以自定义信息:&quo ...

  7. Flask框架(flask中的request对象,获取请求参数,保存上传的文件)

    1.request中包含了前端发送过来的所有数据 ,请求的 request 对象中保存了一次HTTP请求的一切信息. 通过request.from可以直接发送提取请求体中的表单格式数据,是一个类字典的 ...

  8. Flask框架(flask模板(jinja2)与字符串过滤器、列表过滤器以及自定义过滤器)

    模板变量 : {{name}} 1. 模板的定义: 模板变量 : {{name}} 2. 模板的渲染:  render_template("模板名字",键=值,键=值)       ...

  9. Flask框架—flask中的session

    Flask中的session session设置 Flask除请求对象之外,还有一个 session 对象. 它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 C ...

最新文章

  1. 事件计划自动关闭_首部L3级自动驾驶国际法规之ALKS功能解读
  2. ExtJS4.2:自定义主题 入门
  3. ITK:提取二进制图像中斑点的内部和外部边界
  4. 通过 SAP UI5 的 TypeScript 开发环境,来学习什么是 DefinitelyTyped
  5. python获取文件夹名_python基础之获取文件目录及名称
  6. 见证激情燃烧的汤姆·彼得斯(Tom Peters)
  7. 和菜鸟一起学linux之V4L2摄像头应用流程【转】
  8. freemarker 数组转字符串_freemarker中的split字符串分割
  9. 通过js操作jwplayer来播放暂停
  10. Google Web Accelerator
  11. 短信的发送(SMS)的发送
  12. 老司机手把手教php,老司机手把手教你玩驱魔!纯小白无脑驱魔攻略
  13. php实现撩妹,50个撩妹金句,充满套路又不失幽默
  14. mysql中的coalesce用法
  15. matlab 背包问题动态规划,从01背包问题理解动态规划---初体验
  16. 做一个像植物大战僵尸的Flash游戏5
  17. 阿尔法无线充电线圈有哪些?
  18. Anroid手机apk安装
  19. redux-thunk 源码解读
  20. Billy O’Riordan加盟Brightcove担任国际销售高级副总裁

热门文章

  1. 【多线程高并发】深入浅出可见性
  2. 计算机网络是如何通信的【一】
  3. ifelse语句是否必须以else结尾?
  4. Vue——请求转发配置解决方案
  5. mysql数据库系统配置文件_MySQL数据库(6)----配置文件 my.cnf 的使用
  6. FreeMarker学习
  7. Python基础day06【匿名函数lambda、列表生成式、集合set、文件读写】
  8. Fiddler抓包使用教程-QuickExec
  9. hbuilder egit插件的安装使用--项目文件丢失的教训
  10. 0/1背包问题——动态规划方法