蓝图,听起来就是一个很宏伟的东西

在Flask中的蓝图 blueprint 也是非常宏伟的

它的作用就是将 功能 与 主服务 分开怎么理解呢?

比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将

查看客户,修改客户,添加客户,删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做一个这样的例子,但是首先我们要搞清楚什么是蓝图 blueprint

1.初识Flask蓝图(blueprint)

创建一个项目然后将目录结构做成:

s_view.py 文件中的内容

 
from flask import Blueprint  # 导入 Flask 中的蓝图 Blueprint 模块

sv = Blueprint("sv", __name__)  # 实例化一个蓝图(Blueprint)对象

@sv.route("/svlist")  # 这里添加路由和视图函数的时候与在Flask对象中添加是一样的
def view_list():
return "svlist_view_list"

manager.py 文件中的内容

 
from flask import Flask

# 导入此前写好的蓝图模块
from student_view import s_view app = Flask(__name__) # type:Flask # 在Flask对象中注册蓝图模块中的蓝图对象 s_view 中的 sv
app.register_blueprint(s_view.sv) app.run("0.0.0.0",5000)
# 现在Flask对象中并没有写任何的路由和视图函数

开启服务,然后访问 http://127.0.0.1:5000/svlist 查看结果

很明显,我们没有在Flask对象中添加路由,但是我们注册了有路由和视图函数的sv蓝图对象

2.如何理解蓝图呢?

其实我们可以理解成一个没有run方法的Flask对象,这个理论虽然有很多的漏洞,但是对于刚接触蓝图的你来说,就这么样理解,没有错

下面来看一下,在实例化蓝图的时候可以传递的参数都有什么,你就能完全理解了

这是目录结构

s_view.py 文件中的内容 :

 
from flask import Blueprint  # 导入 Flask 中的蓝图 Blueprint 模块
from flask import render_template sv = Blueprint("sv",
__name__,
template_folder="sv_template", # 每个蓝图都可以为自己独立出一套template模板文件夹,如果不写则共享项目目录中的templates
static_folder="sv_static" # 静态文件目录也是可以独立出来的
) # 实例化一个蓝图(Blueprint)对象 @sv.route("/svlist")
def view_list():
return render_template("svlist.html")

svlist.html 文件中的内容

 
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
Hello ! I am sv_template
<img src="/sv_static/DragonFire.png">
</body>
</html>

打开页面看结果

露脸了,露脸了~

从这个例子中我们总结出:

Blueprint 其实可以理解为一个了没有run方法的 Flask 对象

只要Blueprint被 Flask 注册了,就一定会生效

坑来了!坑来了!

蓝图内部的视图函数及route不要出现重复,否则~你们自己试试吧

3.使用蓝图,做一个增删改查用户

要有一个文件存放我们的原始数据

student_data.py 文件中的内容:

STUDENT = [
{'id': 1, 'name': 'Old', 'age': 38, 'gender': '中'},
{'id': 2, 'name': 'Boy', 'age': 73, 'gender': '男'},
{'id': 3, 'name': 'EDU', 'age': 84, 'gender': '女'}
]

然后我们根据以上内容进行增删改查

3.1 使用蓝图进行web应用搭建:

__init__.py 文件中的内容:

 
from flask import Flask

def create_app():
app = Flask(__name__) return app

这个文件我们会修改函数 create_app中的代码

manager.py 文件中的内容

from student import create_app

flask_app = create_app()

flask_app.run("0.0.0.0",5000)

通过这种方式启动 Flask 程序

3.2 使用Flask蓝图,查看学生信息

s_list.html 文件中的内容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生列表</title>
</head>
<body>
<form method="post">
ID:<input type="text" name="id"> <br>
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
性别:<input type="text" name="gender"><br>
<input type="submit" value="添加学生">
</form> </body>
</html>

s_add.html

stu_select.py 文件中的内容:

from flask import Blueprint
from flask import redirect
from flask import request
from flask import render_template
from student_data import STUDENT s_add = Blueprint("s_add", __name__, template_folder="html", static_folder="static") # type:Blueprint @s_add.route("/s_add",methods=["GET","POST"])
def s_add_view():
if request.method == "POST":
stu_dic = {
"id": request.form["id"],
"name": request.form["name"],
"age": request.form["age"],
"gender": request.form["gender"]
} STUDENT.append(stu_dic) return redirect("/s_list") return render_template("s_add.html")

stu_add.py

student/__init__.py 文件中的内容:

from flask import Flask
from student_select import stu_select
from student_add import stu_add def create_app():
app = Flask(__name__) # type:Flask app.register_blueprint(stu_select.ss_blueprint)
app.register_blueprint(stu_add.s_add) return app

student/__init__.py

赶紧运行一下manager.py 来访问一下,我们的成果

什么链接都不要点,因为点啥都不好使,之后咱们一个一个的做

3.3. 使用Flask蓝图,添加一个学生

s_add.html 文件中的内容

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生列表</title>
</head>
<body>
<form method="post">
ID:<input type="text" name="id"> <br>
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
性别:<input type="text" name="gender"><br>
<input type="submit" value="添加学生">
</form> </body>
</html>

s_add.html

stu_add.py 文件中的内容

from flask import Blueprint
from flask import redirect
from flask import request
from flask import render_template
from student_data import STUDENT s_add = Blueprint("s_add", __name__, template_folder="html", static_folder="static") # type:Blueprint @s_add.route("/s_add",methods=["GET","POST"])
def s_add_view():
if request.method == "POST":
stu_dic = {
"id": request.form["id"],
"name": request.form["name"],
"age": request.form["age"],
"gender": request.form["gender"]
} STUDENT.append(stu_dic) return redirect("/s_list") return render_template("s_add.html")

stu_add.py

这里面我们让他添加完一个学生,就返回到s_list查看学生列表

student/__init__.py 文件中的内容

from flask import Flask
from student_select import stu_select
from student_add import stu_add def create_app():
app = Flask(__name__) # type:Flask app.register_blueprint(stu_select.ss_blueprint)
app.register_blueprint(stu_add.s_add) return app

student/__init__.py

如果你要是重新启动服务了,那么你刚刚添加的学生信息就没有了

添加完成之后

添加学生的Blueprint已经做完了

3.4. 使用Flask蓝图,修改学生信息

s_update.html 文件中的内容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>学生列表</title>
</head>
<body>
<form method="post">
<input type="text" name="id" hidden value="{{ student.id }}"><br>
姓名:<input type="text" name="name" value="{{ student.name }}"><br>
年龄:<input type="text" name="age" value="{{ student.age }}"><br>
性别:<input type="text" name="gender" value="{{ student.gender }}"><br>
<input type="submit" value="修改信息">
</form> </body>
</html>

s_update.html

stu_update.py 文件中的内容:

from flask import Blueprint
from flask import render_template
from flask import redirect
from flask import request
from student_data import STUDENT s_update = Blueprint("s_update", __name__, template_folder="html", static_folder="static") @s_update.route("/s_update/<int:nid>",methods=["GET","POST"])
def s_update_view(nid):
if request.method == "POST":
stu_id = int(request.form["id"])
stu_dic = {
"id": stu_id,
"name": request.form["name"],
"age": request.form["age"],
"gender": request.form["gender"]
} for index,stu in enumerate(STUDENT):
if stu["id"] == stu_id:
STUDENT[index] = stu_dic return redirect("/s_list") for stu in STUDENT:
if stu["id"] == nid :
return render_template("s_update.html", student=stu) return render_template("s_update.html", student="")

stu_update.py

student/__init__.py 文件中的内容:

from flask import Flask
from student_select import stu_select
from student_add import stu_add
from student_update import stu_update def create_app():
app = Flask(__name__) # type:Flask app.register_blueprint(stu_select.ss_blueprint)
app.register_blueprint(stu_add.s_add)
app.register_blueprint(stu_update.s_update) return app

student/__init__.py

试一下结果:

修改的功能也已经做完了,同学们自己尝试做一下删除吧

Flask 之 蓝图的更多相关文章

  1. Flask - Flask的蓝图(BluePrint)

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

  2. Python Flask Blueprint 蓝图

    Python Flask Blueprint 蓝图 本篇来了解一下 Flask 中 Blueprint 蓝图,什么蓝图 ..就是一个分模块的扩展而已,用来让不同的 业务模块api 分到不同的pytho ...

  3. python flask框架 蓝图的使用

    蓝图的目的是实现 各个模块的视图函数写在不同的py文件当中. 主视图 中 导入 分路由视图的模块,并且注册蓝图对象 分路由视图中 利用 蓝图对象 的route 进行装饰视图函数 主路由视图函数: #c ...

  4. Flask的蓝图和红图

    1.蓝图 对于简单的项目来说,比如项目就只有一个user模块,我们可以都将视图函数定义在一个文件里面,不需要用到蓝图. 但是如果我们的项目有多个模块,如下有v1模块,v2模块.....等,那么如果我们 ...

  5. flask Blueprint蓝图

    首先要了解蓝图的作用,模拟场景在团队开发过程中团队每个人都在写自己负责的功能模块,那多个py文件模板,我们如果完成后需要运行是不是要运行多个服务?但是我们的项目是一个整体,而不是零散的,所以我们怎么把 ...

  6. flask框架----蓝图

    蓝图(flask中多py文件拆分都要用到蓝图) 如果代码非常多,要进行归类.不同的功能放在不同的文件,吧相关的视图函数也放进去.蓝图也就是对flask的目录结构进行分配(应用于小,中型的程序), 小中 ...

  7. flask使用蓝图,创建副本

    随着flask的发展,flask框架越来越复杂,我们需要进行模块化处理,因为之前学过python模块化管理,我可以对一个flask程序进行简单的模块化处理. 我们都有一个博客程序,由此可知博客的前端界 ...

  8. flask session,蓝图,装饰器,路由和对象配置

    1.Flask 中的路由   *endpoint - url_for 反向地址  *endpoint 默认是视图函数名  *methods 指定视图函数的请求方式,默认GET  defaults={& ...

  9. Flask之蓝图的使用

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

  10. Flask 中蓝图的两种表现形式

    最近在学Flask,特有的@X.route 很适合RESTfuld API, 一般小型应用,在一个py文件中就可以完成,但是维护起来比较麻烦. 想体验Django那样的MVT模式, 看到 Flask提 ...

随机推荐

  1. 【AGC035D】Add and Remove(脑洞 DP 分治)

    题目链接 大意 给出\(N\)个数的序列,每次操作可以选择连续的三个数,将中间的那个数抽出,将另外两个数的数值加上中间那个数的数值. 一直执行以上操作直到只剩最后两个数,求最后两个数的所有可能的和的最 ...

  2. 浅谈Java面向对象之抽象类(abstract)

    java语言,声明类时格式为: abstract class Db{} 说明Db类为抽象类.抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法.简而言之,含有抽象 ...

  3. asp.core 同时兼容JWT身份验证和Cookies 身份验证两种模式

    在实际使用中,可能会遇到,aspi接口验证和view页面的登录验证情况.asp.core 同样支持两种兼容. 首先在startup.cs 启用身份验证. var secrityKey = new Sy ...

  4. swoole错误“Uncaught Error: Class 'swoole_server' not found”的解决办法

    如果你在执行swoole对应文件时,报下面的错误, PHP Fatal error: Uncaught Error: Class 'swoole_server' not found in /mnt/w ...

  5. SpringBoot外部配置属性注入

    一.命令行参数配置 Spring Boot可以是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行: java -jar xx.jar 那么就可以通过命令行改变相关配置参数.例如默认tom ...

  6. 【论文考古】联邦学习开山之作 Communication-Efficient Learning of Deep Networks from Decentralized Data

    B. McMahan, E. Moore, D. Ramage, S. Hampson, and B. A. y Arcas, "Communication-Efficient Learni ...

  7. restFul接口设计规范[仅供参考]

    域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下. https://www.example.or ...

  8. Rainbond 5.6 版本发布,增加多种安装方式,优化拓扑图操作体验

    Rainbond 5.6 版本,主要致力于提升拓扑图操作效率以及快速安装体验,降低用户使用门槛. 主要功能点解读: 支持单机快速体验 为了方便在单机电脑上快速安装体验Rainbond,当前版本支持通过 ...

  9. PPT绝对不能没有它!精美酷炫的可视化图表来啦!

    从我们上学到工作,PPT我们见得多了,也做得多了.上学的时候最怕老师布置的作业是以PPT形式上交,工作中项目汇报.工作总结.年终汇报等,哪哪都需要用到PPT.PPT中文字太多,被批判不够简炼:图片太多 ...

  10. 【c# 操作符】- nameof用法

    最重要的是nameof不会影响性能! nameof有什么用?主要用解决 类成员名做参数替代成员们的字符串做参数,如下: using System; namespace csharp6 { intern ...