在Flask蓝图中保持“全局”变量

1 投票
1 回答
2503 浏览
提问于 2025-04-17 23:00

假设我有一个比较简单的主应用,然后有一系列的蓝图(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_requestafter_request 等),这样你可以重用这一组视图,或者方便地将这一组视图一起禁用。它们仍然是在Flask应用的上下文中运行,所以它们总是可以访问应用的配置。

因此,如果你想让CSV模块的路径可以配置,那就把这个路径设置在你的应用配置中,并使用 Blueprint.record_once() 钩子 来根据应用配置读取CSV文件。

撰写回答