在Flask蓝图中保持“全局”变量
假设我有一个比较简单的主应用,然后有一系列的蓝图(Blueprints),这些蓝图可以引导我到其他页面。
接着,我有一些模块可以读取csv文件,并利用这些数据来执行一些功能。
from py_csv_entry import entry
class python_csv:
def __init__(self, csv_location):
self.data = []
self.read_csv(csv_location)
def read_csv(self):
with open(csv_location + 'python_csv.csv') as csv_data:
read = csv.reader(csv_data):
for row in read:
self.data.append(entry(*row))
我想在我的蓝图中使用这个模块来存放数据。
在一个应用中,我通常会这样做:
app.config['python'] = python_csv('/path/to/file')
但是当我尝试在蓝图中这样做时,就出现了以下错误:
AttributeError: 'Blueprint' object has no attribute 'config'
在蓝图的概念中,如何绑定一个全局变量呢?
1 个回答
5
如果这些数据是固定不变的,且一般来说是“全局”的,那就直接把它放在全局里。把它放在你的模块里,在模块加载的时候读取CSV文件,然后就可以使用这些数据了。
蓝图(Blueprints)则是从应用对象中获取配置的;配置是指在不同的应用(网站)之间会变化的内容,但这让你可以重用你的蓝图。因此,配置是和应用绑定在一起的,而蓝图只是读取这些配置。
蓝图其实就是一组视图和相关的信号处理器(比如 before_request
、after_request
等),这样你可以重用这一组视图,或者方便地将这一组视图一起禁用。它们仍然是在Flask应用的上下文中运行,所以它们总是可以访问应用的配置。
因此,如果你想让CSV模块的路径可以配置,那就把这个路径设置在你的应用配置中,并使用 Blueprint.record_once()
钩子 来根据应用配置读取CSV文件。