说明

  • 操作系统:Windows 10
  • Python 版本:3.7x
  • 虚拟环境管理器:virtualenv
  • 代码编辑器:VS Code

实验目标

学习如何使用 Blueprint

介绍

接触过 DotNet MVC 开发的朋友应该都对 路由 的概念有一定的了解。所谓 路由 就是指我们访问一个网站时,这个网站各个页面访问时对应的 URL 地址。在我们的网站不是很复杂时,我们可以使用最原始的方法来设计路由,但是对待一个大型项目如果我们的路由不能进行统一管理和配置的话,那么对于项目后期来说,是无法维护的。

对于 Flask 来说,当我们的项目达到一定级别的话,可以尝试将我们的项目进行模块化设计,那么对应的路由我们也应该通过某种方式来进行统一管理和配置,这个时候就可以使用 Blueprint 来解决。

Blueprint 中文叫 蓝图,其作用是用于路由的模块化配置与管理。其常用参数如下图所示:

其中常用的几个参数为:

  • name: 蓝图名称;
  • import_name:导入的名称,使用 name 即可;
  • url_prefix:蓝图的访问前缀;

使用

打开 Windows Cmd,执行下述操作:

mkdir flask_bp

python -m viratulenv venv

venv\Scripts\activate

pip install flask

code .

执行完毕后,VS Code 会自动加载该目录并启动起来,我们尝试创建一个最简单的示例程序看一下效果,组织一下我们的项目代码,如下图所示:

我们创建了一个项目名为 app 的模块,这个模块作为我们的项目根目录,然后在里面创建了一个 home 子模块,这个模块我们作为我们网站的一个子站点,然后会被注册到主程序中。

定义

app\home \ init.py 的示例代码如下所示:

from flask import Blueprint

bp = Blueprint('home', __name__)

from . import views

使用

app\home\views.py 的示例代码如下所示:

from flask import render_template
from . import bp @bp.route('/index')
@bp.route('/')
def index():
msg = '我是来至模块 home 的视图函数'
return render_template('home/index.html', msg=msg)

添加页面

app\templates\base.html 的示例代码如下所示:

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Flask-bp</title>
</head> <body>
{% block content %}{% endblock %}
</body> </html>

app\templates\home\index.html 的示例代码如下所示:

{% extends 'base.html' %} {% block content %}
<center>
<h1>{{msg}}</h1>
</center>
{% endblock %}

注册

app_init_.py 的示例代码如下所示:

from flask import Flask
from .home import bp as home_bp app = Flask(__name__) app.register_blueprint(home_bp, url__prefix='/')

添加启动函数

manage.py 的示例代码如下所示:

from app import app

if __name__ == "__main__":
app.run(debug=True)

修改完毕后,尝试在当前虚拟环境中执行 flask run 来运行我们的程序,会出现如下图所示的界面:

需要补充的一点是,如果我们在 HTML 中访问某个模块的视图函数,可以通过 modulename.routename 方式,在上述的示例中,如果我们想访问到 home 模块中 的 “Index” 路由,那么可以通过 home.index 方式即可。

总结

Blueprint 支持多种配置方式,包括当前模块的路由规则,静态资源的访问位置。需要说明的一点时,由于我们引入了模块化的编程方式,所有可能存在模块与模块之间循环引入的问题,如果出现这种情况的话,我们的某些自定义模块就无法成功导入,这个时候我们可以尝试在某一函数段进行局部导入,这样就可以了。

相关参考

Flask 系列之 Blueprint的更多相关文章

  1. Flask 系列之 部署发布

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过 Windows 的 WSL,将我们的项目网站部署到 ...

  2. Flask系列04--Flask的蓝图

    flask蓝图 一.蓝图 蓝图(Blueprint),类似于实现django中路由分发那种感觉, 可以把Blueprint理解为不能被run的Flask对象 Blueprint实例化时需要的参数 基本 ...

  3. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  4. Flask - Flask的蓝图(BluePrint)

    目录 Flask - Flask的蓝图(BluePrint) 一. 初始Flask蓝图 进阶Flask蓝图 使用蓝图做一个增删改查 1.使用蓝图进行web应用搭建: 2.使用Flask蓝图,查看学生信 ...

  5. Flask 蓝图(Blueprint)使用方式解析

    Flask蓝图提供了模块化管理程序路由的功能,使程序结构清晰.简单易懂.下面分析蓝图的使用方法 假如说我们要为某所学校的每个人建立一份档案,一个很自然的优化方式就是这些档案如果能分类管理,就是说假如分 ...

  6. Flask系列07--Flask中的CBV, 蓝图的CBV

    一.CBV使用 class base view 和django中类似 class Login(views.MethodView): # methods=["POST"," ...

  7. Flask系列(三)蓝图、基于DButils实现数据库连接池、上下文管理

    知识点回顾 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Ani ...

  8. Flask系列之蓝图中使用动态URL前缀

    让我们先来看一个简单的例子,假设有下面这样一个蓝图(是关于用户主页的): from flask import Blueprint, render_template profile = Blueprin ...

  9. Flask系列之源码分析(一)

    目录: 涉及知识点 Flask框架原理 简单示例 路由系统原理源码分析 请求流程简单源码分析 响应流程简单源码分析 session简单源码分析 涉及知识点 1.装饰器 闭包思想 def wapper( ...

随机推荐

  1. mysqldump 导出中文乱码

    命令:mysqldump -uroot -p test > /data/test.sql 导出后的数据库打开是乱码,如下: 开始以为打开的方式不对,就用记事本打开后,用utf-8的编码格式另保存 ...

  2. JavaScript中如何检测一个变量是一个String类型?

    typeof x === "string" typeof(x) === "string' // 小写 x.constructor === String // 大写类型 同 ...

  3. 位运算-出现k次与出现一次

    题目:数组中arr只有一个数出现了1次,其他的数都出现了k次,请输出这个只出现了一次的数. 思路:这道题目要求使用位运算实现,如果采用数据结构Map就会简单很多.解此题前先了解不进位加法的思想,比如两 ...

  4. Python爬虫——Python 岗位分析报告

    前两篇我们分别爬取了糗事百科和妹子图网站,学习了 Requests, Beautiful Soup 的基本使用.不过前两篇都是从静态 HTML 页面中来筛选出我们需要的信息.这一篇我们来学习下如何来获 ...

  5. 开源播放器 ijkplayer (六) :Android 下使用 ijkplayer 异常处理思路

    一. java.lang.IllegalStateException: mpjni: setOptionLong: null mp 根据已查到的资料看,目前是ijk内部的问题,只能通过try& ...

  6. [Bash]LeetCode193. 有效电话号码 | Valid Phone Numbers

    Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bas ...

  7. [Swift]LeetCode286. 墙和门 $ Walls and Gates

    You are given a m x n 2D grid initialized with these three possible values. -1 - A wall or an obstac ...

  8. [Swift]LeetCode336. 回文对 | Palindrome Pairs

    Given a list of unique words, find all pairs of distinct indices (i, j) in the given list, so that t ...

  9. [Swift]LeetCode747. 至少是其他数字两倍的最大数 | Largest Number At Least Twice of Others

    In a given integer array nums, there is always exactly one largest element. Find whether the largest ...

  10. [Swift]LeetCode789. 逃脱阻碍者 | Escape The Ghosts

    You are playing a simplified Pacman game. You start at the point (0, 0), and your destination is (ta ...