CoreServerでMezzanineを立ち上げるまで

スポンサーリンク

Mezzanineインストールの流れ

WordPressでブログを立ち上げて以来、ブログとしての使い勝手は申し分ないけれど、カスタマイズをしようとすると敷居が高いことがわかった。いまさらPHPを勉強する気にもなれない。

私がWordPressをこれ以上使うのを諦めた理由

そもそも私がやりたかったのは、ブラウザ上でサクッと動く業務アプリを作ること。CMSではなくフレームワークを勉強したかった。そこでPythonのフレームワークDjangoと相性がよい(というか、Djangoそのもの)、Mezzanineを使ってみることに決めた。

見よ!これが Python製の WordPress風フルスタックCMSフレームワーク「Mezzanine(メザニン)」だ!

レンタルサーバーでPythonのCGIを動かすのはすでに出来ているけれど、あらためて先輩諸氏の記事を参考にしながらDjangoの環境を作って、さらにMezzanineを立ち上げた。基本的にこのあたりの記事を参考にすれば良い。

CORESERVERで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がタプルで定義されているが、これをいったんリストで定義しなおす。

#MIDDLEWARE = (
MIDDLEWARE_list = [
    (中略)
]
#)

少し後にローカル環境の時だけの処理があるので、そのelse(つまり本番環境の場合だけ)でwhitenoiseを導入するようにした。次の行でMIDDLEWAREはタプルに戻して辻褄を合わせる。

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に追加。

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):

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のままで使うことにした。

公開

最終的にできたのがこれ。

Mezzanineのデモページ

コメント

タイトルとURLをコピーしました