Mezzanineインストールの流れ
WordPressでブログを立ち上げて以来、ブログとしての使い勝手は申し分ないけれど、カスタマイズをしようとすると敷居が高いことがわかった。いまさらPHPを勉強する気にもなれない。
そもそも私がやりたかったのは、ブラウザ上でサクッと動く業務アプリを作ること。CMSではなくフレームワークを勉強したかった。そこでPythonのフレームワークDjangoと相性がよい(というか、Djangoそのもの)、Mezzanineを使ってみることに決めた。
見よ!これが Python製の WordPress風フルスタックCMSフレームワーク「Mezzanine(メザニン)」だ!
レンタルサーバーでPythonのCGIを動かすのはすでに出来ているけれど、あらためて先輩諸氏の記事を参考にしながらDjangoの環境を作って、さらにMezzanineを立ち上げた。基本的にこのあたりの記事を参考にすれば良い。
作業前に環境の確認が必要。Pythonは3.7が現在の最新、Djangoは2.x系がすでに存在するが、Mezzaninをインストールする前提だとこれらは使用できない。MezzaninはDjango 1.x系にしか対応しておらず、Django 1.xはPython 3.6までしか対応してない。私はこれに気付かず、インストールをやり直した、最終的にはこうなった。
- Python 3.6.0
- Django 1.11.18
- Mezzanine 4.3.1
新しいDjango 2.x系がすでに入っている場合は、一旦アンインストールして、Mezanineをpipでインストールすると、対応しているDjangoの最新版(それが1.11.18)が勝手にインストールされる。
また、後の方で説明するがMezzanine本体に手を入れる必要があるので、pyenv等で専用環境を作っておくことをお勧めする。
ローカル環境と本番環境
ローカル環境と本番環境を切り分ける方法は、
- local_settings.pyが在る → ローカル環境
- local_settings.pyが無い → 本番環境
として、whitenoiseを使うかどうか、DEBUG変数の値などが連動するようにしたかったので、少し工夫した。
まず、local_settings.pyに書いてあるSECRET_KEY、NEVERCACHE_KEY、ALLOWED_HOSTSはsettings.pyに移動。
settings.pyの中で、MIDDLEWAREがタプルで定義されているが、これをいったんリストで定義しなおす。
1 2 3 4 5 |
#MIDDLEWARE = ( MIDDLEWARE_list = [ (中略) ] #) |
少し後にローカル環境の時だけの処理があるので、そのelse(つまり本番環境の場合だけ)でwhitenoiseを導入するようにした。次の行でMIDDLEWAREはタプルに戻して辻褄を合わせる。
1 2 3 4 5 6 7 8 |
f = os.path.join(PROJECT_APP_PATH, "local_settings.py") if os.path.exists(f): (中略) else: MIDDLEWARE_list.insert(0, 'whitenoise.middleware.WhiteNoiseMiddleware') STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' MIDDLEWARE = tuple(MIDDLEWARE_list) |
DEBUG変数はlocal_settings.pyの中で DEBUG=True としている。
settings.py
settings.pyの基本設定を行う。
- ALLOWED_HOSTS = [“localhost”, “127.0.0.1”, “::1”, “ドメイン名”, ]
- TIME_ZONE = ‘Asia/Tokyo’
- USE_TZ = False
- LANGUAGE_CODE = “ja”
- LANGUAGES = (
(‘ja’, _(‘Japanese’)),
(‘en’, _(‘English’)),
) - USE_I18N = True
デフォルトページの設定
urls.pyでこの行をコメント化する。
- url(“^$”, direct_to_template, {“template”: “index.html”}, name=”home”), → 行頭に#を追加
次の2行のコメントを外す。
- # from mezzanine.blog import views as blog_views → #を消す
- # url(“^$”, blog_views.blog_post_list, name=”home”), → #を消す
これでブログが初期画面になる。
Slugの設定
ここでは、ブログ投稿ページの個々のURLの決めかたをSlugと呼んでいる。デフォルトでは投稿のタイトルを含む形になっているが、日本語タイトルを使うと動作しなかった。
- 例) https://ドメイン名/ja/blog/たいとる/ → 動作しない
他のMezzanineサイトでは日本語タイトルでも動作しているようなので、この問題はレンタルサーバー(CoreServer)でCGIを使っていることの副作用ではないかと推測する。このままではマズイのでMezzanine公式を参照して、次の2行をsettings.pyに追加。
1 2 |
BLOG_URLS_DATE_FORMAT = 'month' SLUGIFY = 'django.template.defaultfilters.slugify' |
これによって投稿ページの参照URLはこのようになる。
- https://ドメイン名/blog/2019/03/(タイトルから日本語を削除した文字列)/
URLの最後の部分はタイトルからunicodeを読み飛ばした文字列になるので、タイトルが日本語だけの場合は空文字列になって404エラーが発生した。
- https://ドメイン名/blog/2019/03//
しょうがないのでMezzanine本体に手を入れることにした。pyenvで環境を切り分けてあったので、動作しているMezzanine本体のフォルダーを探し出して、/mezzanine/utilsの urls.py に2行追加した。
“def unique_slug(queryset, slug_field, slug):
1 2 3 4 5 6 7 8 9 10 11 12 |
def unique_slug(queryset, slug_field, slug): """ Ensures a slug is unique for the given queryset, appending an integer to its end until the slug is unique. """ ########################################## # Below 2 lines added to avoid empty slug when all post title is unicode characters. ########################################## if re.match('\s*', slug): slug = 'post' (後略) |
タイトルが日本語の場合には参照URLがこのようになる。投稿ごとに最後の番号が増えていく。
- https://ドメイン名/blog/2019/03/post-1/
Mezzanine本体を改変せずにunique_slug()という関数だけをローカル関数で置換する方法を調べたがわからなかったので、これで良しとした。
データベース
データベースに関してはMySQLを使おうとした。DjangoのチュートリアルでMySQLを動作させた実績もあったが、今回は’KeyError’が発生してうまくいかなかった。Mezzanine導入のため各種ライブラリを旧バージョンにしているせいかと推測した。どうせ個人のブログなので対して大きくはならない。デフォルトのSQLiteのままで使うことにした。
公開
最終的にできたのがこれ。
コメント