惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Apple Machine Learning Research
Apple Machine Learning Research
Last Week in AI
Last Week in AI
Blog — PlanetScale
Blog — PlanetScale
V
Visual Studio Blog
月光博客
月光博客
博客园 - 三生石上(FineUI控件)
博客园 - Franky
IT之家
IT之家
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
腾讯CDC
博客园 - 聂微东
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
人人都是产品经理
人人都是产品经理
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
博客园_首页
G
Google Developers Blog

碎言

不懂就别瞎掰掰:【程序员的常识】写的什么玩意? AI 辅助编程下的程序设计与代码编写 使用 Next.js 和 Tailwind CSS 构建可编辑和删除的 ToDo 待办事项应用 探索编程新境界:MarsCode 助你一臂之力 使用 Next.js 和 Tailwind CSS 搭建静态图片展示站点并部署到 Vercel AI 辅助编程:免费工具的优缺点及官网一览 GitHub push更新总是失败,写个python脚本解决 把博客从GitHub迁移到到了vercel ComfyUI 和 Flux.1 安装与使用教程 Flux.1 入门必知:硬件、环境、模型 Git项目的子文件夹中的内容无法同步到远程仓库的解决方法 blender流体Fluid使用中没有流体、流体穿模等一些问题的解决方法 博客聚合网站:积薪,竟然关闭了! blender日常使用中的一些技巧 虽然只有我自己在用,但还是更新了碎言博客的源代码, 与其在迷茫中困惑,不如在努力中前进 差点忘了我还有一个博客... 秧歌、博客和AI 终于熬到了新手上路 好久没有更新博客了。。。 老妈大腿骨骨折,最近一直在医院护理 Hello, September! Ubuntu开机自动启动Docker容器运行WordPress Docker 简单快速安装部署WordPress Docker下安装MySQL 加碘盐能防核辐射的话,还怕什么核战争? shields.io 一个简洁、一致、清晰的徽章 Ubuntu下使用root登录ssh的设置 GitHub Actions 构建、部署 Next.js项目 我又用回了"IE"--edge
使用Python编写并部署个人静态博客:(四)逐步输出静态页面
J.sky · 2023-06-09 · via 碎言

使用Python编写并部署个人静态博客:(一)分析与设计

使用Python编写并部署个人静态博客:(二)实现静态页面的输出

使用Python编写并部署个人静态博客:(三)搜集博客数据

使用Python编写并部署个人静态博客:(四)逐步输出静态页面

使用Python编写并部署个人静态博客:(五)Python异步输出博文页面

啰嗦几句

使用Python编写并部署个人静态博客这个系列写第一篇的时候这是信心满满,以为会有很多同道中人,但是发现独立博客都挺少了,自己编写并部署博客的更是少的可怜。这就好比用电饭锅做饭,难道还要自己研究怎么做电饭锅?直接使用WordPress或一些静态站点生成器不好吗?嗯,挺好的,但是我还是选择自己编写并部署自己的博客。啰嗦完毕,继续讨论技术。

确定博客的相关页面

首先要确定博客的相关页面,例如:首页、标签页、归档、友联等页面,确定页面的结构也就是页面上该有的元素,可以用笔在纸上画画草图,大概有个框架,然后在逐一筛选和确定,对于自己编写代码,在功能上应劲量简约实用,要考虑到静态页面的输出需要哪些方法来实现,边构思边设计,切忌盲目好大喜功或是追求极致和完美,如果这样的话,估计没等你开始编写就会失去动力了,力求极简,实现主要功能为主,并为后续留下优化和补充的路子。

编写相关页面的输出方法

当你确定好所需的页面和功能后,就可以开始编写输出静态页面的方法了,生成器主要负责页面的数据整理,然后发送给jinja2模板引擎负责渲染,前端配合一些CSS、avaScript库或框架来进行页面的布局和美化,不要在生成器那里输出任何页面相关的HTML代码,不然后期修改会很麻烦,只有分清工作程序,之后出现问题才会知道去哪里解决。

具体实现

这里以实现归档页面的生成为例,首先组织页面的数据,归档页面的数据无非就是一个数组,这个数组包含了按着年月份分组的数据,每一个数组里包含着当月的博客文章数据,以时间为归类,分别展示当月份的博文,这里只是把数据整理出发送给jinja2模板,模板才负责组织HTML。

下边是完整代码:

def create_archives_html():
    """生成archives.html"""
    blog_data = load_blogdata_json(BLOGDATAJSON)
    config = load_configjson(CONFIGJSON)
    # 设置jinja模板
    env = Environment(loader=FileSystemLoader(os.path.join(THEME, config["theme"])))
    context = create_context()
    tmp = env.get_template("archives.html")  # 模板
    archives_html_path = os.path.join(BLOGPAGES, 'archives.html')  # 首页HTML
    # 组装archives页面的上下文数据。
    data = formatdata(blog_data)
    for k in data:
        k["num"] = len(k["data"])
    context["pages_num"] = len(blog_data)
    context["update"] = blog_data[0]["time"]
    context["archives"] = data
    context["title"] = "Archives"
    with open(archives_html_path, mode='w', encoding='utf-8') as f:
        f.write(tmp.render(**context))
    logger.info('生成archives.html成功!')

首先获得所有的博文数据,然后获取jinja2模板和博客的上下文,data = formatdata(blog_data)这里是根据所有博客的数据进行了一个时间排序和分组返回了一个归档数据。最后组织其他相关的上下文,结合模板输出到静态页面。

总结

大体上每个单独的页面都是这样生成的,而有些页面则是需要批量生成,这个留到下节再说吧,这里涉及到了Python的多线程和异步编程,之后好好聊聊。