您的位置:首页 > 其它

Flask的奥秘四

2020-07-14 05:46 344 查看

一、蓝图

  1. 什么是蓝图?
    在开发中不可能只有一个视图模块,甚至有多个app在一个项目中,蓝图就是为了使项目的目录结构清晰的一个功能模块,可以使多个Flask实例对象由一个Flask实例对象来管理,当请求到来时,由这个Flask对象分发给其他的Flask对象。

  2. 简单使用一下蓝图
    第一步:新建一个项目,在根目录中创建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()
  1. 其他

    视图模块中的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对象

  1. 什么是threading.local, 有什么用处
    threading.local是threading模块中的对象,能够为每一个线程创建一个独立的内存空间来存储数据,这样可以避免加锁
  2. 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上下文管理机制

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: