pythonでweb開発を初めてみることにしたので、djangoを使ってみます。
instagram, dropbox, google検索など割と有名なサービスでも利用されているようです。
pythonのwebフレームワークだとdjangoとflaskの比較がよくされるようですが、web開発に必要な機能(ORMや認証など)を全てデフォルトで提供しているのがdjangoで、必要最低限な機能をシンプルに提供しているのがflaskのようです。
flaskでもORMや認証なども追加機能として入れられるので開発は問題なくできるみたいだしその方が自分で機能を自由にカスタマイズ・拡張するには便利かもしれませんが、まずはレールに乗っかるだけで世に出せるサービス開発までできる環境の方が楽だと思うのでdjangoを選びました。
まずは本当に最初からなので、 公式のdjangoチュートリアルをやっていきます。
ログ&備忘録として書いているだけなので、公式チュートリアルほぼまるパクリの内容です。
python3.8.5、django3.1.1です。
ちなみに開発環境はintellijです(pythonプラグインを入れているので実質pycharm)。
djangoプロジェクトのテンプレート生成
# プロジェクトディレクトリ直下で
$ django-admin startproject mysite
以下のようなテンプレートが生成されます。中にあるmysiteディレクトリがプロジェクトパッケージ本体です。
mysite/
manage.py # プロジェクト管理用のユーティリティ
mysite/ # プロジェクトパッケージ
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
これで最低限の開発サーバーを立ち上げられるようになります。以下のコマンドで
# manage.pyがあるディレクトリに下りて
$ python manage.py runserver
コンソールに出ているhttp://localhost:8000/にアクセスして以下のような画面が出れば成功です。
もちろんですがこれはあくまで開発用のサーバーなので、本番環境や外からアクセスできるような環境では使いません。
便利なことに、このrunserverはデフォルトでpythonコードの変更検知&自動リロードしてくれるので設定要らずで便利そうです。
projectとapp
app:具体的なwebアプリ。
project:設定ファイル等とappをひとまとめにしたもの。一つのproject内にappは複数あっても良い。
先ほど作ったmysiteプロジェクトの中の任意のディレクトリ下でappを作成できます。例えばプロジェクト直下でpollsというアプリを作ってみます。
$ python manage.py startapp polls
ビューの作成
djangoはMTV(Model-Template-View)というアーキテクチャを採用しています。
このサイトによると、
- モデル:MVCのモデルと同じでデータとロジックの定義
- テンプレートとビュー:MVCのビューに相当
らしいです。MVCのビューはデータの表示部分のことですが、「何をどのように表示するか」の「何を」の部分がMTVのビューで「どのように」の部分がMTVのテンプレートに対応するようなイメージだと今は考えておきます。
「表示」にも(モデルに定義されるようなビジネスロジックではなく)表示のためのロジックがあるからそれを「ビュー」で定義し、その見せ方(UI/UX?)はテンプレートに定義するという感じでしょうか。
https://djangobook.com/mdj2-django-structure/
こちらにもっと詳しい説明があるので今度読んでみます。
脱線しましたが、MTVにおけるビューの作成をしてみます。以下が最もシンプルなビューです。
from django.http import HttpResponse
def index(request):
return HttpResponse('Hello, world. polls index.')
これをpollsアプリの配下にあるviews.py
の中に書きます。
ルーティング
ルーティングのためにurls.pyというファイルをpolls直下(views.pyと同じディレクトリに)に作成して以下のようにルーティング設定を書くことで先ほどのビューがpollsアプリのインデックスページとして登録されます。
# プロジェクトルート/polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, 'index'),
]
pollsアプリ自体のルーティング設定はmysite/urls.pyの方に追記します。
# プロジェクトルート/mysite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('polls/', include('polls.urls')), # 追記箇所
path('admin/', admin.site.urls),
]
これでhttp://localhost:8000/polls/
へアクセスするとpollsアプリのインデックスページが開くことになります。
include()
という関数を使うことで他のURLconfを参照することができます。今のコードだと、例えば/polls/xxx/yyy
というパスへのルーティングの場合、xxx/yyy
の部分はそのままpolls.urlsへ渡されてそちらへルーティングが委譲されます。
path()
の引数について
- 第一、第二は必須
-
- route: URLパターンとなる文字列
-
- view: このパスで呼ばれるビュー
-
- kwargs: 任意の辞書引数をビューに渡すことができる
-
- name: このルートのグローバルな名前をつけることができる。テンプレートからこの名前で参照できるため、URLパスの変更をurls.py内だけに閉じることができる。