【免费下载链接】pelicanStatic site generator that supports Markdown and reST syntax. Powered by Python.项目地址https://gitcode.com/gh_mirrors/pe/pelican点击查看免费下载本文以仓库中的真实示例 samples/content/pages/override_tag_oh.rst 与 samples/content/pages/override_url_saveas.rst 为主体讲解如何在静态站点生成器 Pelican 中通过url与save_as元数据将任意页面或文章重定向到自定义 URL 与自定义输出路径同时结合 pelican/contents.py 源码解释其底层原理并给出覆盖标签页、归档页、静态首页等典型场景的完整配置方案。读完本文你将能够自由定制站点的 URL 结构与文件输出位置而不必改动主题或生成器源码。一句话理解url与save_as在 Pelican 中每一篇内容文章、页面、标签页、分类页等最终都会得到一个对外访问的 URL用于模板中生成链接如a href/tag/oh.html得到一个本地输出路径即写入output目录的相对文件路径。默认情况下二者由各类内容对应的*_URL与*_SAVE_AS设置共同推导例如文章的ARTICLE_URL/ARTICLE_SAVE_AS、页面的PAGE_URL/PAGE_SAVE_AS。当默认推导结果不满足需求时Pelican 允许在内容文件的元数据中直接声明url与save_as两个关键字从而针对单篇内容覆盖默认的 URL 与输出路径。在 docs/content.rst 的保留元数据表中对这两个关键字的官方定义为元数据关键字说明save_as将内容保存到该相对文件路径Save content to this relative file pathurl该文章/页面使用的 URLURL to use for this article/pageurl只影响链接生成模板、导航、feed 中的引用save_as只决定文件最终落在output的哪个位置两者需要搭配使用否则会出现链接指向 A、文件却生成在 B的错位。示例一覆盖 tag 归档页 ——override_tag_oh.rst仓库样例 samples/content/pages/override_tag_oh.rst 是一个仅 8 行的完整示例展示了如何覆盖oh标签的归档页面Oh Oh Oh ######## :date: 2010-03-14 :url: tag/oh.html :save_as: tag/oh.html This page overrides the listening of the articles under the *oh* tag.逐行拆解其作用Oh Oh OhreST 标题同时充当页面标题title元数据会显示在导航与页面内容中:date: 2010-03-14页面发布日期确保页面在按日期归档/排序的站点中行为一致:url: tag/oh.html声明该页面的对外 URL 为tag/oh.html:save_as: tag/oh.html声明该页面被生成到output/tag/oh.html正文一句话说明了意图This page overrides the listening of the articles under the oh tag.此页面覆盖了oh标签下文章的聚合展示。覆盖标签页的实际效果该页面放置于samples/content/pages/目录按默认规则本应生成在output/pages/下但通过上述元数据它被强行生成到output/tag/oh.html从而顶替了 Pelican 自动为oh标签生成的归档页位置。构建结果可以在测试基线中直接验证pelican/tests/output/basic/tag/oh.html 第 28 行即为该页面的正文渲染结果pThis page overrides the listening of the articles under the emoh/em tag./p同时 pelican/tests/output/basic/tag/baz.html 展示了baz标签同样被一个内容为 The baz tag 的页面覆盖说明这是测试套件中系统化的覆盖手段。类似地仓库中的 samples/content/pages/override_url_saveas.rst 演示了把普通页面放到自定义位置的写法Override url/save_as #################### :date: 2012-12-07 :url: override/ :save_as: override/index.html Test page which overrides save_as and url so that this page will be generated at a custom location.其渲染结果override/index.html同样存在于测试基线中见 pelican/tests/output/basic/override/index.html导航中显示为Override url/save_as正文为 Test page which overrides save_as and url so that this page will be generated at a custom location.。运行验证在仓库根目录执行测试命令可复现上述输出cd /data/web/disk1/git_repo/gh_mirrors/pe/pelican python -m pytest pelican/tests/test_pelican.py -q构建结果含tag/oh.html与override/index.html会写入 pelican/tests/output/ 下的basic、custom、custom_locale等目录可作为覆盖行为的对照基线。底层原理元数据如何变成override_*属性url与save_as之所以能覆盖默认行为关键在于 pelican/contents.py 中Content.__init__对元数据的特殊处理pelican/contents.py#L76-L83# set metadata as attributes for key, value in local_metadata.items(): if key in (save_as, url): key override_ key setattr(self, key.lower(), value)也就是说当读取到元数据中的url或save_as时Pelican 不会直接把它赋给self.url/self.save_as而是重命名为self.override_url/self.override_save_as。之后所有取 URL 和输出路径的地方都会走统一的入口url属性self.get_url_setting(url)pelican/contents.py#L490-L492save_as属性self.get_url_setting(save_as)pelican/contents.py#L494-L496。而get_url_setting的实现pelican/contents.py#L251-L255会优先返回 override 值否则才回退到*_URL/*_SAVE_AS设置的展开结果def get_url_setting(self, key: str) - str: if hasattr(self, override_ key): return getattr(self, override_ key) key key if self.in_default_lang else flang_{key} return self._expand_settings(key)由此可以确认两个实现事实覆盖是逐项独立的可以只写url不写save_as此时输出路径仍按默认规则推导也可以只写save_as不写url此时链接仍按默认规则推导。但为了一致性官方文档建议两者成对给出覆盖是全局生效的无论内容对象是Article、Page还是标签/分类/作者等聚合页面只要元数据中出现这两个关键字都会走同一套 override 逻辑——这正是示例中页面顶替标签归档页能够成立的原因。安全校验防止save_as逃逸输出目录save_as接受的是相对路径如果值写成../之类可能导致文件被写出到output目录之外。Pelican 在 pelican/contents.py 中专门实现了_has_valid_save_as校验pelican/contents.py#L182-L201def _has_valid_save_as(self) - bool: Return true if save_as doesnt write outside output path, false otherwise. try: output_path self.settings[OUTPUT_PATH] except KeyError: # we cannot check return True try: sanitised_join(output_path, self.save_as) except RuntimeError: # outside output_dir logger.error( Skipping %s: file %r would be written outside output path, self, self.save_as, ) return False return Truesanitised_join在拼接结果越出OUTPUT_PATH时会抛出RuntimeError此时该内容会被跳过并输出错误日志 Skipping ... file ... would be written outside output path。该校验在is_valid()中与必填属性、状态校验一起执行pelican/contents.py#L217-L224。对应的测试用例位于 pelican/tests/test_contents.pytest_valid_save_as_detects_breakout约第 790 行构造越界save_as断言_has_valid_save_as()返回Falsetest_valid_save_as_detects_breakout_to_root约第 798 行覆盖逃逸到根目录的变体test_valid_save_as_passes_valid约第 806 行正常路径应返回True。因此撰写save_as时请始终使用相对路径并确保其落在output目录内例如tag/oh.html、override/index.html否则该内容会被静默跳过。实战场景场景一用自定义页面顶替标签 / 分类 / 作者归档页如需为某个标签编写专门的落地页只需在content/pages/下放置一个 reST 页面并声明对应的tag/*.html路径即可Markdown 语法等价写法为URL:与save_as:两行元数据My Oh Tag Page ############## :url: tag/oh.html :save_as: tag/oh.html 这是 oh 标签的定制页面。同理可覆盖分类页如category/foo.html、作者页如author/name.html从而在不改动生成器逻辑的前提下定制归档聚合页的外观与内容。场景二让静态页面充当网站首页官方 FAQ docs/faq.rst#L146-L176 明确给出了如何用静态页作为首页的标准做法把首页内容放进content/pages/home.md并声明空 URL 与index.html的save_asTitle: Welcome to My Site URL: save_as: index.html Thank you for visiting. Welcome!如果仍想保留原始博客索引可通过设置INDEX_SAVE_AS blog_index.html将默认的index模板改存到别处二者互不冲突。场景三为单篇文章定制短链接或固定路径对个别文章也可在其元数据中直接声明My Article ########## :date: 2024-01-01 :url: posts/hello.html :save_as: posts/hello.html这样该文章会生成在output/posts/hello.html站点内所有指向它的链接导航、feed、标签页都会使用/posts/hello.html无需为单篇文章单独配置ARTICLE_URL/ARTICLE_SAVE_AS全局规则。常见注意事项url与save_as应成对维护只改其一容易产生链接 404 / 文件重复生成的错位问题官方 FAQ 中的示例docs/faq.rst#L149-L159始终同时给出两个值save_as是相对OUTPUT_PATH的路径不要以/开头也不要包含..否则会被_has_valid_save_as拦截见上文源码与测试保留关键字不可作他用url、save_as属于保留元数据关键字见 docs/content.rst#L77-L96不要将它们用于自定义模板字段url与slug相互独立即使不设置slug只要提供了url与save_as站点链接与输出路径就已确定但若模板依赖article.slug等派生属性仍需保证 slug 正常生成默认取自标题或文件名参见 pelican/contents.py#L113-L119覆盖同样适用于非默认语言内容get_url_setting中若内容不属于默认语言且未提供 override 值会回退到lang_{key}对应的设置ARTICLE_LANG_URL等这也是 pelican/tests/output/custom_locale/ 基线中覆盖页仍正常出现的原因。小结通过url与save_as两个元数据关键字Pelican 允许开发者针对任意单篇内容精确控制其对外链接与输出位置从而实现页面顶替标签归档页静态页当首页单篇文章定制短链接等常见需求。其底层由 pelican/contents.py 中override_url/override_save_as属性与get_url_setting()统一分发实现并由_has_valid_save_as()保障输出路径安全。仓库中的 override_tag_oh.rst 与 override_url_saveas.rst 两份示例及其在 pelican/tests/output/ 下的渲染基线是最直观、可复现的参考实现。赞分享【免费下载链接】pelicanStatic site generator that supports Markdown and reST syntax. Powered by Python.项目地址https://gitcode.com/gh_mirrors/pe/pelican点击查看免费下载相关推荐Pelican 页面模板定制指南用 :template: 元数据为单篇文章与页面指定自定义模板Pelican 页面模板定制指南用 :template: 元数据为单篇文章与页面指定自定义模板 本篇指南围绕 Pelican 静态站点生成器中“为单篇内容指定Pelican 文章分类实战从 reST :category: 元数据到分类页面的完整机制解析Pelican 文章分类实战从 reST :category: 元数据到分类页面的完整机制解析 Pelican 是一个基于 Python 的静态站点生成器支Pelican 内容写作完全指南文章、页面、元数据、内部链接与语法高亮Pelican 内容写作完全指南文章、页面、元数据、内部链接与语法高亮 Pelican 是一个基于 Python 的静态站点生成器同时支持 Markdown创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
AI Agent 技能包实战:从零打造可复用的安全审计 Skill 最近在折腾 AI Agent 技能包的时候,我明显感觉到一个趋势:大家不再单纯纠结“怎么让模型更聪明”,而是开始研究“怎么把专业经验沉淀成可以复用的 Skill”。我这边刚把 security-audit-skill 从零到一搭完,前后踩了不少坑。这篇文… · 2026/9/23 5:48:27
学术写作必备:8款AI工具提升论文效率与质量 1. 论文写作工具的价值与选择逻辑去年指导表弟毕业论文时,我亲眼见证了一个有趣现象:当其他同学还在为文献综述发愁时,他用了某款AI写作工具,三天就完成了初稿框架。这让我意识到,现代学术写作已经进入人机协作的新阶段… · 2026/9/23 5:48:27
Apache Pulsar C++ 客户端源码构建全指南:多平台编译、测试与配置详解 Apache Pulsar C 客户端源码构建全指南:多平台编译、测试与配置详解 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar
Apache Pulsar 官方 C 客户端库(… · 2026/9/23 5:48:21
JHU 神经网络基础笔记(二) 群体隐私:如果对单个实体保证了差分隐私,它自然能为群体提供(稍弱的)隐私保护。 后处理不变性:对差分隐私的输出进行任何后处理,都不会影响其差分隐私的保证。 透明度与问责制
我们探讨了公平和隐私的数… · 2026/9/23 7:21:41
ESP-01/ESP-01s烧录避坑指南:从接线到Flash容量全解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 7:21:35
5个步骤搞定短文摘抄性能瓶颈 最佳实践指南 5个步骤搞定短文摘抄性能瓶颈 最佳实践指南 刚接手一个旧项目,核心功能是从海量日志中提取特定关键字的短文。代码是从网上复制来的,看着简单,一跑生产环境直接卡死,CPU 飙到 90% 以上。这种 复制来的代码跑不通不知道怎么调… · 2026/9/23 7:21:34
ERP财务应用师怎么考证?从报名学习到考试拿证,报考全攻略 ERP财务应用师是计算机软件领域与财务管理交叉的重要方向。随着企业信息化管理持续深入,ERP财务应用师在企业管理、财务核算、系统实施等环节的需求保持稳定。如果你正在考虑考取ERP财务应用师证书,本文将从报名学习到考试拿证,做一份完整的报… · 2026/9/23 7:21:34
huanxiang选型避坑指南:3步源码解析帮你搞定项目搭建 huanxiang选型避坑指南:3步源码解析帮你搞定项目搭建 刚把 huanxiang 的语法敲完,是不是觉得挺顺?一上手真实项目,脑子瞬间空白。 看着文档里的示例代码,自己一搭,报错、卡住、逻辑混乱。… · 2026/9/23 7:21:34
C++学习日记 Day3:函数高级(默认参数、占位参数、函数重载) ## 今天学了什么今天学习C函数默认参数、占位参数及函数重载的语法和规则。## 函数的默认参数函数形参列表的形参可以有默认值,语法 返回类型 函数名(参数默认值){}。#include<iostream>
using namespace std;//函数的默认参数
int fu… · 2026/9/23 7:21:34
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29