フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

Django初心者が全体感を理解するため調査した内容まとめ

f:id:lirlia:20210418121750p:plain

この記事はDjango素人が、Djangoとはどういうものなのか?それに付随する周りの技術にはどういうものがあるのか?を順を追って調べた記事です。この記事の内容を把握すれば勘所は掴めると思います。

その内容をそのまま参考にしていただいても大丈夫ですし、「こういう風に調べて理解を深めているんだ」という調査の流れを知っていただくのにも使えるかなと思います。

なおこの時の知識レベルは以下の通りです。

  • Pythonでツールとかは作れるが、Webアプリは書いたことない
  • Web/Applicationサーバはどんなものか知っている
  • インフラの知識は結構あるのでSocket / システムコールはわかる
  • MVCモデルは聞いたことある / REST APIはまあ大体わかる

考え方の方針としてとにかく全体感を知っていき、わからない用語や機能をその都度調査する流れとします。(細かい実装やコード書くところはやらない)

前提知識

  • Webサーバ:静的なコンテンツを公開する
  • Applicationサーバ:動的なコンテンツを生成、公開する

Djangoについて調べる

  • 読み方:JANG-oh(ジャンゴ)
  • 公式:The Web framework for perfectionists with deadlines | Django
  • 思想:設計思想 | Django ドキュメント | Django
    • もともとはPythonでDB駆動型のWebサイトを簡単に作るため
    • 当時存在していたフレームワークでしっくりくるものがなかったとか
    • 思想としては「疎結合」と「凝集度」でMTV(Model/Template/View)と呼ばれる役割分担でWebアプリを分割すること
    • レイヤ間で何も共有しない (shared-nothing)アーキテクチャのため、データベースサーバ、キャッシュサーバ、 Web/アプリケーションサーバのどのレベルにでもハードウェアを追加することができる

MTVモデルとは?MVCモデルとの違い

MVCとは?

MVCモデルはソフトウェアアーキテクチャの一種で、ソフトウェアの処理をプレゼンテーション(View・Controller)とドメイン(Model)を分離しまたユーザー入力(Controller)と表示(View)も分離することでソフトウェアの保守性・開発生産性を向上させるものです。

Wikiを参照すると以下のように規定されています。これらの考え方に準拠してコードを作成することで、どこに何が書いてあるかわかりやすかったり、範囲を明確化することで疎結合性を担保します。

◆モデル そのアプリケーションが扱う領域のデータと手続き(ビジネスロジック - ショッピングの合計額や送料を計算するなど)を表現する要素である。また、データの変更をビューに通知するのもモデルの責任である

◆ビュー モデルのデータを取り出してユーザが見るのに適した形で表示する要素である。すなわち、UIへの出力を担当する。例えば、ウェブアプリケーションではHTML文書を生成して動的にデータを表示するためのコードなどにあたる

◆コントローラ ユーザからの入力(通常イベントとして通知される)をモデルへのメッセージへと変換してモデルに伝える要素である。すなわち、UIからの入力を担当する。モデルに変更を引き起こす場合もあるが、直接に描画を行ったり、モデルの内部データを直接操作したりはしない。

MTVとは?

ではMTVとはなんでしょうか? Djangoの公式として特に定義をしているわけではないようですが、DjangoにおけるMVCが前述のものと異なっているので、違う単語を規定することで誤解を生まないようにしていると考えられます。

ここに記載があります。

Djangoにおけるビューは「ユーザに表示するデータを記述(データの見せ方を書く必要はなく、表示したいデータの選び方を書くもの) 」と規定されています。MVCモデルの中ではUIを担当していたので明らかに違いがありますね。

DjangoにおけるUIを担当する箇所をテンプレートといいます。テンプレートはビューから受け取った内容をベースにユーザ画面を生成し返却します。つまりMVCにおけるビューに相当しますね。

まとめると以下のような対応となります。

MVCモデル MVTモデル
View Template
Controller View
Model Model

f:id:lirlia:20210418130219p:plain

MTVを理解しよう - Djangoの学習ができるチュートリアルサイトDjangoBrothersより引用

DRF(Django Rest Framework)とは?

f:id:lirlia:20210418122230p:plain

これを使用すると先ほどまで話していたテンプレートの概念がなくなり、DRFで提供される serializers(シリアライザー)と呼ばれる物で代替されるとのことです。

f:id:lirlia:20210418145657p:plain

Django REST Framework + Clean Architecture 設計考察 - Qiitaより引用

WSGI(Web Server Gateway Interface)とは?

  • 読み方はウィスギ
  • WSGIの目的はWebサーバが変わったとしてもアプリを動かせるようにするため標準的な考え方を定義すること
  • WebサーバとPythonのWebアプリケーションまたはフレームワークの間のインターフェースを規定している

具体的にはWSGIに対応したApplicationサーバでは、受信したHTTPリクエストのパラメータ(メソッド、パス、プロトコル、Body、Headerなど)を環境変数として加工し、それをベースに配置されたスクリプトをexec(実行)することでリクエストごとにページ、処理を行うようにしている。またその標準出力をレスポンスとして返す。

参考動画

uWSGIとは?

f:id:lirlia:20210418121728p:plain

  • こっちも読み方はウィスギ
  • WSGIに準拠したApplicationサーバ / 他にはgunicornというのもある
  • uWSGIはプロセス数を指定することで実際にリクエストを処理するワーカーを増加させることができる
    • ワーカーは親プロセス(uWSGI)からforkされるので、親プロセスがバインドするSocket情報を引き継ぐ
    • 複数のプロセスが起動していると仮定する場合、複数のプロセスが同一ポートをバインドすることになる
    • 各プロセスはepoll_wait()というシステムコールを発行し対象のSocketへの通信の到着をポーリングして待ち受ける
    • 通信が届いた場合はaccept()というシステムコールを発行し、最初に受信できたワーカーのみが通信を処理するためにクライアントとのコネクション用のSocketを新たに生成する
    • 負けたワーカープロセスは再びepoll_wait()に戻る
  • uWSGIでできること
    • サーバの再起動を伴わないコードの更新が可能
      • SIGHUPをワーカーに送ることでプロセスの再起動を促す
    • キューイングの機構もある
    • その他いろいろ→ドキュメントを読もう

参考動画

ASGI(Asynchronous Server Gateway Interface)とは?

  • 公式:ASGI Documentation — ASGI 3.0 documentation
  • WSGIの後継者
  • 非同期に対応したWebサーバとPythonのWebアプリケーションまたはフレームワークの間のインターフェースを規定している
    • WebSocket/HTTP2/async、awaitなど

Djangoを利用する場合の全体像はこんな感じで、INTERFACE SERVERのところに Daphne(だふね)が来る。 そしてそこで受け取ったリクエストを裏のワーカープロセスに渡すところでチャネルという新しい概念が用いられる。

f:id:lirlia:20210418152939p:plain

今後読むべき(読むといい内容)