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

作者:J.sky · 发表于:
2023-06-09T08:18:42.000000Z
· 更新于:
2023-08-13T22:54:57.617618Z
· Tag: 碎言博客

使用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的多线程和异步编程,之后好好聊聊。