【问题标题】:How should I create a Flask extension which depends on another extension?我应该如何创建一个依赖于另一个扩展的 Flask 扩展?
【发布时间】:2018-08-08 14:17:08
【问题描述】:

我想创建一个依赖于另一个 Flask 扩展的 Flask 扩展。为了争论,说它是 Flask-Foo,它需要 Flask-Redis 将一些特定的数据存储在 Redis 数据库中。

我知道我可以向 Flask-Redis 添加安装依赖项。但是我不明白我应该如何实例化和初始化 Flask-Redis。

  1. Flask-Foo 的设置设置了 Flask-Redis 对象。 这样做的缺点是它假定应用程序由于某些其他原因也没有使用 Flask-Redis ,在 Flask-Foo 之外显式配置。如果是,我们会得到两个并排存在的对象,这似乎是错误的。

  2. 用户必须自己实例化和配置 Flask-Redis。 Flask-Foo 检查它是否已为该应用程序初始化,否则会抱怨。问题在于它似乎给用户强加了样板文件——当他们对 Flask-Redis 的配置没有其他知识或兴趣时,为什么他们必须设置 Flask-Redis 才能使用 Flask-Foo?此外,如果这意味着Flask-Foo.init_app() 总是必须在Flask-Redis.init_app() 之后调用,我们不是自找麻烦吗?

  3. 不要使用 Flask-Redis。 直接使用 Redis 包,在 Flask-Foo 代码中管理连接。这可能会避免上述问题。但这似乎并不优雅——我们基本上必须解决 Flask-Redis 解决的问题。如果 Flask-Foo 继续支持替代数据库,它将变得复杂,因为我们必须维护代码来管理不同类型的连接。

需要明确的是,这不是一个专门关于 Flask-Redis 或其工作原理的问题!我只是想了解在扩展之上构建扩展的正确方法通常是什么。

【问题讨论】:

    标签: python flask


    【解决方案1】:

    您可以将依赖扩展传递给 init_app。 http://flask.pocoo.org/docs/1.0/extensiondev/

    flask_foo/init.py

    class FooManager:
    
        def __init__(self, app=None, db=None, **kwargs):
            self.app = app
            if app is not None:
                self.init_app(app, db, **kwargs)
    
        def init_app(self, app, db, **kwargs):
            self.db = db
    
            app.config.setdefault('xxx', xxx)
    
            # Bind Flask-Foo to app
            app.foo_manager = self
    

    现在,您可以像这样从current_app 获取foo_manager 对象:

    models.py

    from flask import current_app
    
    db = current_app.foo_manager.db
    
    
    class XXX(db.Model):
        pass
    

    最后,也许你必须通过 app_context() 注册 foo

    运行.py

    with app.app_context():
        FooManager(app, db)  # or xx = FooManager(); xx.init_app(app, db)
    

    很棒,依赖扩展对我们很有用。

    其他提示:https://stackoverflow.com/a/51739367/5204664

    【讨论】:

      【解决方案2】:

      Flask 扩展与 python 模块具有相同的结构。您应该在 setup.py 文件中指定所有要求。 例如flask-babel

      install_requires=[
          'Flask',
          'Babel>=2.3',
          'Jinja2>=2.5'
      ],
      

      【讨论】:

      • 感谢您的回答!我理解这部分。我不太确定的是应该如何初始化模块及其依赖项。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多