跳转到主要内容

基于Flask & SQLAlchemy构建的Web框架。位于Flask之上但低于Django。

项目描述

https://codecov.io/github/level12/keg/coverage.svg?branch=master https://img.shields.io/pypi/v/Keg.svg https://img.shields.io/pypi/l/keg.svg https://img.shields.io/pypi/pyversions/keg.svg https://img.shields.io/pypi/status/Keg.svg AppVeyor Build

酒桶是一个基于Flask和SQLAlchemy构建的,有见解但灵活的Web框架。

酒桶的目标

本项目目标是封装Flask最佳实践和库,以便开发者可以避免样板代码并专注于重要工作。

我们将倾向于在重要的事情上有见解(如将SQLAlchemy作为我们的ORM),同时尽可能支持钩子和定制。

想象一下,位于Flask之上但低于Django。

功能

默认日志配置

我们强烈推荐良好的日志实践,因此Keg应用程序会基本设置Python日志系统

  • 将根日志器的日志级别设置为INFO

  • 创建两个处理器并将它们分配给根日志器

    • 输出到stderr

    • 输出到syslog

  • 提供可选的JSON格式化工具

背后的思路是

  • 在开发过程中,开发者可以在标准输出(stdout)上看到日志消息,而无需监控文件。

  • 默认情况下,日志消息将存储在syslog中,如果开发者或系统管理员没有采取其他操作,则可以在那里进行审查。这避免了管理日志位置、权限、轮换等的需求。

  • 配置syslog守护进程将日志消息转发到不同的文件或远程日志服务器很容易,而且最好在syslog级别处理这类需求,而不是在应用级别。

  • 结构化日志文件(JSON)以易于解析的格式提供元数据细节,并且应该很容易生成。

  • 选项和输出应该可以从应用中轻松配置,以适应开发和部署场景中的不同需求。

  • Keg的日志设置应该很容易关闭和/或完全覆盖,以应对它弊大于利的情况。

安装

pip install keg

应用配置

命令行界面(CLI)命令

命令 <myapp> develop config 将提供有关配置应用所使用的文件和对象的详细信息。

配置文件优先级

所有名称为 DefaultProfile 的配置类将首先应用于应用的配置。

然后,将应用现有配置之上应用匹配“所选”配置文件的配置类。这使得“所选”配置文件的设置覆盖了 DefaultProfile 中的任何设置。

实际上,任何适用于整个应用的配置,无论其在何种上下文中使用,通常都会放在 DefaultProfile 类中的 myapp.config

选择配置配置文件

“所选”配置文件是Keg配置处理代码将查找的对象名称。它应该是一个字符串。

Keg应用将如下考虑“所选”配置文件

  • 如果将 config_profile 作为参数传递给 myapp.init(),则将其用作所选配置文件。命令行界面(CLI)选项 --profile 使用此方法设置所选配置文件,因此具有最高优先级。

  • 在应用的环境命名空间中查找“CONFIG_PROFILE”。如果找到,则使用它。

  • 如果在运行测试,则使用“TestProfile”。是否在应用模式下操作由以下控制

    • myapp.init(use_test_profile=True),它由 MyApp.testing_prep() 使用

    • 在应用的环境命名空间中查找“USE_TEST_PROFILE”,它由 keg.testing.invoke_command() 使用

  • 在应用的主要配置文件(app.config)及其所有其他配置文件中查找变量 DEFAULT_PROFILE。如果找到,则使用具有最高优先级的文件中的值。

视图

虽然通用的Flask视图肯定会在该框架中工作,但Keg提供了一个BaseView,它在路由和蓝图设置方面应用了一定程度的魔法。BaseView基于Flask的MethodView。最佳实践是在蓝图上设置蓝图,并通过 blueprint 属性将视图附加到它。请注意,BaseView的魔法在类创建时启动,因此稍后分配蓝图目前不会产生预期效果。

蓝图设置

通过视图上的 blueprint 属性添加视图。注意,BaseView魔法在类创建时启动,因此稍后分配蓝图目前不会产生预期效果。

import flask from keg.web import BaseView

blueprint = flask.Blueprint(‘routing’, __name__)

class VerbRouting(BaseView)

blueprint = blueprint

def get(self)

返回’method get’

一旦创建蓝图,就必须通过应用上的 use_blueprints 应用属性将其附加到应用中

from keg.app import Keg from my_app.views import blueprint

class MyApp(Keg)

import_name = ‘myapp’ use_blueprints = (blueprint, )

蓝图接受一些参数用于URL前缀和模板路径。BaseView在生成URL和查找模板时将尊重这些参数。

blueprint = flask.Blueprint(

‘custom’, __name__, template_folder=’../templates/specific-path’, url_prefix=’/tanagra’)

class BlueprintTest(BaseView)

# 模板“blueprint_test.html”应位于specific-path # 端点是custom.blueprint-test # URL是/tanagra/blueprint-test blueprint = blueprint

def get(self)

return self.render()

模板发现

为了避免要求开发者配置所有内容,BaseView将尝试根据视图类名发现视图的正确模板。通常,这是驼峰式到下划线符号的转换。蓝图名称包含在路径中,除非蓝图有自己的template_path定义。

  • class MyBestView位于名为“public”的蓝图 -> <app>/templates/public/my_best_view.html

  • class View2位于名为“other”的蓝图,其模板路径为“foo” -> <app>/foo/view2.html

视图可以给定一个template_name属性来覆盖默认文件名,尽管使用相同的路径进行发现

class TemplateOverride(BaseView)

blueprint = blueprint template_name = ‘my-special-template.html’

def get(self)

return self.render()

URL和端点计算

BaseView具有calc_urlcalc_endpoint类方法,这些方法允许开发者避免在代码中硬编码这些类型的值。这两个方法都将生成完整的URL/端点,包括(如果有的话)蓝图前缀。

路由生成

BaseView默认将为各自蓝图上的视图创建规则。通常,这是基于视图类名作为驼峰式到短划线符号的转换。

  • class MyBestView位于名为“public”的蓝图: /my-best-view -> public.my-best-view

  • class View2位于名为“other”的蓝图,其URL前缀为“foo”: /foo/view2 -> other.view2

注意,BaseView是MethodView实现,所以名为getpost等的方法将在请求/响应周期中被视为适当的目标。

视图可以给定一个url属性来覆盖默认值

class RouteOverride(BaseView)

blueprint = blueprint url = ‘/something-other-than-the-default’

def get(self)

return self.render()

有关BaseView支持的其它路由可能性,请参阅keg_apps/web/views/routing.py

组件

Keg组件遵循flask扩展的范例,并提供一些默认设置以用于设置模型/视图结构。使用组件,项目可以被分解为逻辑块,每个块都有自己的实体、蓝图、模板、测试等。

  • 组件需要在配置中的KEG_REGISTERED_COMPONENTS进行注册

    • 此处提供的路径应该是到组件顶级的全限定点路径

      • 例如: my_app.components.blog

    • 在组件的顶级,__component__必须定义为KegComponent的实例

      • 根据组件的需求,模型和视图发现可能由具有路径默认值的KegComponent子类驱动

      • 示例

        • __component__ = KegModelComponent('blog')

        • __component__ = KegViewComponent('blog')

        • __component__ = KegModelViewComponent('blog')

  • 组件发现

    • 组件将在应用初始化时尝试加载模型和蓝图

    • 可以在组件的定义上修改或扩展相对于组件的默认路径

    • “model”组件中的默认模型路径: .model.entities

      • 通过组件的db_visit_modules列表中的相对导入路径覆盖

    • “view”组件的默认蓝图路径: .views.component_bp

      • 使用组件的__component__上的create_named_blueprintcreate_blueprint辅助函数来创建具有配置模板文件夹的蓝图

      • 通过组件的load_blueprints列表覆盖

        • 列表元素是一个元组,包含相对导入路径和蓝图属性的名称

      • 组件有自己的模板存储,在 templates 文件夹中

        • 通过 template_folder 属性覆盖组件的模板路径

    • 也可以向构造函数提供路径

      • 例如:__component__ = KegComponent('blog', db_visit_modules=('.somewhere.else', ))

KeG 开发

要在 keg 上进行开发,首先安装依赖项并运行测试

git clone https://github.com/level12/keg keg-src
cd keg-src

docker-compose up -d

# Create a virtualenv with a supported python version.  Activate it.
vex -m keg

# Install editable keg and test dependencies
pip install -e .[tests]

# Run tests
pytest keg

然后您可以检查 tox.ini,以了解我们的开发过程。特别是,我们

  • 使用 pytest 进行测试(以及覆盖率分析)

  • 使用 flake8 进行代码风格检查

预览 Readme

在更新 Readme 时,使用 restview --long-description 预览更改。

当前状态

  • 在相对较少的生产环境中稳定

  • API 可能会改变,较小的兼容性中断比较大的中断发生得更频繁。

变更日志

0.11.0 版本发布于 2023-03-03

  • 重大更改

    • 测试套件设置不再将应用上下文作为部分推送(046ce40

  • 修复 CI 的文档构建,由于 babel 现在不包括它,需要显式包含 pytz 依赖(5215f63

  • 支持 SQLAlchemy 2.0(《3dc3c3f》)

0.10.2 版本发布于 2022-12-07

  • 修复 assets 解析中的请求上下文需求(1d6b60f

0.10.1 版本发布于 2022-11-03

  • 修复 CLI 测试上下文使用中的中断(b035e7c

0.10.0 版本发布于 2022-11-01

  • 重大更改

    • 如果至少有一个规则存在,则不再添加默认路由(15b003e

    • 移除具有 ping 和异常测试路由的默认蓝图(b09d55e

    • 移除 six 依赖和 python 2 支持(《f2339df》)

  • 弃用

    • 默认使用 dash 命名模板,并警告 underscore 命名模板(《32e426a》)

  • 支持 Flask 2.2 和 Flask-SQLAlchemy 3.0(《edde099》)

  • 允许绑定特定方言选项(《a528fe2》)

  • 确保在运行命令时加载插件命令(《a2e0c0a”)

  • 在 Readme 中添加开发说明,说明如何处理国际化文件(《98a792a”)

  • 删除与 morphi 相关的警告过滤器(《d45a44e”)

  • 阐明用于异常测试的模板(《f720a76”)

  • 使用提示保护破坏性 CLI 命令(《0a071d1”)

  • 修复文档格式,并阐明 db_before_import 信号的使用(《4337461”)

  • 解决 pytest 关于 nose 方法的弃用警告(《e1d1a6e”)

  • 解决 CI 中的 mssql/odbc 测试(《c8e4b47”)

0.9.1 版本发布于 2021-06-09

  • BaseView:公开模板名称计算(《47d95af”)

  • 修复翻译文件(《3e1375e”)

0.9.0 版本发布于 2021-06-07

  • 重大更改:撤销“静默和详细标志以(在/中)增加日志级别”(《a64ff15”)

  • 合并 Flask 2.x 支持 & 相关(《8578b2f”)

0.8.9 版本发布于 2021-05-07

  • 更新 Python 支持指示器,并删除 pathlib 依赖(《fef7088”)

0.8.8 发布于 2021-04-20

  • 限制 sqlalchemy 和 flask-sqlalchemy 的更新,直到我们支持 (ab46a44)

  • 修正数据库测试用例 (abf4919)

0.8.7 发布于 2021-02-26

  • 废弃 KEG_DB_ENGINE_OPTIONS 配置,转而使用 Flask-SQLAlchemy 的 SQLALCHEMY_ENGINE_OPTIONS (6e1038d)

  • 从 app 中移除 make_shell_context,因为 Flask 应用自 0.11 版本以来已经有了这个方法 (75e4541)

  • 更新数据库初始化,从方言选项创建所需的模式。废弃 prep_empty (8def18a)

  • 允许 quiet 和 verbose CLI 选项影响日志级别 (ac5fad6)

  • 添加 inrequest 装饰器和上下文管理器,用于在不完整堆栈的情况下测试视图 (041a0cf)

  • 在 readme 中链接文档 (e12044b)

  • 允许通过 pre_response 生命周期方法替换类视图响应 (741c60e)

  • 支持 python-dotenv 使用 (1100b39)

0.8.6 发布于 2021-01-27

  • BaseView.assign_blueprint 允许在类声明之后添加蓝图 (6f454fc)

  • 允许将空字符串作为响应返回 (96f3e04)

  • 在加载数据库实体之前提供 signal hook db_before_import (948ba82)

  • 添加强制 SQLite 外键的设置 (a7450ba)

  • 允许为组件指定蓝图类 (78ac281)

  • 添加 testing.app_config 上下文管理器,用于在启动时注入配置 (4b97985)

  • 解决配置解析中的失败,并在 CLI 中提供更好的报告 (e9537df)

0.8.5 发布于 2020-11-25

  • 遵循 flask 命名空间建议为组件蓝图模板 (b5d6cf8)

0.8.4 发布于 2020-05-12

  • 移除未使用的 oauth 代码(使用 keg-auth 代替)(8e6a2c0)

  • 在 CI 中检查翻译 (b377eee)

  • 修复测试套件问题 (06320e9)

  • 添加 sphinx 文档 (69e5c31)

  • 移除 keyring 支持 (500994d)

0.8.3 发布于 2019-11-29

  • 移除 Flask 版本锁定 (0b03f12)

0.8.2 发布于 2019-11-12

  • 修复计算不带前缀的蓝图 URL 时的错误 (7d02b01)

0.8.1 发布于 2019-11-06

  • 将应用程序组织的基本组件结构添加到逻辑块中 (830f93b)

  • 添加 --help-all 选项,以打印应用程序命令的嵌套树 (b11fe7e)

  • 清理视图对蓝图属性的用法,以发现模板和计算 URL/端点 (949c578)

  • 限制 Flask 到 <1.1.0,直到解决上下文破坏问题 (217246f)

0.8.0 发布于 2019-03-25

  • 重大变更:移除 web.BaseView 对 xhr() 方法的了解,并移除对已废弃的 flask.request.is_xhr 的依赖 (0899c5d)

  • 改进 CI (3311389)

  • 更新以支持 Flask 1.0+ (63e3667)

  • 删除 Pipenv,包括更新的 readme & tox (03b3920)

0.7.0 版本发布于 2019-02-07

  • 启用从 KEG 变量设置引擎选项 (5bb807f)

0.6.6 版本发布于 2018-11-13

  • 添加使用 morphi 的可选 i18n 支持 (d75a8fb)

  • 更新 pipenv 依赖关系以消除警告 (b3b089e)

  • 传递 CLI 调用参数,并在 CLI 测试中允许 STDIN (bac2e3b)

0.6.5 版本发布于 2018-05-28

  • 更新 readme,开始使用 pipenv,固定 Flask < 1.0 (abdc9bf)

0.6.4 版本发布于 2018-01-09

  • 测试时默认不记录到 syslog (304a0a7)

0.6.3 版本发布于 2018-01-09

0.6.2 版本发布于 2017-12-19

  • db: 删除替换 session 对象的代码 (149b42c)

0.6.1 版本发布于 2017-11-16

  • 修复静默日志 (e46fd2b)

  • 更新 readme,一些小的更新/修复 (2044439)

0.6.0 版本发布于 2017-08-18

  • 新增:使 CLIBase 作为最后的手段在 current_app 上运行 (1b358c1)

  • 新增:在脚本选项中添加 –quiet 选项 (6eb723f)

  • 重大变更:调整 KegApp 上的 CLI API (af45880)

0.5.1 版本发布于 2017-08-15

  • 新增:缓解 Flask-WTF 中的 CSRF 漏洞 (42a2e70)

  • 新增:配置、初始化和路由增强 (cdfa901)

  • 维护:升级到 CircleCI 2.0 (60e3bfa)

0.5.0 版本发布于 2017-06-27

  • 准备使用 pyp (23424b9)

  • 合并分支 ‘logging-improvements’ (PR66)

0.4.1 - 2017-02-09

  • BUG:在创建时正确引用 pgsql 标识符 (86852ad)

0.4.0 - 2016-12-19

  • BUG:正确更新 Keyring 配置数据 (7f1908f)

  • 支持 MSSQL 方言 (df7e89d)

  • 维护:重构 keyring 以接受字节 (15bc04b)

  • 维护:删除已弃用的 flask 钩子 (4f7e2bf)

  • 删除 unicode_literal futures (dc2fa85)

  • 维护:创建 Windows 构建环境 (983e040)

  • 维护:使用 Docker 运行 CI (bc7a877)

  • 从 readme 中删除多余的 cp (7e94815)

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源分布

Keg-0.11.0.tar.gz (71.1 kB 查看散列值)

上传时间

构建分布

Keg-0.11.0-py2.py3-none-any.whl (71.2 kB 查看散列值)

上传时间 Python 2 Python 3

由以下支持