Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我应该如何创建一个依赖于另一个扩展的烧瓶扩展?_Python_Flask - Fatal编程技术网

Python 我应该如何创建一个依赖于另一个扩展的烧瓶扩展?

Python 我应该如何创建一个依赖于另一个扩展的烧瓶扩展?,python,flask,Python,Flask,我想创建一个烧瓶扩展,它依赖于另一个烧瓶扩展。为了便于讨论,假设它是Flask Foo,需要Flask Redis在Redis数据库中存储一些特定的数据 我知道我可以向Flask Redis添加安装依赖项。然而,我不明白我应该如何实例化和初始化Flask Redis Flask Foo的设置设置Flask Redis对象。这一设置的缺点是,它假定应用程序出于某些其他原因(在Flask Foo外部显式配置)未使用Flask Redis。如果是,我们得到两个并排存在的物体,这似乎是错误的 用户必须自

我想创建一个烧瓶扩展,它依赖于另一个烧瓶扩展。为了便于讨论,假设它是Flask Foo,需要Flask Redis在Redis数据库中存储一些特定的数据

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

  • Flask Foo的设置设置Flask Redis对象。这一设置的缺点是,它假定应用程序出于某些其他原因(在Flask Foo外部显式配置)未使用Flask Redis。如果是,我们得到两个并排存在的物体,这似乎是错误的

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

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


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

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


    您可以将depend扩展传递给init_应用程序

    flask_foo/init.py 现在,您可以从
    current\u app
    获取
    foo\u manager
    对象,如下所示:

    models.py 最后,也许您必须通过app_context()注册foo:

    run.py 太好了,这对我们有好处


    其他提示:

    谢谢您的回答!我理解这部分。我不太确定的是模块及其依赖项应该如何初始化。
    install_requires=[
        'Flask',
        'Babel>=2.3',
        'Jinja2>=2.5'
    ],
    
    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
    
    from flask import current_app
    
    db = current_app.foo_manager.db
    
    
    class XXX(db.Model):
        pass
    
    with app.app_context():
        FooManager(app, db)  # or xx = FooManager(); xx.init_app(app, db)