1.概念
蓝图可以使我们的程序更加模块化,不同功能的路由可以放在不同的模块下,最后集中到启动类中
它的作用就是将功能和主服务分开,类似django中我们创建的每一个app
2.蓝图常见架构方式
2.1 功能式架构
按照每部分的功能来组织应用,模板放在同一文件夹,视图存放同一文件夹
yourapp/ __init__.py static/ templates/ home/ control_panel/ admin/ views/ __init__.py home.py control_panel.py admin.py models.py
视图文件中的除了__init__.py,每一个文件都是一个了蓝图
所有的蓝图通过顶级的__init__.py注册到Flask()
中
2.2 分区式架构
按照每一部分所属的蓝图来组织应用,管理面板的所有的模板,视图和静态文件放在一个文件夹中,用户控制面板的则放在另一个文件夹中
yourapp/ __init__.py admin/ __init__.py views.py static/ templates/ home/ __init__.py views.py static/ templates/ control_panel/ __init__.py views.py static/ templates/ models.py
参考来源出处:参考出处链接
2.3 蓝图标准目录结构及用法
__init__.py
from flask import Flask from lastday.views.account import account from lastday.views.user import user def create_app(): """ 创建app应用 :return: """ app = Flask(__name__) # 引入配置文件并应用 app.config.from_object("settings.Development") app.register_blueprint(account) app.register_blueprint(user) # @app.before_request # def b1(): # print('b1') # # b1 = app.before_request(b1) app.before_request(b1) # app请求之前的中间件 return app def b1(): print('app_b1')
views/account.py
from flask import Blueprint account = Blueprint('account',__name__) @account.before_request def bb(): print('account.bb') @account.route('/login') def login(): return '登陆'
views/user.py
from flask import Blueprint,render_template user = Blueprint('user',__name__) @user.route('/user_list') def user_list(): return render_template('user_list.html')
templates/user_list.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>用户列表</h1> ... <img src="/static/imgs/teacher.jpg"> </body> </html>
manage.py
from lastday import create_app app = create_app() if __name__ == '__main__': app.run()
setting.py
class Base(object): SECRET_KEY = "fasdfasdf" class Product(Base): pass class Testing(Base): DEBUG = False class Development(Base): DEBUG = True
输入http://127.0.0.1:5000/login,终端打印:
输入http://127.0.0.1:5000/user_list,终端打印:
3. web应用搭建
实现基本的增删改查
目录结构
data.py
STUDENT = [ {"id":1,"name":"小a","age":"18"}, {"id":2,"name":"小b","age":"38"}, {"id":3,"name":"小c","age":"66"}, ]
manage.py
from student import create_app app = create_app() if __name__ == "__main__": app.run(port=5051,debug=True)
__init__.py
from flask import Flask from views import select from views import add from views import update from views import dels def create_app(): app = Flask(__name__) app.register_blueprint(select.my_list) app.register_blueprint(add.my_add) app.register_blueprint(update.my_update) app.register_blueprint(dels.my_del) return app
selsect.py
from flask import Blueprint from flask import render_template from data import STUDENT my_list = Blueprint("my",__name__,template_folder="../templates") @my_list.route("/list") def lists(): return render_template("list.html", student=STUDENT)
list.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="2px"> <button><a href="/add">添加</a></button> <thead> <tr> <th>id</th> <th>name</th> <th>age</th> <th>options</th> </tr> </thead> <tbody> {% for foo in student %} <tr> <td>{{ foo.id }}</td> <td>{{ foo["name"] }}</td> <td>{{ foo["age"] }}</td> <td><a href="/update/{{ foo.id }}">修改</a>|<a href="/del/{{ foo.id }}">删除</a></td> </tr> {% endfor %} </tbody> </table> </body> </html>
add.py
from flask import Blueprint from flask import request from flask import render_template from data import STUDENT my_add = Blueprint("add",__name__,template_folder="../templates") @my_add.route("/add",methods=["GET","POST"]) def adds(): if request.method == "POST": add_dic = { "id": request.form["id"], "name": request.form["name"], "age": request.form["age"], } STUDENT.append(add_dic) return render_template("add.html")
add.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>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="submit" value="添加"> </form> </body> </html>
update.py
#!/usr/bin/env python # -*- coding:utf-8 -*- # author: Learning time:2018/9/7 from flask import Blueprint from flask import request,redirect from flask import render_template from data import STUDENT my_update = Blueprint("my_update",__name__,template_folder="../templates") @my_update.route("/update/<int:nid>",methods=["GET","POST"]) def updates(nid): if request.method == "POST": ids = int(request.form["id"]) add_dic = { "id": ids, "name": request.form["name"], "age": request.form["age"], } for index,dicts in enumerate(STUDENT): if dicts["id"] == ids: STUDENT[index] = add_dic return redirect("/list") # 首次访问,get请求 for dic in STUDENT: if dic["id"] == nid: return render_template("update.html", student=dic) return render_template("update.html", student=" ")
update.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>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="submit" value="修改信息"> </form> </body> </html>
dels.py
from flask import Blueprint from flask import redirect from data import STUDENT my_del = Blueprint("my_del",__name__,template_folder="../templates") @my_del.route("/del/<int:nid>",methods=["GET","POST"]) def dels(nid): for dic in STUDENT: if dic["id"] == nid: STUDENT.remove(dic) return redirect("/list")
效果:
4.总结
1.Flask路由 1.endpoint="user" # 反向url地址 2.url_address = url_for("user") 3.methods = ["GET","POST"] # 允许请求进入视图函数的方式 4.redirect_to # 在进入视图函数之前重定向 5./index/<nid> # 动态参数路由 <int:nid> def index(nid) 6.strict_slashes # 是否严格要求路由地址 / 7.defaults={"nid":1} # def index(nid) 2.Flask初始化配置(实例化): 1.template_folder # 指定模板路径 2.static_url_path # 指定静态文件目录的URL地址 3.static_folder # 指定静态文件目录路径 3.Flask对象配置 1.DEBUG #开发模式的调试功能 True False 2.app.config.from_object(class) # 通过对象的方式导入配置 3.secret_key # 开启session功能的时候需要添加的配置 4.Blueprint 1.将功能和主程序分离,注册 2.bl = Blueprint("dongdong",__name__) 3.注册 register_blueprint(bl) 5.send_file jsonify 1.send_file # 打开并返回文件 content-type:文件类型 2.jsonify # 将一个字符串 转为JSON格式 加入 content-type:application/json 头 6.特殊的装饰器: 1.before_request # 在请求进入视图函数之前执行的函数(登录认证) 2.after_request # 在请求响应回浏览器之前执行的函数 3.before_first_request # 在第一次请求进入视图函数之前执行的函数 4.errorheader(404) # 当遇到此类错误响应的时候(自定义错误页面) 7.flash 1.flash("msg","tag") # 闪现存储 2.get_flashed_messages(category_filter=["tag"]) # 闪现取值 只要用到了get_flashed_messages就一定清空flash
详细介绍可参考链接:https://www.cnblogs.com/wupeiqi/articles/7552008.html