基于Flask & SQLAlchemy构建的Web框架。位于Flask之上但低于Django。
项目描述
酒桶是一个基于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_url
和calc_endpoint
类方法,这些方法允许开发者避免在代码中硬编码这些类型的值。这两个方法都将生成完整的URL/端点,包括(如果有的话)蓝图前缀。
路由生成
BaseView默认将为各自蓝图上的视图创建规则。通常,这是基于视图类名作为驼峰式到短划线符号的转换。
class MyBestView
位于名为“public”的蓝图:/my-best-view
->public.my-best-view
class View2
位于名为“other”的蓝图,其URL前缀为“foo”:/foo/view2
->other.view2
注意,BaseView是MethodView实现,所以名为get
、post
等的方法将在请求/响应周期中被视为适当的目标。
视图可以给定一个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_blueprint
或create_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
0.10.2 版本发布于 2022-12-07
修复 assets 解析中的请求上下文需求(1d6b60f)
0.10.1 版本发布于 2022-11-03
修复 CLI 测试上下文使用中的中断(b035e7c)
0.10.0 版本发布于 2022-11-01
重大更改
弃用
默认使用 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
0.9.0 版本发布于 2021-06-07
0.8.9 版本发布于 2021-05-07
更新 Python 支持指示器,并删除 pathlib 依赖(《fef7088”)
0.8.8 发布于 2021-04-20
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
0.8.5 发布于 2020-11-25
遵循 flask 命名空间建议为组件蓝图模板 (b5d6cf8)
0.8.4 发布于 2020-05-12
0.8.3 发布于 2019-11-29
移除 Flask 版本锁定 (0b03f12)
0.8.2 发布于 2019-11-12
修复计算不带前缀的蓝图 URL 时的错误 (7d02b01)
0.8.1 发布于 2019-11-06
0.8.0 发布于 2019-03-25
0.7.0 版本发布于 2019-02-07
启用从 KEG 变量设置引擎选项 (5bb807f)
0.6.6 版本发布于 2018-11-13
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
0.6.0 版本发布于 2017-08-18
0.5.1 版本发布于 2017-08-15
0.5.0 版本发布于 2017-06-27
0.4.1 - 2017-02-09
BUG:在创建时正确引用 pgsql 标识符 (86852ad)
0.4.0 - 2016-12-19
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。
源分布
构建分布
Keg-0.11.0.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 29f76cae2c13c009afbcdbbb412bc9406fc8a43d7a989e28eef0ca611f0eef98 |
|
MD5 | 2b0b80d98d0bb7f2b32f2d99fa30d9a1 |
|
BLAKE2b-256 | d22f9be7aa3b2f449d75965e4bea5941d8aeb0f54a89eb6c053affc1e19e7421 |
Keg-0.11.0-py2.py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 41b169b23217ea7bcda3b9adfffc90b10137cc5cd65c123ffc6d0ba25c708e42 |
|
MD5 | 71ad3da9f5a3f3fd0733379890f8ea50 |
|
BLAKE2b-256 | 860b250f153db7cbac13aff28a565c18509e2bf084dee080e131ba628375941d |