Open2

DjangoソースからPythonのモダンな実装や開発ツールを学ぶ

いなむらいなむら

目的

  • Webフレームワークの知識を深めたい
  • Pythonのベストプラクティス・モダンな開発ツールを知る

そのために何をするか

  • Django5系のソースを読む
    • 画面からボタンが押下されると、何が動いてどうなるか
    • HTML側のタグ実装方法、アノテーション作成方法 ...etc
  • どんな環境で開発がおこなわれているか
    • CI,CD環境
    • ライブラリ
    • ライフサイクル
      • イシュー作成→マージまでがどうおこなわれているか
いなむらいなむら

画面からボタンが押下されると、何が動いてどうなるか

画面からリクエストが送られる

WSGIHandlerが画面からのリクエスト→レスポンスを担う

WSGIについて

Web Server Gateway Interfaceの略
Pythonアプリケーションとウェブサーバー間のやりとりを標準化したもの

クライアント → Gunicorn(ウェブサーバー) → Django(Pythonアプリケーション)

WSGIが存在していることで
webアプリフレームワークの開発者はウェブサーバーに起因する低レベルの通信のことを気にしなくてよくなる
→ Gunicornの役目

Django側が気にすることはWSGIの形式で受け取るレスポンスを正しく処理することである
それがWSGIHandlerである

self.request_class(environ)にてenvironというリクエストデータをHttpRequestオブジェクトに変換

HttpRequestについて

Djangoにおけるリクエストに関する生データのオブジェクト
GET, POST属性はdjango.http.QueryDictオブジェクトである。
同一キーに対する複数の値を扱うケースがどんな時だ?

urls.pyにて適切なviewにアクセス

get_respose内ではアクセスされたURLとそれに対応するviewに行くために
ROOT_URLCONFなる、プロジェクトルート配下のurls.pyファイルを見に行く
プロジェクトにおいてはさまざまなドメインのディレクトリができていくことから、
urlsもその分割でファイルごとにincludeで分けることもできる。

urlpatternsに定義することで、なぜdjangoが勝手にそこを辿ることができているのか?

WSGIHandler__init__にてload_middleware_get_responseresolve_requestにてURLResolverを呼び、resolveメソッドにてurlpatternからViewを取得

特殊メソッドについて

call
リクエストごとに呼び出されるメソッド
まだ具体的な実装概要は見えていないが、
djangoにおいてはgunicorn等のWSGIサーバーと状態はWSGI側のものを使い
リクエストごとにDjango側と正しく通信するために定数的なものをcallメソッドに持っている感じか・・?

repr
オブジェクトの文字列表現を定義
対話型インタープリタでオブジェクトを直接表示したときに返される値をカスタマイズ。
デバッグ用で使用されることが多い

>>> import datetime
>>> today = datetime.date.today()
>>> str(today)
'2018-04-12'
>>> repr(today)
'datetime.date(2018, 4, 12)'
_urlconfsについて

スレッドローカルストレージを使用している
スレッドローカル変数は、同じグローバルスコープのように見えても、スレッドごとに独立した値を持つ特殊な仕組み。

Pythonでは、threading.local()を利用してスレッドローカルストレージを作成し、
Djangoでもこの仕組みを使って、_urlconfsを管理しています。

サブドメインごとにurlconfを変えたいときなどに使われ、動的にurlconfを設定することができる