当前位置: 首页 > 面试题库 >

将Flask的Click CLI与应用程序工厂模式一起使用

江奕
2023-03-14
问题内容

我使用应用程序工厂模式定义了Flask应用程序。使用Flask-
Script时,我可以将factory函数传递给Manager。我想改用Flask的内置Click CLI。如何通过Click使用工厂?

我当前的代码使用Flask-Script。如何使用Click执行此操作?

from flask import Flask
from flask_script import Manager, Shell

def create_app():
    app = Flask(__name__)
    ...
    return app

manager = Manager(create_app)

def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)

manager.add_command('shell', Shell(make_context=make_shell_context))

if __name__ == '__main__':
    manager.run()

问题答案:

flask命令是使用创建的Click界面flask.cli.FlaskGroup。创建您自己的组并将其传递给工厂功能。使用app.shell_context_processor对象添加到外壳。

from flask import Flask
from flask.cli import FlaskGroup
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def create_app(script_info=None):
    app = Flask(__name__)
    db.init_app(app)
    ...

    @app.shell_context_processor
    def shell_context():
        return {'app': app, 'db': db}

    return app

cli = FlaskGroup(create_app=create_app)

@cli.command
def custom_command():
    pass

if __name__ == '__main__':
    cli()

运行文件而不是flask命令。您将使用工厂获得Click界面。

FLASK_DEBUG=1 python app.py run

理想情况下,创建一个入口点并将软件包安装在环境中。然后,您可以将脚本作为命令来调用。setup.py至少使用以下内容创建一个文件。

project/
    app/
        __init__.py
    setup.py



from setuptools import setup, find_packages

setup(
    name='my_app',
    version='1.0.0',
    packages=find_packages(),
    entry_points={
        'console_scripts': [
            'app=app:cli',
        ],
    },
)



pip install -e /path/to/project
FLASK_DEBUG=1 app run

与内置flask命令相比,使用自己的CLI的鲁棒性较弱。因为您的cli对象是用其他代码定义的,所以模块级错误将导致重新加载器失败,因为它无法再导入该对象。该flask命令与您的项目分开,因此不受模块错误的影响。



 类似资料:
  • 我正在尝试让一个简单的HTTP控制台应用程序作为Azure服务应用程序运行。它所做的只是在连接时返回OK。它在我的笔记本电脑上运行良好,我可以使用VS2019发布到Azure ok。问题是用于监听的前缀。 在我的笔记本电脑上,我可以使用超文本传输协议://: 80/; https://: 443/,但在Azure中,我得到一个错误:[例外]访问被拒绝。 本文https://github.com/p

  • 我正在尝试学习python、mongodb和flask,我正在使用Miguel Grinberg提供的非常优秀的博客,他在博客上提供了一套很棒的教程。米格尔格林伯格。通用域名格式 我有一个小的RESTful服务器工作正常,但现在想从mongo而不是mysql中提取东西 我可以使用下面的代码拉出mongo记录,但我很难让它呈现出来。 我在下面的代码中使用了箭头来显示我在哪里挣扎,我认为缺乏经验。任何

  • 在Martin Fowler的书中,我读到了和模式。 作者提到,将identityMap放在UnitOfWork内部是一个好主意。但怎么做呢? 据我所知,受会话限制,但作者没有提到 每个unitOfWork实例需要多少个IdentityMap实例? 如果我们有两个并发请求呢?

  • 在本教程中,我将尝试从外部manage.py文件中获取现有的应用程序 我的应用程序结构如下: manage.py文件: 最后是文件(简化): 因此,当我尝试运行:,输出为: 无法解析从导入的配置。我试图解决这与chdir可见在manage.py. 我的环境变量是我从工作设置中获得的: 我通过替换以下内容成功通过了导入指令: 通过 但是整个项目包含从myserver开始的导入 所以最后一个问题是:为

  • 如果您已经开始使用包和蓝图(用蓝图实现模块化的应用)辅助您的应用开发了,那么 这里还有一些非常好的办法可以进一步的提升开发体验。当蓝图被导入的时候, 一个通用的模板将会负责创建应用程序对象。但是如果你将这个对象的创建工作 移交给一个函数来完成,那么你就可以在此后创建它的多个实例。 这么做的目的在于: 测试。你可以使用多个应用程序的实例,为每个实例分配分配不同的配置, 从而测试每一种不同的情况。 多

  • 问题内容: 我正在使用应用程序工厂模式来设置我的Flask应用程序。我的应用程序使用Flask- Babel扩展程序,该扩展程序也在工厂中设置。但是,我想以蓝图的形式访问该扩展程序以便使用它, 工厂在。 我想添加以下内容: 不幸的是,无法从应用程序工厂访问变量。我应该如何解决这个问题? 问题答案: 正是这种情况下,Flask扩展被设计为无需应用程序实例即可实例化。在工厂外,定义扩展。在工厂内部,致

  • 问题内容: 如何在RoR中使用CSS?当我从外部链接时,我永远看不到文件。我将.css文件cp到我能想到的每个文件夹…视图,控制器,模板,似乎没有任何作用。 要使用Rails应用程序启用外部CSS文件,我需要做什么?我是Rails的新手,如果这是基本知识,请原谅我。 问题答案: 将CSS文件放在public / stylesheets中,然后使用: 链接到布局中的样式表或视图中的erb文件。 同样

  • 工厂-创建对象而不向客户机公开实例化逻辑,并通过公共接口引用新创建的对象。是工厂方法的简化版本 工厂方法-定义一个创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象。 抽象工厂-提供了创建相关对象家族的接口,而无需显式指定它们的类。 null