Flask的奥秘四
一、蓝图
-
什么是蓝图?
在开发中不可能只有一个视图模块,甚至有多个app在一个项目中,蓝图就是为了使项目的目录结构清晰的一个功能模块,可以使多个Flask实例对象由一个Flask实例对象来管理,当请求到来时,由这个Flask对象分发给其他的Flask对象。 -
简单使用一下蓝图
第一步:新建一个项目,在根目录中创建views包第二步:在新建的views包中的__init__.py文件中实例化一个Flask对象
第三步:在views包中创建其他的视图模块
第四步:在views包中的__init__.py文件中导入创建的视图模块,并注册在app中
第五步:新建一个py文件,导入__init__.py文件中的app,再执行app.run()就可以运行了。
目录结构如下:
init.py 文件类容如下:
# -*- coding:utf-8 -*- from flask import Flask # 导入视图模块view1,view2 from . import view1 from . import view2 #实例化Flask对象 app = Flask(__name__) # 在app中注册视图模块中的Blueprint对象 app.register_blueprint(view1.view1) app.register_blueprint(view2.view2)
view1.py 文件类容如下:
# -*- coding:utf-8 -*- # 导入flask中Blueprint from flask import Blueprint # 实例化Blueprint view1 = Blueprint("view1", __name__) @view1.route("/view1_1", methods=['get', 'post']) def view1_test1(): return "view1_test1" @view1.route("/view1_2", methods=['get', 'post']) def view1_test2(): return "view1_test2"
view2.py 文件内容如下:
from flask import Blueprint view2 = Blueprint("view2", __name__) @view2.route("/view2_1", methods=['get', 'post']) def view2_test1(): return "view2_test1" @view2.route("/view2_2", methods=['get', 'post']) def view2_test2(): return "view2_test2"
run.py 文件内容如下:
# -*- coding:utf-8 -*- from views import app if __name__ == '__main__': app.run()
-
其他
视图模块中的flask对象可以单独访问templates和static文件,先到最外层寻找资源文件,再到指定的资源文件
acc = Blueprint(“acc”, name, template_folder=’’, static_folder=’’, url_prefix=’/xxx’)
url_prefix=’/xxx’ : 为每一个视图模块的路由路径添加"/xx", 否则无法访问。
template_folder=’’ : 指定模板文件位置
static_folder=’’ : 指定静态文件位置可以再每一个视图模板中添加单独的请求扩展,其他视图模板不执行
蓝图对象的名称,不能与方法名称相同
ps:使用蓝图,文件结构不限于上文提到的结构,只要导入相关的模块,实现上面的方法即可。
二、上下文管理先导
说到上下文管理,就一定要先说说多线程中的threading.local对象
- 什么是threading.local, 有什么用处
threading.local是threading模块中的对象,能够为每一个线程创建一个独立的内存空间来存储数据,这样可以避免加锁 - threading.local 的实现
其实这里面就是一个字典,以每一个线程的唯一标识作为key,value就是需要存储的数据
简单实现如下:
# get_ident可以获取线程的唯一标识 from _thread import get_ident # 创建local类 class local(object): def __init__(self): # 初始化有一个local_dict字典,get_ident两个属性 object.__setattr__(self, "local_dict", {}) object.__setattr__(self, "get_ident", get_ident) def __setattr__(self, key, value): self.local_dict[self.get_ident()] = {key: value} def __getattr__(self, item): try: return self.local_dict[self.get_ident()][item] except: return None
这样就可以简单实现threading.local ,为每一个线程创建一个独立空间
在flask中也用到threading.local,有一点不同的是,上面写的类只支持线程,而flask中的还支持协程。
ps:下一篇介绍flask上下文管理机制
- Flask的奥秘五
- flask笔记(2)
- flask 单元测试
- Flask+Nginx+Gunicorn+Redis+Mysql搭建一个小站
- Dec-21th-Flask-note
- 白帽学院靶场之编辑器的奥秘(一)
- 2018最新网易云课堂Python Flask框架全栈开发
- python web开发 之 flask教程(二)
- 网易云课堂Python Flask框架全栈开发(200课全)
- windows 7 下安装eclipse,python,pydev,flask步骤
- Flask01
- Flask 安装和配置(RedHat环境)
- flask中的蓝图实现模块化的应用
- Flask 多文件基本结构
- Ubuntu 14.04 配置 Nginx + uWSGI 托管 virtualenv 下 Flask 应用的一点注意事项
- Flask入门(五)~request模块的属性及上下文
- 【翻译】使用nginx作为反向代理服务器,uWSGI作为应用服务器来部署flask应用
- python—Flask学习3------输出"Hello World"
- flask笔记:7:用户资料信息页和头像
- Flask学习系列7.1—Flask前端页面使用