ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Cookiecutter 内置 Jinja2 TimeExtension 实战:用 `{% now %}` 标签为模板注入动态日期

Cookiecutter 内置 Jinja2 TimeExtension 实战:用 `{% now %}` 标签为模板注入动态日期 开发工具CLI代码生成【免费下载链接】cookiecutterA cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects.项目地址https://gitcode.com/gh_mirrors/co/cookiecutter点击查看免费下载本文以 Cookiecutter 仓库中的默认扩展测试夹具tests/test-extensions/default/为核心样本深入剖析内置的TimeExtensionnow标签如何为模板注入动态日期并以项目模板中的HISTORY.rstchangelog文件为例演示其典型用法。读完本文你将掌握now标签的完整语法时区、格式串、时间偏移、Cookiecutter 默认扩展的加载机制以及如何用测试用例验证渲染结果的确定性。样本模板一个带动态日期的 Changelog在仓库的扩展测试夹具目录tests/test-extensions/default/中模板作者放置了一个典型的 Python 包 changelog 文件tests/test-extensions/default/{{cookiecutter.project_slug}}/HISTORY.rst全文如下History ------- 0.1.0 ({% now utc, %Y-%m-%d %}) {{ - * 18 }} First release on PyPI.这个文件展示了两个关键能力动态日期{% now utc, %Y-%m-%d %}在渲染时被替换为模板执行当天的 UTC 日期格式为YYYY-MM-DDJinja2 表达式{{ - * 18 }}利用 Jinja2 的字符串乘法生成一条 18 个连字符组成的分隔线与上方标题中的日期宽度自动对齐避免了手工数连字符的尴尬。该夹具配套的tests/test-extensions/default/cookiecutter.json进一步展示了扩展在上下文中的用法{ project_slug: {{ It\\s slugified Foobar | slugify() }}, year: {% now utc, %Y %} }可见now标签不仅可以用在正文文件里也可以直接出现在cookiecutter.json的默认值中例如给year变量注入当前年份。渲染结果测试锁定的确定性输出动态日期天然依赖系统时钟而 Cookiecutter 的测试通过freezegun冻结时间把渲染结果固化为确定性断言。见 tests/test_default_extensions.pyfreezefixture 将系统时间冻结在2015-12-09 23:33:01test_jinja2_time_extension以no_inputTrue渲染该模板后逐行断言HISTORY.rst的输出expected_lines [ History\n, -------\n, \n, 0.1.0 (2015-12-09)\n, ------------------\n, \n, First release on PyPI.\n, ]可以看到{% now utc, %Y-%m-%d %}被渲染为2015-12-09而{{ - * 18 }}渲染为 18 个连字符。这正是本文主题——动态日期注入——在真实仓库中最直接的落地证据。默认扩展的加载机制now标签并非来自模板自身而是 Cookiecutter 内置扩展。在 cookiecutter/environment.py 的ExtensionLoaderMixin中StrictEnvironment初始化时默认加载以下五个扩展default_extensions [ cookiecutter.extensions.JsonifyExtension, cookiecutter.extensions.RandomStringExtension, cookiecutter.extensions.SlugifyExtension, cookiecutter.extensions.TimeExtension, cookiecutter.extensions.UUIDExtension, ]这些默认扩展无需在模板中额外声明即可使用这与文档 docs/advanced/template_extensions.rst 中列出的默认扩展清单完全一致。若模板还需要第三方自定义扩展则必须在cookiecutter.json中通过_extensions键声明例如{ project_slug: Foobar, year: {% now utc, %Y %}, _extensions: [jinja2_time.TimeExtension] }需要注意Cookiecutter 只负责加载扩展不会自动安装任何第三方依赖同时官方文档明确提示jinja2_time.TimeExtension的功能已被内置的cookiecutter.extensions.TimeExtension覆盖模板作者无需再引入它。此外cookiecutter/environment.py 中的StrictEnvironment使用StrictUndefined模板中任何未定义的变量都会在渲染时报错——这保证了像HISTORY.rst这类文件不会因变量缺失而静默生成残缺内容。now标签语法详解源码与测试双视角TimeExtension的实现位于 cookiecutter/extensions.py。其核心要点如下标签声明tags {now}即模板中直接书写{% now ... %}默认日期格式构造时通过environment.extend(datetime_format%Y-%m-%d)设置默认格式。因此{% now utc %}等价于{% now utc, %Y-%m-%d %}时区必填parse方法要求now后必须跟一个时区表达式否则抛出TemplateSyntaxError见 tests/test_time_extension.py 的test_tz_is_required底层时间库使用arrow.now(timezone)获取当前时间再通过strftime输出。基本形式{% now utc %}输出默认格式的 UTC 日期例如2015-12-09。合法的时区包括utc、local以及任意 IANA 时区如Europe/Berlin相关断言见 tests/test_time_extension.py 中参数化的test_accept_valid_timezonespytest.mark.parametrize(valid_tz, [utc, local, Europe/Berlin]) def test_accept_valid_timezones(environment, valid_tz): template environment.from_string(f{{% now {valid_tz}, %Y-%m %}}) assert template.render() 2015-12自定义格式串{% now utc, %Y-%m-%d %} !-- 2026-09-19 -- {% now utc, %Y-%m %} !-- 2026-09 -- {% now utc, %H:%M:%S %} !-- 时分秒 --格式串遵循 Pythonstrftime语法。第二个参数格式串是可选的也可以在环境层面覆盖默认格式例如在 tests/test_time_extension.py 的test_environment_datetime_format中设置environment.datetime_format %a, %d %b %Y %H:%M:%S后{% now utc %}渲染为Wed, 09 Dec 2015 23:33:01。时间偏移/-now标签还支持在时区后追加或-表达式做时间平移偏移参数以intervalvalue的逗号分隔形式给出支持的区间与arrow.shift()一致hours、minutes、days、seconds等{% now utc hours2,seconds30 %} {% now utc - minutes11 %} {% now utc - days2,minutes33,seconds1, %d %b %Y %H:%M:%S %}偏移与自定义格式可以同时使用。对应的实现逻辑在 cookiecutter/extensions.py 的_datetime方法中先按逗号拆分偏移串、解析每个intervalvalue对再根据操作符/-决定符号并调用arrow.now(timezone).shift(**shift_params)。测试用例test_add_time、test_substract_time、test_offset_with_format分别覆盖了这三种写法例如{% now utc - minutes11 %}在冻结时间2015-12-09 23:33:01下渲染为Wed, 09 Dec 2015 23:22:01。在真实项目模板中落地借鉴上述夹具你可以为自有 Cookiecutter 模板编写同样的 changelog 文件在模板目录中创建{{cookiecutter.project_slug}}/HISTORY.rst内容与 tests/test-extensions/default/{{cookiecutter.project_slug}}/HISTORY.rst 一致或按需扩展例如增加{{ cookiecutter.version }}版本变量在cookiecutter.json中声明必要的变量如version: 0.1.0以及可选的_jinja2_env_vars以调整渲染行为参见 docs/advanced/jinja_env.rst例如{lstrip_blocks: true, trim_blocks: true}运行cookiecutter生成项目由于 TimeExtension 是默认内置扩展无需任何额外安装now标签即可直接生效若要在 CI 中保证 changelog 日期的可预测性可参考测试的做法freezegun冻结时间 逐行断言参见 tests/test_default_extensions.py。其他默认扩展速览围绕HISTORY.rst所在的夹具目录同一套默认扩展体系还包含详见 docs/advanced/template_extensions.rst 与 cookiecutter/extensions.pyJsonifyExtension提供jsonify过滤器将 Python 对象序列化为 JSON可选缩进参数默认 4RandomStringExtension提供random_ascii_string(length, punctuationFalse)全局函数生成随机 ASCII 字符串SlugifyExtension提供slugify过滤器将字符串转为连字符分隔形式支持separator、max_length等python-slugify全部参数夹具中project_slug: {{ It\s slugified Foobar | slugify() }}正是其典型用法UUIDExtension提供uuid4()全局函数生成 UUID4 字符串夹具目录下的id文件内容为{{ uuid4() }}即用于测试该扩展。以上扩展共同构成了 Cookiecutter 模板的“免安装工具箱”而now标签正是其中为 changelog、许可证年份、README 徽章等场景注入动态日期的最常用工具。赞分享开发工具CLI代码生成【免费下载链接】cookiecutterA cross-platform command-line utility that creates projects from cookiecutters (project templates), e.g. Python package projects, C projects.项目地址https://gitcode.com/gh_mirrors/co/cookiecutter点击查看免费下载相关推荐WinBtrfs深度解析3大核心模块实现Windows与Linux文件系统无缝互通WinBtrfs深度解析3大核心模块实现Windows与Linux文件系统无缝互通 在双系统环境中Linux的Btrfs文件系统与Windows之间的兼容性开发工具CLI代码生成Cookiecutter 模板扩展Template Extensions完全指南为 Jinja2 环境注入自定义过滤器、标签与全局函数Cookiecutter 模板扩展Template Extensions完全指南为 Jinja2 环境注入自定义过滤器、标签与全局函数 本文是 Cooki开发工具CLI代码生成深入解析 Cookiecutter 自定义 Jinja2 模板扩展从 hello 标签到钩子渲染全链路实战深入解析 Cookiecutter 自定义 Jinja2 模板扩展从 hello 标签到钩子渲染全链路实战 导读 本文围绕 Cookiecutter 测试夹具开发工具CLI代码生成上一篇终极指南commitlint如何构建可持续的开源商业模式下一篇Redisson 快速上手指南两步接入 Valkey / Redis 的 Java 实时数据平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表