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_response→resolve_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を設定することができる