気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM等について、学んだことや備忘録をアウトプットとして残し、情報を必要としている誰かにとって「かゆいところに手が届く」ブログとなることを願いながら記事を書いています。

【Django】middlewareに関する復習

スポンサーリンク

middlewareとは?

Djangoのリクエスト/レスポンスをフックする仕組み。 ミドルウェアがなくても動作するが、せめてCommonMiddlewareだけは使うように強く勧めるとのこと。

process_request

process_request(self, request)
  • request: HttpRequestオブジェクト。Djangoが呼び出すビューを決定する前に呼ばれる
  • NoneかHttpResponseかのどちらかを返す必要あり
    • None:Djangoは処理を継続し、他のミドルウェアやビューを実行
    • HttpResponse: 他のリクエストミドルウェア、ビューミドルウェア、例外ミドルウェア、URLconfのビューを呼び出さず、HttpResponseオブジェクトをそのまま返す。(レスポンスミドルウェアは必ず実行)

process_view

process_view(self, request, view_func, view_args, view_kwargs)
  • request: HttpRequestのオブジェクト
  • view_func: Djangoがビュー関数として呼び出そうとしているPython関数
  • view_args: ビューに渡されることになる固定引数
  • view_kwargs: ビューに渡されることになるキーワード引数の辞書
  • NoneかHttpResponseかのどちらかを返す必要あり
    • None: Djangoは処理を継続し、他のミドルウェアのprocess_viewを試した後、適切なビューを呼び出す
    • HttpResponse: 他のリクエストミドルウェア、ビューミドルウェア、例外ミドルウェア、URLconfのビューを呼び出さず、HttpResponseオブジェクトをそのまま返す。(レスポンスミドルウェアは必ず実行)

process_template_response

process_template_response(self, request, response)
  • request: HttpRequestクラスのオブジェクト
  • response: SimpleTemplateResponseクラスのサブクラス。 (例えばTemplateResponse、あるいは、renderメソッドを実装する任意のレスポンスオブジェクト)
  • renderメソッドを実装するresponseオブジェクトを返す必要あり
    • responseのresponse.template_nameとresponse.context_dataを変更することができるが、新しいSimpleTemplateResponseか、同等のものを作成することも可能
  • responseインスタンスがrender()メソッドを持っている場合、(つまり、そのresponseがTemplateResponseクラス、あるいは同等のクラスである場合)のみ呼び出される
  • 明示的にresponseをレンダする必要はない。全てのテンプレート応答ミドルウェアが呼び出されたときに1度だけ自動的にresponseがレンダされる

復習情報元

ミドルウェア (Middleware) | Django ドキュメント | Django