mezzanine -python版CMS- 自社で運用してみたのでデプロイ前までをまとめてみた

## 謎に包まれた pythonのWordPress mezzanine を運用してみて、思ったことを加えながらまとめてみました。

前回、まだまだプログラミング学習中に右も左もわからないまま、Djangoの記事を書いてみたのですが、Pythonの知識も少なからずついてきたので、ひとまず、Djangoはおいおい書いていくとして、まだ日本語での文献が少ないMezzanineについてまとめていきます！

前回の記事
[DjangoのMTVという考え方](https://qiita.com/kotayanagi/items/01e9a617571e2b9526bc)

Mezzanine はざっくりいうとPythonのCMS。WordPressみたいなものです。

あっという間にカスタマイズ可能なブログページやWebサイトが構築できます。

とりあえず、インストールからデプロイ前までまとめてみます。

どこから始めたらいいかわからないというあなた。とりあえず、Virtualenv をインストールして、環境構築をしましょう！


    $ cd Desktop
      mkdir mezzanine
      cd mezzanine
      virtualenv myvenv


とりあえずこれで環境が構築できます。

virtualenv　と書いて、 環境の名前を付け足します。

なぜか、myvenv が使われますが（my virtual environment　の略）
名前は自分がわかればなんでも良いです。

環境はまっさらな、なにもインストールされてない環境なので（Pythonももちろん入っていません。）

mezzanineをインストールします。

その前に、環境に入りましょう。


    $ source myvenv/bin/activate


これで仮想環境に入ることができます。

virtualenv myvenv でmyvenvというフォルダが作られ、そのフォルダの中のbinというフォルダにactivateというファイルがあるんですね。それにより環境に入ることができるというわけです。

環境に入ってから、pip install しましょう。


    $ pip install mezzanine

結果

    $ Installing collected packages: pytz, tzlocal, chardet, 
      future, 
      idna, certifi, urllib3, requests, pillow, grappelli-safe, 
      oauthlib, requests-oauthlib, filebrowser-safe, django, 
      django- 
      contrib-comments, soupsieve, beautifulsoup4, six, 
      webencodings, bleach, mezzanine


mezzanineをpip install しただけで、これだけのライブラリが一瞬でインストールされました。

あとはそのまま、

    $ mezzanine-project sample(任意のプロジェクト名）

これだけで

    $ deploy			manage.py		sample
      fabfile.py		requirements.txt

こいつら全て作ってくれます。

djangoに精通していれば馴染み深いと思いますが、ここではそれぞれの説明は割愛します。

deployとfabfileはデプロイするときに全部自動で、サーバーに上げてくれるという代物ですが、mezzanineのdjangoが1.1なのと、その他ライブラリもバージョンアップされていたりでエラーが頻繁におきます。

なので、基本的には、マニュアルでデプロイするのをお勧めします。（そのほうが、サーバー周りもわかってきます :) ）

そして、ここからは同じで、startapp でアプリケーションの作成をして、データベースの作成をします。（djangoと違い、自動的にデータベースを作ってくれません。。。）

    $ python manage.py startapp theme

themeの部分はなんでも良いのですが、テーマという意味で、mezzanineではよく使われます。
そしてデータベース

    $ python manage.py createdb

db(database)をcreateですね。シンプルです。
これだけでmigrateもやってくれるので、あとは

    $ python manage.py runserver

でローカル環境に入ることができます。
なんと、すでにブログっぽいテンプレートとワードプレスライクな管理画面が作成されています。

<img width="1157" alt="Screen Shot 2019-02-08 at 18.57.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/268869/f63ccf25-d0e8-9729-7d2b-280b3343349f.png">

<img width="1167" alt="Screen Shot 2019-02-08 at 18.57.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/268869/cec54f73-02eb-ff5a-b0c1-e8f9f82f133f.png">


素晴らしいですね。

##ここからが難しい！

さて、mezzanine について検索するとここまではわかりやすく教えてくれるのですが、ここからが情報が少ないんですよね。。。

実際、複雑になっていきます。

まずはdjangoであまり使う人がおそらく少ないであろうコードを打ちます。

    $ python manage.py collecttemplates
      
      Copied 47 templates

こんなメッセージが出てきました。

    $ deploy			manage.py		templates
      dev.db			requirements.txt	theme
      fabfile.py		sample

これだけでtemplates　フォルダが追加されます。

    $ base.html		generic			 
      search_results.html
      blog			includes		twitter
      email			index.html
      errors			pages

mezzanineに使用されている全てのテンプレートがここで入手できます。

実をいうと、startprojectの時点で myvenv(仮想環境フォルダ）の中にこれらのテンプレートが自動で作成されているんですね。

ワードプレスライクな管理画面も、すでにデザインされているトップページも全部、こいつらなのです。

ということは、あとはこれらのファイルをいじっていくと、自分でデザインを変えていけるわけです。

正直、mezzanine を使う上で、models,py とかviews.py とかをいじるのは現実的ではありません。すでに、複雑なCMS機能が構築されているので、そこに手を加えるとなると、通常通りのdjangoの書き方では反映されないのです。

というよりもCMS機能を使う時って、プログラミングに詳しくない人が自分でページを作れるようにしたり、ブログの投稿を簡単にして、メタデータまでいじれるようにするっていうのが王道だと思うので、そもそもバックエンドをいじることも少ないんですよね。

###　でもフロントは大事です。

テンプレートをいじっていく前に、まずはファイルを確認してみてください。

django特有の{%%}がずらりだと思います。

初めてみた時は、ゲロ吐きそうになりました。

色々なファイルやviews.py と複雑に連携している証拠です。

これをいじるのは流石に骨が折れますよね。。。

### まずは、templates フォルダの名前を変更しましょう。

そして、theme　フォルダの中にtemplatesを追加します。あとは、名前を変更したフォルダから、ファイルを移動していきます。

なぜこれを行うのかというと、

myvenvの環境の中には、親元のtemplatesフォルダが存在しているわけです。

templatesを全ていじるわけではないので、いじらないtemplateファイル（html)はそのまま反映してほしいわけです。

ただ、自分で色々変更したhtmlファイルに関してはしっかり変更が反映されてほしいので、それらをthemeフォルダの中のtemplatesフォルダに移動して、

### コピーしたtemplatesフォルダと全く同じ構造でファイルを置いていきます。

例えば、blogフォルダの中にあるファイルはblogフォルダを作ってから、ファイルを作成していきます。

これでしっかり読み込んでくれます。

そして、settings.py を開きましょう。

installed_appsにthemeを追加します。

###必ず一番上に！

とりあえず、base.htmlと同じ階層にあるindex.htmlになんでもいいので、文字を追加してみてください。

<img width="1152" alt="Screen Shot 2019-02-08 at 19.20.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/268869/2235e3e2-71c8-25d1-b87a-e919ce49c1a9.png">

文字が変わりました！

つまり、テンプレートをいじれた！

さあ、あとは、djangoと同じように自分で作ったcssファイルを<head>に追加するなり、bootstrapを使って、デザインを変更していくなり、好きなようにデザインをいじってください！！

管理画面でページを追加すればしっかりページがナビに現れますよ！

<img width="1149" alt="Screen Shot 2019-02-08 at 19.26.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/268869/cc2651f0-8775-f509-04d6-fac06d2d8bae.png">


サイドバーを消すなり、なんでもありです。

     - settings.py
    LANGUAGE_CODE = "ja"

余談ですが、settings.py のlanguage_codeを’ja’にすることで、管理画面が日本語になります。

あとはTimezoneとかも'Asia/Tokyo'に変更したりしておくと便利ですね。

<img width="1157" alt="Screen Shot 2019-02-08 at 19.30.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/268869/af36ffa7-1d1b-b2f2-b7bc-688e8473d862.png">

何がすごいかって、このコードを変えるだけでいろんな言語にmezzanineが勝手に変えてくれます。検索もあるし、色々便利なmezzanineです。

長くなってきたので、そろそろ切り上げようかと思いますが、

大事なポイントを何点か上げていきます。

### urls.pyの英語が読めれば、コメント欄を呼んでください。

このurls.pyでブログをトップページに表示させるかとか、とか、新しくデザインを作るかとか（pages/index.htmlにコードを書くことで、トップページだけ、templates/index.htmlのコードを反映させる）
の設定があるので、、、

多くの場合、ブログ用に作成すると思うので、トップにブログ記事を載せる用の設定に変更しなければいけないと思います。

英語の説明ですが、何をすればいいかはurls.pyに書かれています。基本的には #のコメントマークを外して機能すると思います。


### base.htmlのnavでdropdown,treeなど、ナビゲーションのスタイルが変更できる。

templates/pages/menus の中からdropdown, tree, primary　のどれかを選んで、themeのtemplatesフォルダに同じ構造でコピーし、

base.htmlのnavを少しいじります。

    67   {% block navbar_dropdown_menu %}{% page_menu 
          "pages/menus/dropdown.html" %}{% endblock%}


67行目にありますね。デフォルトではdropdownになっていますが、変更可能です。


##　終わりに

正直、デプロイ前まで書くといいながら、内容がかなり増えてしまいました。

まだまだ色々、追加できる機能はありますが、とりあえず、トップページと追加するページのデザインをいじることができればサイトとして機能すると思います。

デフォルトで投稿へのコメントとか、シェアボタンとかが実装されているので、その辺りも気にする必要はありませんが、邪魔なら、前述したように、themeのtemplatesの中に持ってきて、消すこともできるので、割と好きなようにいじることができます。

## mezzanine を実際に運用してみて

私は正直、djangoの方が好きです。。。笑

その理由の一つがmezzanine がdjango1.1であるということ。

djangoはバージョン２になってから大きく進化しました。使えるライブラリが増えたり、googleに転がってる参考コードがバージョン２だったり。

もう一つが、mezzanineが複雑なシステムで構成されている故のもっさり感です。

正直、djangoの何倍もの容量があるので、少し重たくなります。

もちろんそこまで気になるものでもないのですが、速さを重視するなら断然djangoです。

そして、もう一つがdjangoの素晴らしさ。

djangoと他のフレームワークである Rails等との大きな違いは、URLの設定やデータベースとのやりとりを全て明示的にコードとして書かなければいけないこと。

裏を返せば、

###　かなり自由にシステム構築ができる

そして、機械学習や数値演算など、pythonが強みとすることがdjangoのシステム内で行えるのです。

今回の記事はmezzanineですが、これはこれからdjangoの記事を書いていくための序章なので、これからはどんどんdjangoの記事を上げていきますw

URLの設定や関数など、バックエンドに関する大半は使い回しもできるように作ることで、一度、複雑なdjangoのシステムを作ってしまえば、２つ目のWebサービス以降は時間が大幅に削減できます。

そして、さらにdjangoのことをわかってくれば、CMSであるmezzanineのようなシステムも素早くdjangoで作れるようになります。

その上で、簡単にデータベースやviews.pyなどのフロントとのやりとりの中間を成す部分も自由にいじることができるので、

mezzanineの実装をするよりは、djangoを極めていくことをお勧めします。笑

とはいうものの、mezzanineを使えば、コード５行くらいで、ブログやHPを作ることもできるので、簡単なブログを作ったりする点ではmezzanineはやっぱり便利だと言えます。

最後に、もっとmezzanineのことを使いこなしていきたいという方は、

こちらのudemyの動画をお勧めします。

今回の内容を含め、デプロイまでの全ての行程をわかりやすく説明してくれています。

英語ですが、動画でのコードをコピペしていくだけでもとりあえず、完璧なものが作れるので、mezzanineを使いこなしていきたい方は、ぜひ、学習してみてください！

[mezzanine学習動画 at Udemy](https://www.udemy.com/create-a-blog-with-mezzanine-cms-the-best-django-cms/learn/v4/overview)

ご質問もお待ちしてまーす！