1、简介
我一直建议每个开发者都要有写博客记笔记的习惯,一来可以沉淀知识,二来可以帮助别人,我使用过很多博客平台,也用Python开发过博客系统,就这么个东西折腾好几年,直到我用Pelican之前,一直找不到理想的产品。
Pelican 是基于Python实现的开源静态博客系统,所谓静态博客系统就是无需数据库,每一篇文章会事先渲染成HTML静态文件,访问速度非常快。由于选用了响应式网页设计的主题,所以在手机上的浏览效果也相当赞。
2、特征
Perlican是用Python实现的一个静态网站生成器,支持reStructuredText或Markdown。它支持以下功能:
-
博客文章和静态网页。
-
支持评论。评论是通过第三方服务Disqus支持的。即评论数据保存在第三方服务器上。
-
主题支持。
-
把博客文章生成PDF格式文档。
-
多语言博客支持,如可以用英文和中文写同一篇博客。不同语言访问者访问相应语言的博文。
-
支持Atom/RSS订阅。
-
博文中代码高亮支持。
-
博客搬家支持(WordPress, Dotclear, 或RSS feeds)。
-
支持插件,如Twiter, Google Analytics等。
3、为什么选择Pelican
首先排除掉WordPress之类的CMS系统。因为我不想要数据库,我只需要一个轻量级的静态网站生成器。我的博客使用Markdown编写,且保存在GitHub上。我想要的,只是用Markdown写完博客之后,git commit + git push即可直接发布到博客网站上。
-
使用Python实现。由于最近在学习Python,我可以阅读源码并按照我的需求来改造Pelican使之完全符合我的需求。下次学习Ruby,用jekyll再折腾一遍。因为Jekyll是用Ruby实现的。且GitHub Pages的后台就是用Jekyll,到时可直接用GitHub Pages实现个人博客。
-
足够轻量级。总的代码量才1MB多。安装也方便。
-
有一堆现成的主题可以使用。这对我这种非专业前端的开发者来说,省了不少事。
-
文档齐全。
-
开发活动活跃。GitHub上代码提交活跃。上面文章里介绍的很多博客系统基本上都2+年前就停止更新了。
最后两点对使用任何开源工具来说都是很重要的,只有开发活跃,社区资源多,文档齐全,遇到问题的时候才能较快地得到解决。
4、Pelican安装与配置
创建虚拟环境并升级pip
[root@10-60-249-255 ~]# python3 -m venv myenv
[root@10-60-249-255 ~]# source myenv/bin/activate
(myenv) [root@10-60-249-255 ~]# pip install --upgrade pip
创建博客项目
(myenv) [root@10-60-249-255 ~]# mkdir ~/blogs
(myenv) [root@10-60-249-255 ~]# cd ~/blogs
#生成配置文件(后面都可以通过修改配置文件来手动修改这些设置)
(myenv) [root@10-60-249-255 blogs]# pelican-quickstart
Welcome to pelican-quickstart v3.4.0.
This script will help you create a new Pelican-based website.
Please answer the following questions so this script can generate the files
needed by Pelican.
> Where do you want to create your new web site? [.]
> What will be the title of this web site? huqi
> Who will be the author of this web site? huqi
> What will be the default language of this web site? [en]
> Do you want to specify a URL prefix? e.g., http://example.com (Y/n)
> What is your URL prefix? (see above example; no trailing slash) http://w7.lovezyyhq.top
> Do you want to enable article pagination? (Y/n) Y
> How many articles per page do you want? [10]
> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n) Y
> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n)
> Do you want to upload your website using FTP? (y/N) N
> Do you want to upload your website using SSH? (y/N) y
> What is the hostname of your SSH server? [localhost] w7.lovezyyhq.top
> What is the port of your SSH server? [22]
> What is your username on that server? [root] centos
> Where do you want to put your web site on that server? [/var/www] /home/centos/blogs
> Do you want to upload your website using Dropbox? (y/N) N
> Do you want to upload your website using S3? (y/N) N
> Do you want to upload your website using Rackspace Cloud Files? (y/N) N
> Do you want to upload your website using GitHub Pages? (y/N) N
Done. Your new project is available at /home/huqi/lab/blogs
<!–其中第14行的`http://w7.lovezyyhq.top`以及第21行的`w7.lovezyyhq.top`是我的域名,如果你只是在本机试验,可以填localhost。–>
配置pelicanconf.py和publishconf.py
(myenv) [root@10-60-249-255 blogs]# vim pelicanconf.py
AUTHOR = Hu Qi
SITENAME = w7.lovezyyhq.top
SITEURL = http://w7.lovezyyhq.top
DISQUS_SITENAME = huqi
PATH = content
TIMEZONE = Asia/Shanghai
DEFAULT_LANG = zh
# Feed generation is usually not desired when developing
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None
AUTHOR_FEED_ATOM = None
AUTHOR_FEED_RSS = None
# Blogroll
LINKS = ((Pelican, https://getpelican.com/),
(Python.org, https://www.python.org/),
(Jinja2, https://palletsprojects.com/p/jinja/),
(You can modify those links in your config file, #),)
# Social widget
SOCIAL = ((You can add links in your config file, #),
(Another social link, #),)
DEFAULT_PAGINATION = 10
MD_EXTENSIONS = [
"extra",
"toc",
"headerid",
"meta",
"sane_lists",
"smarty",
"wikilinks",
"admonition",
"codehilite(guess_lang=False,pygments_style=emacs,noclasses=True)"]
CNZZ_ANALYTICS = True
MONTH_ARCHIVE_SAVE_AS = posts/{date:%Y}/{date:%m}/index.html
THEME = "themes/foundation-default-colours"
# Uncomment following line if you want document-relative URLs when developing
#RELATIVE_URLS = True
-
第2行:的SITENAME是博客网站的名称,可以是任何字符。
-
第3行:是博客网站的网址,这个字段在本地开发和发布版本是不一样的,本地直接填localhost即可,发布版本里需要填博客网址。
-
第4行:我使用了Disqus作为我的评论系统,Disqus也是YC毕业生。启用Disqus评论系统非常简单,在官网上注册一个Disqus帐户,然后把帐户名填在DISQUS_SITENAME值里即可启用。我的Disqus帐号刚好也是kamidox。
-
第29-38行:这里是配置Markdown扩展,用来支持代码高亮。并且使用Emacs风格的代码高亮。
-
第40行:由于GFW的存在,我把Google Analize换成了国内的CNZZ统计。
-
第42行:我的博客使用了foundation-default-colours这套主题。
5、配置主题
挑选主题
(myenv) [root@10-60-249-255 blogs]# mkdir ~/pelican
(myenv) [root@10-60-249-255 pelican]# cd ~/pelican
(myenv) [root@10-60-249-255 pelican]# git clone https://github.com/getpelican/pelican-themes.git
(myenv) [root@10-60-249-255 pelican]# cp -rp pelican-themes ~/blogs/
(myenv) [root@10-60-249-255 pelican]# cd ~/blogs/
(myenv) [root@10-60-249-255 blogs]# mv pelican-themes themes
在pelicanconf.py
和publishconf.py
里通过下面代码指定博客主题
THEME = "themes/foundation-default-colours"
主题的典型结构
(myenv) [root@10-60-249-255 themes]# tree foundation-default-colours
├── static
│ ├── css
│ └── images
└── templates
├── analytics_cnzz.html // 这个是我添加的使用cnzz的统计服务的代码
├── analytics.html // 这是Google Analytics的代码
├── archives.html // 这个是博客归档页面的模板
├── article.html // 这个是博客正文的显示模板
├── base.html // 这个是所有页面的父类模板,即所有页面都引用这个页面。比如网页导航栏啊之类的,都定义在这里
├── categories.html // 所有博客文章的分类列表
├── category.html // 某个博客分类的文章列表模板
├── index.html // 主页
├── page.html // 分页显示的模板
├── tag.html // 某类标签下的文章列表
└── tags.html // 所有的标签列表页面模板
撰写博客
#在`content`目录下新建一个xxx.md,使用Makedown语法直接撰写文档即可
(myenv) [root@10-60-249-255 content]# vim xxx.md
Title: 使用Pelican搭建博客系统
Date: 2014-10-07 22:20
Modified: 2014-10-07 23:04
Tags: python, pelican
Slug: build-blog-system-by-pelican
Authors: Joey Huang
Summary: 本文介绍了Pelican的特性;选择Pelican的理由以及从头安装配置,搭建出一个可运行的独立博客系统。
Status: draft
-
第5行:Slug是文档的唯一标识,生成html时,会直接使用这个值当html的文件名。所以,不同博客文章这个值需要保证唯一性,否则生成html时会报错。
-
第8行:这个表示本文是草稿。比如我们一篇博客经常不是一次性写完的,写了一半暂不想让读者看到,或者写完想让别人帮忙审查一下,就可以加这一行标识。这样Pelican在处理时,这篇文章也会生成html,但不会放在博客的主页及分类索引里,这样普通的读者一般看不到这个文章。有这个标识的文章生成时放在output/drafts目录下,你就可以通过分享url的方式让你的co-worker帮你review你的文章。
<!–我们可以在content目录下任意建子目录来组织管理博客文章。由于我们在设置文件里指定这个值USE_FOLDER_AS_CATEGORY = True,这样这些目录名称就自动变成博文分类的目录了。–>
6、预览博客文章
#启动预览服务器
(myenv) [root@10-60-249-255 blogs]# make devserver
这条命令会自动使用pelicanconf.py的配置文件来生成html网页,同时在本地的8000端口上启动一个http服务器,供你预览文章。在浏览器里输入http://w7.lovezyyhq.top:8000来实时预览效果。
7、停止预览服务
#在博客项目根目录上运行`make stopserver`来停止这个预览服务以及数据监控功能
(myenv) [root@10-60-249-255 blogs]# make stopserver
8、配置Nginx
安装Nginx
(myenv) [root@10-60-249-255 blogs]# yum install nginx
编辑配置文件
(myenv) [root@10-60-249-255 blogs]# vim /etc/nginx/nginx.conf
server {
listen 80 default_server;
server_name w7.lovezyyhq.top;
root /home/centos/blogs;
location / {
index index.html;
}
}
-
第3行:这个是服务器地址。这里使用本机作为测试服务器就填localhost,如果是配置服务器,就要填服务器的域名。比如我的服务器上,这行是配置成w7.lovezyyhq.top。
-
第4行:这个设置成博客文章的根目录。这个使用本机作为测试服务器,所以直接填博客项目的output目录。如果是在服务器上,我是直接配置成/home/centos/blogs。
重启一下Nginx服务
(myenv) [root@10-60-249-255 blogs]# sudo service nginx resart
欢迎大家扫码关注:
本公众号只写原创,不接广告、不接广告、不接广告。下期小伙伴想学习什么技术,可以私信发我吆。