pelican
Pelican Static Site Generator, Powered by Python:Pelican是python語言寫的靜態網站生成器。因為我一直打算用github pages做一個博客,現在已經學會用Hexo在github pages上做博客了。但是我一想:我一個pythoner,干嘛不用python寫的靜態網站生成器。我想應該是網上教程太少,那我今天就來搞一搞。順便記錄下來,整理出一個教程,希望一切順利!
最終效果:blog.xueweihan.com
開始
1.首先用virtualenv創建一個env
mkdir blog
cd blog
virtualenv env
source env/bin/activate #激活環境
2.使用pip安裝pelican和markdown
pip install pelican
pip install markdown
3.創建pelican目錄結構
pelican-quickstart
# 根據提示進行設置
> Where do you want to create your new web site? [.]
> What will be the title of this web site? 削微寒
> Who will be the author of this web site? xueweihan
> What will be the default language of this web site? [en] zh
> 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) blog.xueweihan.com
> Do you want to enable article pagination? (Y/n)
> How many articles per page do you want? [10]
> What is your time zone? [Europe/Paris] Asia/Shanghai
> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n)
> 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) n
> 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)
Done. Your new project is available at /Users/xueweihan/Documents/blog
文件結構如下:
blog/
├── content # 寫的文章放這里
├── output # 生成的輸出文件(發布的內容)
├── develop_server.sh
├── Makefile # 方便管理博客的Makefile
├── pelicanconf.py # 主配置文件
└── publishconf.py
我們下面只用到我解釋的這幾個目錄和文件,大致有個印象即可
4.編寫文章測試下效果
Date: 2016-02-28
Title: 測試
Tags: 測試
Slug: test
# pelican
Pelican Static Site Generator, Powered by Python:Pelican是python語言寫的靜態網站生成器。因為我一直打算用git pages做一個博客,現在已經學會用Hexo在git pages上做博客了。但是我還是一想:我一個pythoner,干嘛不用python寫的靜態網站生成器。應該是網上教程太少,那我今天就來搞一搞。順便記錄下來,整理出一個教程,希望一切順利!
在content目錄下創建一個名為:test.md的markdown文件,把上面的那些內容放進去,用來測試效果。
5.本地查看效果
# 在blog目錄下執行
pelican content # 根據content中的內容,生成靜態網站到output目下
# 在output目錄下執行
python -m pelican.server
以上兩個命令執行完,沒有報錯的話就用瀏覽器打開:127.0.0.1:8000,效果如下:

輸入:ctrl + c 停止服務
5.上傳到github pages 現在就差最后一步,上傳到github pages上面。 一步步的來:
首先在github上創建一個項目,Repository name填寫:你的github用戶名.github.io 如下圖:

然后在output目錄依次輸入:
git init
git add .
git commit -m "pelican static blog test"
git remote add origin git@github.com:你的github用戶名/你的github用戶名.github.io.git
# 例如我的就是:git@github.com:521xueweihan/521xueweihan.github.io.git
git push -u origin master
最后訪問:http://你的github用戶名.github.io/ 例如我的就是:http://521xueweihan.github.io/
頁面如下圖: 
簡化發布流程
還記得Makefile文件嗎?我們通過修改這個文件,實現1條指令發布博客到github pages上。
把blog目錄下的Makefile文件中的內容替換成下面的內容(原Makefile文件的內容都不要)
PY?=python
PELICAN?=pelican
PELICANOPTS=
BASEDIR=$(CURDIR)
INPUTDIR=$(BASEDIR)/content
OUTPUTDIR=$(BASEDIR)/output
CONFFILE=$(BASEDIR)/pelicanconf.py
PUBLISHCONF=$(BASEDIR)/publishconf.py
DEBUG ?= 0
ifeq ($(DEBUG), 1)
PELICANOPTS += -D
endif
RELATIVE ?= 0
ifeq ($(RELATIVE), 1)
PELICANOPTS += --relative-urls
endif
html:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
clean:
[ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR)
regenerate:
$(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
serve:
ifdef PORT
cd $(OUTPUTDIR) && $(PY) -m pelican.server $(PORT)
else
cd $(OUTPUTDIR) && $(PY) -m pelican.server
endif
publish:
$(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS)
github: publish
cd $(OUTPUTDIR) ; git add . ; git commit -m '更新博客' ; git push origin master
更新博客流程
- 把寫好的markdown格式的文章放到content中,然后在
blog目錄下 - 本地查看效果的話:
make html然后make serve最后訪問:127.0.0.1:8000 - 發布到github:
make github完成
定制屬於自己的blog
下面的內容算是高級篇了,需要把上面的步驟都完成。想要進一步完美自己的博客的小伙伴
1.獨立域名
首先要購買域名,我的實在阿里雲上買的,買完之后就需要修改你的域名指向:訪問blog.xueweihan.com域名,跳轉到你的.github.io。根據你購買域名時候的提示,就可以設置完成了。之后在output目錄下,創建CNAME文件。內容就是你購買的域名。因為github pages只允許CNAME中的域名映射。
2.定制樣式結構
一步步的來,首先要找到你喜歡的主題pelican主題,下載的時候我推薦Download ZIP會快很多。下載好你的主題,我們就需要在blog目錄下,找到pelicanconf.py文件,它是在生成靜態網站時候的配置文件,定制幾乎所有的東西都需要通過這個。增添內容如下:
THEME = '你的主題所在目錄'
# 例如:THEME = '/Users/root/Documents/blog/tuxlite_tbs'
GITHUB_URL = 'https://github.com/你的github用戶名'
# 效果是右上角有個fork me on Github,點擊進入你的Github主頁
DEFAULT_DATE_FORMAT = '%Y-%m-%d'
# 時間格式
SOCIAL = (('github', 'https://github.com/521xueweihan'),
('博客園', 'http://www.cnblogs.com/xueweihan/'))
# 幾乎所有的博客主題都有一個地方展示你的社交賬號,這些賬號就寫在這里,上面是我的
DISQUS_SITENAME = 'shortname'
# 評論功能,需要在Disqus上申請一個站點,替換shortname
如果有python基礎的,可以直接修改主題目錄下的template中的模版。已達到你想要的目錄結構和內容的呈現。
3.簡單的SEO
在output文件中創建rebots.txt,這個文件是一個協議文件,沒有不會影響什么。但是有的話,有利於搜索引擎的收錄。內容如下,允許所有爬蟲,同時不允許爬取theme目錄下的內容,和所有的圖片。:
User-agent: *
Disallow: /theme/
Disallow: /.gif$
Disallow: /.png$
Disallow: /.jpg$
大多數主題多是外國人寫的,所以他們都支持‘谷歌分析’
GOOGLE_ANALYTICS = '跟蹤ID'
而百度的分析就需要手動的在主題目錄下的template目錄下的base.html中增添百度的分析代碼。
4.sitemap是對於爬蟲友好的一個文件,它告訴爬蟲,網站的更新頻率和優先級等。詳情
增添插件:
git clone git://github.com/getpelican/pelican-plugins.git
修改pelicanconf.py文件:
PLUGIN_PATH = u"pelican-plugins"
PLUGINS = ["sitemap"]
SITEMAP = {
"format": "xml",
"priorities": {
"articles": 0.7,
"indexes": 0.5,
"pages": 0.3,
},
"changefreqs": {
"articles": "monthly",
"indexes": "daily",
"pages": "monthly",
}
}
5.favicon.ico
放在output的根目錄下。
6.訂閱
因為pelican的庫包含了feedgenerator。feedgenerator是用來生成Atom feeds(是包含你博客數據的xml的文件)用於訂閱。所以你只需要在pelicanconf.py加入:
FEED_ALL_RSS = 'feeds/all.rss.xml'
博客就會自動生成訂閱功能了。
7.關於我
這個就像相當於一個自我介紹的頁面,所以就需要在content目錄下創建一個pages目錄,然后把你要展示的內容放到pages目錄下就可以了。
最終效果
我的博客:blog.xueweihan.com
問題
-
當刪除了一篇博文,但是以我上面所說的方式發布的話。那片文章其實還是存在於github pages上的。只不過沒有在模版中生成鏈接罷了。這種類似的情況會導致:換主題css丟失等問題。當然如果你清空
output目錄,然后重新生成網站的話,就沒問題。但是清空的話,會導致一切不因該被刪的文件也都被刪除了,例如:.git和CNAME等文件。所以我就寫了一個del.sh,用於刪除pelican生成的文件,其他哪些通用文件都不刪除。這樣暫時可以解決問題。 -
本來想要在兩台電腦上都可以發布文章,修改完makefile我發現不是剛性需求,同時實現效果不好。最后的解決方案是,把文章寫在另外的一個github的項目中,分布式編輯這個項目。最后寫文章之前,
git pull獲取最新的文章,這樣就可以同步最新的內容進行修改發布了。 -
我遇到的另外一個問題,就是pelican-theme上面大多都是國外的主題,有的主題中的jquery.js是用的google的cdn。在國內訪問的時候會造成找不到jquery.js對體驗和響應時間造成很大的影響。所以,部署完站點后,最好打開瀏覽器的開發者模式,查看一下各個文件的請求耗時。如果有我上述情況,那么你可以嘗試把那個請求耗時過長的靜態文件,下載好,放到該主題目錄下
static中對應的目錄內。 -
這個其實不是問題,算是一個建議。文章的格式中,加入
Slug: test。這個字段的是:用於文章生成url的。不添加這個字段話,默認是拼音的url。但是有時侯拼音是錯誤的,而且對於搜索引擎很不友好。
