在应用程序工厂之外访问 Flask 配置

2023-12-02

我目前正在使用带有蓝图的 Flask 应用程序工厂模式。我遇到的问题是如何访问应用程序工厂之外的 app.config 对象?

我不需要 Flask 应用程序中的所有配置选项。我只需要6把钥匙。因此,我当前执行此操作的方法是在调用 create_app(应用程序工厂)时,我基本上创建一个 global_config 字典对象,然后将 global_config 字典设置为具有我需要的 6 个键。

然后,其他需要这些配置选项的模块,只需导入 global_config 字典即可。

我在想,必须有更好的方法来做到这一点,对吗?

那么,进入代码

我现在的init.py 文件:

def set_global_config(app_config):
    global_config['CUPS_SAFETY'] = app_config['CUPS_SAFETY']
    global_config['CUPS_SERVERS'] = app_config['CUPS_SERVERS']
    global_config['API_SAFE_MODE'] = app_config['API_SAFE_MODE']
    global_config['XSS_SAFETY'] = app_config['XSS_SAFETY']
    global_config['ALLOWED_HOSTS'] = app_config['ALLOWED_HOSTS']
    global_config['SQLALCHEMY_DATABASE_URI'] = app_config['SQLALCHEMY_DATABASE_URI']


def create_app(config_file):
    app = Flask(__name__, instance_relative_config=True)

    try:
        app.config.from_pyfile(config_file)
    except IOError:
        app.config.from_pyfile('default.py')
        cel.conf.update(app.config)
        set_global_config(app.config)
    else:
        cel.conf.update(app.config)
        set_global_config(app.config)

    CORS(app, resources=r'/*')
    Compress(app)

    # Initialize app with SQLAlchemy
    db.init_app(app)
    with app.app_context():
        db.Model.metadata.reflect(db.engine)
        db.create_all()

    from authenication.auth import auth
    from club.view import club
    from tms.view import tms
    from reports.view import reports
    from conveyor.view import conveyor

    # Register blueprints
    app.register_blueprint(auth)
    app.register_blueprint(club)
    app.register_blueprint(tms)
    app.register_blueprint(reports)
    app.register_blueprint(conveyor)
    return app

需要访问这些 global_config 选项的模块示例:

from package import global_config as config

club = Blueprint('club', __name__)

@club.route('/get_printers', methods=['GET', 'POST'])
def getListOfPrinters():
    dict = {}

    for eachPrinter in config['CUPS_SERVERS']:
        dict[eachPrinter] = {
            'code': eachPrinter,
            'name': eachPrinter
        }
    outDict = {'printers': dict, 'success': True}
    return jsonify(outDict)

必须有一种更好的方法,然后在应用程序中传递全局字典,正确吗?


这里不需要使用全局名称,这首先就违背了使用应用程序工厂的目的。

在视图中,例如在您的示例中,current_app绑定到处理当前应用程序/请求上下文的应用程序。

from flask import current_app

@bp.route('/')
def example():
    servers = current_app.config['CUPS_SERVERS']
    ...

如果您在设置蓝图时需要访问该应用程序,record装饰器标记使用蓝图正在注册的状态调用的函数。

@bp.record
def setup(state):
    servers = state.app.config['CUPS_SERVERS']
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在应用程序工厂之外访问 Flask 配置 的相关文章

随机推荐

  • 错误:重新渲染次数过多。 React 限制渲染数量以防止无限循环。反应js

    我目前正在学习反应 但我有这个错误 错误 重新渲染次数过多 React 限制渲染数量以防止无限循环 这是代码 const Status setStatus useState false if sessionStorage getItem t
  • 正则前瞻千位分隔符的正则表达式不会匹配点后的数字

    我正在使用以下正则表达式将逗号 插入 到 JavaScript 中的数字中 d d 3 d 它可以很好地处理整数 但是当处理十进制数时 它会失败 例如 10000 001223456 结果为 1 234 568 0 000 454 554
  • img 最大宽度与百分比它是如何工作的?

    我是响应式网页设计的新手 正在寻找answer 它并没有真正解释太多 但提供了一个解决方案 If an img被设置为width 100 据我所知 它将占据 100 的浏览器窗口或其包含元素 The max width财产states它用于
  • Networkx 中具有要访问的“关键”节点的最短路径

    我有一个用networkx开发的python G有向图 该图具有称为 权重 的权重 我知道一个显式的起始节点 A 和一个结束节点 F 在图之间可以访问节点 B C D E 我如何明确地说他必须通过找到最短路径来访问 B 和 D 并且还可以添
  • Gitlab 生成变更日志脚本

    第一次使用Gitlab 我的本地 PC 上有一个现有的 Web 项目 我运行了这些命令 cd myFolder git init git add git remote add origin remote repository URL git
  • 使用facet_wrap时空facet的排序/放置

    考虑以下分面图 该图以 2x2 排列绘制 3 个分面 空的面位于右下角 library ggplot2 ggplot mtcars aes x wt y mpg geom point facet wrap factor cyl ncol 2
  • Windows Phone 7 如何上传图片到服务器

    我的代码想要将图片上传到服务器 如下所示 但总是失败 你知道为什么吗 public static void SendRequest System Text StringBuilder sReq byte sbyteData Action
  • Woocommerce 每种电子邮件类型都有不同的标头

    我使用 Woocommerce 需要根据其类型更改电子邮件标头 以便 customer new account php customer processing order php admin new order php 等等 它们必须有不同
  • 将纬度/经度转换为像素 XY 坐标

    这种类型的问题似乎已经被问过很多次了 但是发布的解决方案都没有让我接近我需要的答案 我有这张新西兰北国地图 我想将纬度 经度值映射到该图像上的 x y 像素 值 https i stack imgur com 3ok4O gif 这是400
  • C++ STL 中向量的恒定时间交换逻辑

    为什么交换两个 C STL 向量的内容所需的时间复杂度与相应向量的大小无关 参考 http www cplusplus com reference vector vector swap 典型的向量实现存储 分配器 指向第一个元素的指针 指向
  • 将 SmallInt 与 Ord 函数的结果进行比较时的警告

    我正在比较一个SmallInt变量与结果Ord功能 例子 var MySmallInt SmallInt begin MySmallInt 5 if MySmallInt gt Ord C then ShowMessage True els
  • 是否可以更改 C# 中的对象类型

    为了满足客户的要求 我遇到了一些问题 我将尽力使示例保持简单 只是给出问题的想法并希望提出解决方案 此时我们有一个类 Shape 例如 形状有一些特殊化 它可以是正方形 三角形等 到目前为止一切都很好 一切都很好 现在 出于某种原因 我的客
  • SRSS 2008 R2 的 C# 报表呈现器 - 缺少参数

    我正在使用 C 呈现来自 SRSS 2008 R2 的报告 该报告有参数 很长一段时间我在渲染输出时都没有问题 然而今天它决定行不通了 这是错误 ReportServerException This report requires a de
  • 根据生成构建文件时不可用的源文件在 CMake 中创建库

    我有一个构建两个库的 CMake 配置文件 第三方库 此处称为 ThirdPartyLib 包含来自供应商的实时操作系统 主板支持包 它是使用 autotools 工具链在 CMake 外部构建的 前一个库的扩展版本 此处称为 Extend
  • 为什么 Maven 在安装过程中可能会忽略更新的类?

    在进行 war 安装时 我在 Maven 2 2 1 安装中看到了奇怪的行为 有时 我会更新一个类 但更新的版本没有打包在 mvn install 生成的工件中 到目前为止 我已经确定在目标目录中生成了更新的 class文件 并且生成的 w
  • 在phantomjs中设置一个字符串作为网页的响应

    嗨 我想做的不是将网页获取为 page open url 而是设置一个已经作为页面响应检索到的字符串 可以吗 是的 就像分配给 page content 一样简单 通常还值得设置一个 page url 否则 如果使用 Ajax SSE 等进
  • WSO2 身份服务器电子邮件作为用户名

    我们目前正在评估 WSO2 身份服务器 我们想使用电子邮件地址作为用户名 默认情况下 用户名是 30 个字符 不够长 而且它必须同时支持两者 和用户名中的 有没有办法配置这个 用户存储是一个 JDBC Mysql 存储 Thanks 是的
  • 实时更新网页

    我正在制作一款类似于 Risk 的基于浏览器的多人回合制策略游戏 现在 最简单的方法似乎就是让它像普通网页一样 每次玩家刷新时 网页都会向数据库查询所需的信息 这是可以接受的 但我更愿意实时更新页面 这样玩家就不必不断刷新页面 我可以让网页
  • 导出 ES6 模块中的多个类

    我正在尝试创建一个导出多个 ES6 类的模块 假设我有以下目录结构 my module Foo js Bar js index js Foo js and Bar js每个导出一个默认的 ES6 类 Foo js export defaul
  • 在应用程序工厂之外访问 Flask 配置

    我目前正在使用带有蓝图的 Flask 应用程序工厂模式 我遇到的问题是如何访问应用程序工厂之外的 app config 对象 我不需要 Flask 应用程序中的所有配置选项 我只需要6把钥匙 因此 我当前执行此操作的方法是在调用 creat