如果你问10个互不相干的程序员,问他们最青睐的2种编程语言是啥,我想Python会有极大的概率出现在里面,这充分说明了其在编码圈不可撼动的江湖地位,Python是一门老牌而有非常具有活力的编程语言,发展这么久,讲真不用github都知道,肯定有非常多的web框架了,我们今天的主题是使用Python来搭建一个个人主页,如果使用Python已有的web框架,应该是非常简单的事情。但是本文的目标是自己使用Python实现一个自己的web框架,当然是一个基础版的,在实现之前,我们先了解下主流的web框架是怎么玩的。
Flask是一个轻量级的Python web框架,适合快速构建小型应用,使用起来非常轻便,首先安装pip install flask
。
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是一个高级的Python web框架,适用于更复杂的应用,使用起来也不是什么难事,也是首先安装 pip install django
其代码也flask大差不差,就不贴代码了,感兴趣的朋友去django官网了解一下,因为不是本文的重点,怕写多了宣兵夺主。
💡 那么,上面那两个都是web框架,你可以类比为node生态上的 express 和 koa,那么,我们会问,Python是否有生成静态博客的那种呢?答案肯定是有的。
Markdown
和reStructuredText
格式。WordPress
, Dotclear
等博客平台。Markdown
编写内容。Markdown
, reStructuredText, HTML等格式。通过上面的Python静态网站生成器的介绍,我们可以看到,这些和 hexo等一些非常流行的静态网站生成器非常类似,所以我们思考下:我们可以使用Python自己实现一个类似hexo的吗静态网站生成器吗?
接下来就是我们的主题了,虽然来得有点晚,但是,我们需要清楚我们为什么要这么做,我们是为了学习,而不是为了使用,如果是使用,那这样的选型必然是错误的,如果是学习,自己实现一个不失为一个非常好的选择。好的,我们的需求如下:
hero
,[英雄],我们都是自己的英雄。想一想,实际上这个就是我们需要的一个最最基本的静态网站生成器的功能,虽然他可能不会有非常惊艳的主题,不会有丰富的插件系统,但我要讲的是,他最最核心的灵魂已经具备了,具备了那个神。
有了需求分析,下面,我们就要开干了哦。
1、第一步,创建几个文件和文件夹,目录结构如下
2、这里面最主要的实现其实是converter这个模块,他负责去遍历posts目录下的markdown文件,将其渲染为 html 并保存为文件方到 output下面。他的处理的主要流程图如下:包括文章列表的生成,和 文章标签的生成。
其代码其实并不是很多:
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很简单,如下:
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 ,主要的功能是做一些 命令的解析 ,也非常简单
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静态站点发布工具,样式都是随手写的,也没有认真设计过,基本算完成了一个我们的个人主页了,当然,我们也不难发现,还有下面一些显而易见的体验没有做到,我想留给你来实现也是比较有趣的一件事,请查收,哈哈:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。