前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用python手把手教你搭建一个个人主页

用python手把手教你搭建一个个人主页

原创
作者头像
brzhang
修改2023-11-25 15:12:59
7171
修改2023-11-25 15:12:59
举报
文章被收录于专栏:玩转全栈玩转全栈

如果你问10个互不相干的程序员,问他们最青睐的2种编程语言是啥,我想Python会有极大的概率出现在里面,这充分说明了其在编码圈不可撼动的江湖地位,Python是一门老牌而有非常具有活力的编程语言,发展这么久,讲真不用github都知道,肯定有非常多的web框架了,我们今天的主题是使用Python来搭建一个个人主页,如果使用Python已有的web框架,应该是非常简单的事情。但是本文的目标是自己使用Python实现一个自己的web框架,当然是一个基础版的,在实现之前,我们先了解下主流的web框架是怎么玩的。

Python的一些比较受欢迎的web框架

Flask

Flask是一个轻量级的Python web框架,适合快速构建小型应用,使用起来非常轻便,首先安装pip install flask

代码语言:javascript
复制
from flask import Flask, render_template

app = Flask(name)

@app.route('/')
def home():
    return render_template('index.html')  # 假设你有一个index.html模板

if name == 'main':
    app.run(debug=True)

Django

Django是一个高级的Python web框架,适用于更复杂的应用,使用起来也不是什么难事,也是首先安装 pip install django

其代码也flask大差不差,就不贴代码了,感兴趣的朋友去django官网了解一下,因为不是本文的重点,怕写多了宣兵夺主。

💡 那么,上面那两个都是web框架,你可以类比为node生态上的 express 和 koa,那么,我们会问,Python是否有生成静态博客的那种呢?答案肯定是有的。

Python中的静态网站生成器

  1. Pelican
    • Pelican是一个流行的Python静态网站生成器,特别适用于博客。
    • 特点:
      • 支持MarkdownreStructuredText格式。
      • 可以通过插件和主题进行扩展。
      • 支持导入自WordPress, Dotclear等博客平台。
  2. MkDocs
    • MkDocs专注于创建项目文档,但也可用于创建简单的博客。
    • 特点:
      • 使用Markdown编写内容。
      • 简单易用,适合文档项目。
      • 有多种主题可供选择。
  3. Nikola
    • Nikola是另一个用于创建静态网站和博客的工具。
    • 特点:
      • 支持Markdown, reStructuredText, HTML等格式。
      • 提供丰富的插件和主题。
      • 支持多种语言和内容分类。

通过上面的Python静态网站生成器的介绍,我们可以看到,这些和 hexo等一些非常流行的静态网站生成器非常类似,所以我们思考下:我们可以使用Python自己实现一个类似hexo的吗静态网站生成器吗?

使用Python自己动手实现一个静态网站生成器

接下来就是我们的主题了,虽然来得有点晚,但是,我们需要清楚我们为什么要这么做,我们是为了学习,而不是为了使用,如果是使用,那这样的选型必然是错误的,如果是学习,自己实现一个不失为一个非常好的选择。好的,我们的需求如下:

  • 我们的这个Python实现的静态网站生成器叫做 hero,[英雄],我们都是自己的英雄。
  • 在项目的post目录下使用markdown来写作
  • 使用 hero -s 启动本地server进行预览
  • 使用 hero -d 来打包一个静态网站

想一想,实际上这个就是我们需要的一个最最基本的静态网站生成器的功能,虽然他可能不会有非常惊艳的主题,不会有丰富的插件系统,但我要讲的是,他最最核心的灵魂已经具备了,具备了那个神。

有了需求分析,下面,我们就要开干了哦。

1、第一步,创建几个文件和文件夹,目录结构如下

2、这里面最主要的实现其实是converter这个模块,他负责去遍历posts目录下的markdown文件,将其渲染为 html 并保存为文件方到 output下面。他的处理的主要流程图如下:包括文章列表的生成,和 文章标签的生成。

其代码其实并不是很多:

代码语言:javascript
复制
import os
import markdown
from jinja2 import Environment, FileSystemLoader

posts_dir = 'posts'
templates_dir = 'templates'
output_dir = 'output'

env = Environment(loader=FileSystemLoader(templates_dir))

# 解析Markdown文件并提取元数据

def parse_post(filename):
    with open(os.path.join(posts_dir, filename), 'r', encoding='utf-8') as file:
        lines = file.readlines()

    metadata = {}
    content = []
    in_metadata_section = False

    for line in lines:
        if line.strip() == '---':  # 简单的元数据标记
            in_metadata_section = not in_metadata_section
        elif in_metadata_section:
            key, value = line.strip().split(':', 1)
            metadata[key.strip()] = value.strip()
        else:
            content.append(line)

    metadata['content'] = markdown.markdown(''.join(content))
    return metadata

# 生成文章列表和分类

def generate_site_data():
    posts = []
    post_titles = []  # 用于在模板中生成文章列表
    categories = set()

    for filename in os.listdir(posts_dir):
        if filename.endswith('.md'):
            post_data = parse_post(filename)
            posts.append(post_data)
            # 生成文章标题和URL的简化列表
            post_titles.append({
                'title': post_data['title'],
                'url': post_data['title'].replace(' ', '_') + '.html'
            })
            if 'category' in post_data:
                categories.add(post_data['category'])

    return posts, post_titles, categories

def deploy():
    posts, post_titles, categories = generate_site_data()
    os.makedirs(output_dir, exist_ok=True)
    for post in posts:
        html = env.get_template('post.html').render(
            content=post['content'],
            posts=post_titles,  # 传递文章标题列表
            categories=list(categories)
        )
        output_filename = post['title'].replace(' ', '_') + '.html'
        with open(os.path.join(output_dir, output_filename), 'w', encoding='utf-8') as file:
            file.write(html)

整个文件也就是70行左右,随后就是我们需要启动一个本地的server,来预览效果,其实这个并不是必须的,Python里面启动一个server很简单,如下:

代码语言:javascript
复制
def serve():
    Handler = http.server.SimpleHTTPRequestHandler
    httpd = socketserver.TCPServer(("", 8000), Handler)
    print("serving at port", 8000)
    httpd.serve_forever()

启动后你会看到这样的一个网站,也就是他将项目根目录给暴露出来了。我们执行 hero -d 的产物在 output 目录下,所以,点进去就可以看到我们的个人网站,这里output是可以直接拿到 腾讯云 静态网站 上面去部署的,一点问题都没。

OK,hero.py ,主要的功能是做一些 命令的解析 ,也非常简单

代码语言:javascript
复制
import argparse
import converter
import server

# 设置命令行参数
parser = argparse.ArgumentParser(description='Hero Static Site Generator')
parser.add_argument('-s', '--serve', action='store_true',
                    help='Serve the site locally')
parser.add_argument('-d', '--deploy', action='store_true',
                    help='Deploy the static site')

# 解析命令行参数
args = parser.parse_args()

if args.serve:
    converter.deploy()
    # 启动本地服务器
    server.serve()

if args.deploy:
    # 生成和部署网站
    converter.deploy()

至此,我们已经使用Python从零实现了一个个人主页,整体代码量 150行左右。效果如下:

当然,我们仅仅实现了一个非常简单的Python静态站点发布工具,样式都是随手写的,也没有认真设计过,基本算完成了一个我们的个人主页了,当然,我们也不难发现,还有下面一些显而易见的体验没有做到,我想留给你来实现也是比较有趣的一件事,请查收,哈哈

  • 当我们编辑md文章的时候,保存之后,发现文章没有更新,因为我们没有实现热更新,了解下 watch file,你能实现他吗?
  • 当我们在md编写书数公式的时候,发现html并没有渲染,这里你能找到在哪里修改去支持这个特性吗?
  • 同理,如果在md里面编写mermaid呢?

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python的一些比较受欢迎的web框架
    • Flask
      • Django
      • Python中的静态网站生成器
      • 使用Python自己动手实现一个静态网站生成器
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档