宅吉便


Mezzanine + Heroku: 20分鐘打造你的個人部落格

Django Heroku Mezzanine python

Mezzanine是一個Django-­based的內容管理系統(CMS)
讓我們能夠快速建立一個高度客製化的個人­部落格
並利用 Heroku 的 Git CI快速對外發布

這是我在 Taipei.py 二月聚會 分享的主題
可以參考以下連結:
Slides
Demo: http://taipei-py.herokuapp.com
Github: https://github.com/amigcamel/taipei.py

本篇主題如下:

安裝
套用模板
Heroku 設置
靜態檔案設置
加入允許網域
建立 Heroku app
發佈


安裝

建立虛擬環境

pyenv virtualenv 3.5.2 taipei_py

啟動虛擬環境

pyenv activate taipei_py

安裝相關套件 (這裡以 Django 1.8 為例)

pip install Django==1.8.17 Mezzanine==4.4.2

建立新專案 (以 taipei_py 為例)

mezzanine-project taipei_py

套用模板

Github上有一些不錯且免費的Mezzanine模板
mezzanine-themes 提供四種免費的模板
這邊使用 nova 這個模板當作範例
(當然,這個步驟是可以跳過的)

下載模板 (下載到隨便一個地方皆可,這邊以 /tmp 為例)

git clone https://github.com/thecodinghouse/mezzanine-themes /tmp

將 nova 下的 statictemplates 直接 copy 到 taipei_py 專案下

cp -r /tmp/mezzanine-themes/nova/static taipei_py
cp -r /tmp/mezzanine-themes/nova/templates taipei_py

Heroku 設置

Heroku CI (Continuous Integration, 持續整合) 讓部署變得更簡單
taipei.py 目錄下建立三個必備檔案

Procfile

web: gunicorn your_project.wsgi --log-file -

Procfile是用來告訴Heroku你要怎麼樣將你的專案run起來

runtime.txt

python-3.5.2

這個檔案是用來宣告Python的版本

requirements.txt

Django==1.8.17
Mezzanine==4.2.2
gunicorn==19.6.0
dj-database-url==0.4.2
psycopg2==2.6.2
whitenoise==3.2.3

宣告所需要透過 PIP 安裝的套件


檔案結構

經過以上的設置
目前的檔案結構應該長得像下面這樣:

▼ taipei_py
    ▼ taipei_py
        __init__.py
        settings.py
        local_settings.py
        urls.py
        wsgi.py
    ▶ static
    ▶ templates
    Procfile
    requirements.txt
    runtime.txt

靜態檔案設置

在生產環境中
Django並不提供靜態檔案 (static files) 的管理
也就是當 DEBUG=False
我們必須透過其他方式處理
Heroku 官方推薦 使用 whitenoise 這個 Python 套件來管理

設置如下

settings.py

MIDDLEWARE_CLASSES 以下加入這行

MIDDLEWARE_CLASSES = (
    ...
    'whitenoise.middleware.WhiteNoiseMiddleware',
    ...
)

以及加入這行

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'

接著是針對 wsgi 的配置 在 taipei.py/wsgi.py 底部增加以下兩行

from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(application)

注意: whitenoise 的import 一定要放在最後
不然會出現類似以下的錯誤訊息

ImproperlyConfigured: Requested setting CACHES, but settings are not configured.

詳情請見 StackOverflow上的討論


加入允許網域

最後,當然不要忘了在 settings.py 加入允許的網域

ALLOWED_HOSTS = [
    ...
    'taipei-py.herokuapp.com',
]

建立 Heroku app

首先需要安裝 Heroku CLI

OS X Homebrew:

brew install heroku

Debian/Ubuntu:

sudo apt-get install software-properties-common
sudo add-apt-repository "deb https://cli-assets.heroku.com/branches/stable/apt ./"
curl -L https://cli-assets.heroku.com/apt/release.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install heroku

其他平台或安裝方式可參考官方說明

接下來是驗證您的 Heroku 帳號

heroku login

建立一個新的 app

heroku create taipei-py

將現有專案加入 git

git init
git add -A .
git commit -m 'first commit'

將 Heroku 加入 git remote

heroku git:remote -a taipei-py

發佈

將檔案上傳

git push heroku master

最後,啟動您的app

heroku ps:scale web=1 --app taipei-py

大功告成!

然後就可以打開瀏覽器
拜訪 https://taipei-py.herokuapp.com

看看是否一切順利
如果出現非預期的錯誤畫面
請善用以下指令

heroku logs -t --app taipei-py

這個指令的作用相當於

tail -f *.log

就是把log以串流的方式print出來
方便即時debug