以前も少し書きましたが、C#とASP.NETで作成していた自分用の「レシピ管理システム」を、現在Djangoで作り直しています。
※リポジトリはこちら

DjangoはPythonで作られたフルスタックフレームワークです。
よく言語比較をされるRubyではRuby on Railsが有名であり、そちらのほうが巷では人気がありますが、 昨今の機械学習ブームも手伝ってPythonという言語自体はとても注目されています。

以前バッチ処理でPythonを利用していた私としては、せっかくなのでWebアプリも作ってみようということで挑戦することにしました。
ただ、Djangoに関する文献やドキュメントは英語が多く、最低限動作させるのにも結構苦労しましたので、今後Djangoを学ぶ方の役に立てばいいなと思いこの記事を書きます。

ちなみにチュートリアルは基本日本語ページですが、半分ぐらいは英語ページのままだったりします。

プロジェクト≠アプリケーション

他言語でWebフレームワーク利用経験があると、まずここで混乱します(私もそうでした)。

たとえば「CakePHP」の場合、以下コマンドでアプリケーションを作成して、それをそのままプロジェクトとして利用します。

composer create-project --prefer-dist cakephp/app [project_name(=application_name)]

先ほどあげた「Ruby on Rails」も同様です。

rails new [project_name(=application_name)]

Djangoの場合、プロジェクト内で機能や用途に応じてアプリを分けるという方針で開発することになります。
最近のソーシャルゲームだと、ユーザ情報、イベント情報、手持ちのキャラクターなどはすべて別アプリで、それらをまとめて1つのプロジェクトとして管理するようです。
※ここらへんは、作成中のレシピ管理システムにはまだ反映できていません…。

プロジェクト作成

django-admin.py startproject [project_name]

アプリ作成

manage.py startapp [application_name]

利用する主なファイル

他のフレームワークであるような「MVC構成」とは少し異なります。
作成したアプリで以下のファイルが配置されますので、それぞれの中で一括管理するようです。

  • urls.py…ルーティング関連
  • views.py…コントローラ関連
  • models.py…モデル関連

urls.pyは、デフォルトではプロジェクト・各アプリそれぞれにあります。
プロジェクトのurls.pyでは各アプリへの振り分けを行い、各アプリではそれ以下のパスの振り分けを行っています。

# プロジェクトのurls.py
urlpatterns = [
    # productアプリのurls.pyへ処理を委譲
    # namespaceは衝突を防ぐための名前空間
    url(r'product/^$', include('product.urls'), namespace='product'),
]
# productアプリのurls.py
urlpatterns = [
    # 第二引数は割り当てるアクション(関数)
    # nameはテンプレート(HTML)で利用できるエイリアス
    # テンプレートでURLを生成する際、{% url 'product.index' %}とすれば「/product/」を自動生成してくれる
    url(r'^$', views.index, name='index'),
    # パラメータを利用するケース
    # テンプレートで{% url 'procuct.detail' %}
    url(r'detail/(?P\d+)/^$', views.detail, name='detail'),
]

以上、ひとまず基本部分でした。
テンプレートでのヘルパー利用やモデルの設定についても触れたいのですが、それは次回以降にまわします。
興味を持っていただけた方は、まずは冒頭のリポジトリをご覧ください。