Python3 – cURL

基本形~GET

Python3で指定したURLのサイトからレスポンスを得る手順は以下のとおり。

  1. urllib.request.urlopenで接続のオブジェクトを得る
  2. 接続オブジェクトに対してreadメソッドを実行する

ただし結果はバイト列で得られる。

urlopenの引数にURLを指定

以下はurlopenの引数にURLを指定した手順。

  1. urlopenの戻り値(Responseオブジェクト)を変数responseに保存
  2. responsereadメソッドメソッドでレスポンスの内容を取得

レスポンスの内容はバイト列で返される。

文字列でレスポンスを得るには、decodeメソッドでバイト列を文字列にデコードする。

urlopenの引数にRequestオブジェクトを指定

まずURLを指定してurllib.request.Requestオブジェクトを生成し、これをurlopenの引数として接続を開く。

POST

ポストの流れは以下のとおり。

  • urllib.requesturllib.parseをインポートする
  • urlopenの引数にRequestオブジェクトを渡す
  • Requestオブジェクト生成時にdata引数を指定するとPOSTメソッドになる(method='POST'がなくてもよい)
  • dataへ渡す引数は、以下のように処理
    • 元のパラメータ群を辞書で準備
    • そのデータをurllib.parse.urlencodeでエンコード(utf-8のエンコードも加える)

以下はhttpbin.orgを利用して確認した例。httpbin.org/postからのレスポンスがJSON形式なので、jsonライブラリーをインポートしてレスポンスを整形している。

 

Python3 – json

概要

JSONの文字列が与えられたときの扱い。

  1. json.loadsで文字列をPythonの変数に変換(デコード)
  2. json.dumpsでPythonの変数を文字列に変換(エンコード)
    • ensure_ascii=Falseでユニコード文字をエスケープさせない
    • indent=nでJSONの構造に即した改行・インデントを適用

json.loads

json.loadsメソッドは、JSON文字列をPythonの変数にデコードする。Pythonの辞書になっていることがわかる。

JSONのキーと値が辞書のキーと値に対応している。

json.dumps

そのままエンコードした場合

json.dumpsは、辞書に変換されたJSONの内容を文字列にエンコードする。

ただしこのとき、ユニコードはエスケープされ、改行を含まない文字列となる。

引数設定によるJSONの構造表現

以下の2つの引数を指定する。

ensure_ascii=False
ユニコードをエスケープせずそのままの表現とする。
indent=n
JSONの構造に即した改行・インデントを適用する。

これによって、ユニコード文字列はエスケープされず、JSONの構造に即した改行・インデントが適用された文字列が得られる。

 

 

PHP – json

概要

JSONの文字列が与えられたときの扱い。

  1. json_decodeで文字列をPHPの変数に変換
  2. json_encodeでPHPの変数を文字列に変換
    • このとき、JSON_UNESCAPED_UNICODEJSON_PRETTY_PRINTのフラグを立てる

json_decode

json_decode関数は、引数で与えられたJSON文字列をPHPの変数に変換する。

JSONのキーや単体の要素はstringに、{ ... }stdClassのオブジェクトに変換され、キー=>値がオブジェクトのプロパティーとなっている。

json_encode

そのままエンコードした場合

json_encodeは、PHPの変数で表現されたJSONコードを文字列に変換する。

ただしこのとき、ユニコードはエスケープされ、改行を含まない文字列となる。

オプションフラグの設定

以下の2つのフラグをセットする。

JSON_UNESCAPED_UNICODE
ユニコード文字をエスケープせずに扱う。
JSON_PRETTY_PRINT
JSONの構造に即した改行・インデントを適用する。

これによって、ユニコード文字列はエスケープされず、JSONの構造に即した改行・インデントが適用された文字列が得られる。

 

Python3 – bytesとString

概要

Pythonでの文字列表現をバイト列に変換するにはencodeメソッドを用い、バイト列を文字列に変換するにはdecodeメソッドを用いる。encode/decodeの引数には文字コードを指定する。

バイト列をPythonのprint文で出力すると、b'文字列'で表現され、改行文字などはエスケープコード(\nなど)で表示される。

ASCII文字列

encode/decode

ASCII文字列はencode/decodeの引数を'ascii'とする。

ASCIIの場合は引数が'utf-8''shift_jis'としても結果は同じ。

16進表現

bytes.hexメソッドの引数にバイト列を与えると、その16進表現の文字列が得られる。

UTF-8/Shift_JIS

encode/decode

マルチバイト文字の場合、encodedecodeで文字コードを整合させる。

encodedecodeで文字コードが違うと、文字化けするのではなくエラーになる。

ただしerrors引数の設定をデフォルトの'strict’から変更すると、文字化けした文字列などが返される。

16進表現

マルチバイト文字の16進表現はバイト列の表現のとおりになる。

 

Python3 – ファイル操作

ファイル操作の流れ

大まかな流れは以下のとおり。

  • モードを指定してファイルを開く~open
  • ファイルへの読み書きを実行
  • ファイルを閉じる~close

具体的には、openでファイルオブジェクトを取得し、読み書きやcloseなどの操作はファイルオブジェクトに対して実行。

基本形

以下のファイルを準備。行末は全て改行コードで終わっている。

以下のコードは、ファイルを読み込みモードで開き、内容を一つの文字列に一括して読み込んで表示している。

実行結果は以下のとおり。

ファイルの各行末に改行コードがあるため、そこで改行されて表示される。さらにprint関数で自動的に改行コードが付加されるため、最後に空白行が入っている。

with文

with文でopenを指定することにより、withブロック終了時に自動的に終了処理(close)が実行される。

ファイルからの読み込み

read~一括読み込み

readメソッドはファイルの全内容を一つのテキストとして読み込む。

readline~一行読み込み

readlineは実行のたびにファイルから1行ずつ読み込み、ポインターを次の行に進める。読み込む内容がない場合には''を返す。

以下はファイルの内容を2行だけ読みだす例。

以下はファイル内容の全行を1行ずつ取り出す例。

readlines~行に分割して読み込み

readlinesはファイルの内容を行に分解し、各行の内容を要素としたリストを返す。

ファイルへの書き込み

ファイルに書き込む場合、オプションに'w'を指定。既にファイルが存在する場合、その内容は無視されて上書きされる。

write文

write文は引数の文字列を単に書き込む。

print文

print文のfile引数にファイルオブジェクトを指定すると、ファイルに書き込むことができる。この場合、書式設定などを活用することができる。

ファイルへの追記

既存のファイルに追記するには'a'オプションを指定。以下の例では、上で作成されたtest.txtに1行追記している。

ファイルが存在しない場合は、'w'と同様にファイルが作成されて新規に書き込みされる。

 

Django – Tutorial4 – フォーム

フォームの配置

このページはDjangoのDocumentation、Writing your first Django app, part 4に対応している。

detailページの機能

チュートリアルのテンプレートのところで作成したindexページでは、データベースのquestionテーブルに保存されたQuestionデータの一覧が表示される。

各Questionデータのリンクをクリックすると、polls.viewsモジュールのdetail関数にルーティングされ、detailテンプレートが呼ばれてページが表示される。

現状でこのページでは、"You're looking at question 1."のようにクリックしたQuestionデータのidを含むテキストが表示されるだけ。

ここでdetailページに以下のような機能を持たせる。

  • クリックしたQuestionデータのquestion_textを表示する
  • そのQuestionデータに関連付けられた(すなわちその回答選択肢となる)Choiceデータ群を、ラジオボタンとともに表示する
  • Voteボタンを押すと、選択した回答のidが送信される

id送信後の振る舞いについては後に実装することとして、ここでは上の機能をテンプレートで実装していく。

コードの変更

pollsアプリケーションのdetailテンプレートを以下の内容に変更する。

テンプレートがビューから受け取る変数

questionオブジェクトとerror_message(テキスト)が渡されることを想定している(上記コードのL4, 6, 8)。

form要素のactionとmethod

form要素のオプション設定は以下の通り。

  • actionの呼び出し先はpollsアプリケーションのname='vote'ルート→vote関数で、questionデータのidをURLパラメーターで渡す
  • メソッドはPOST

csrf_tokenタグ

form要素内の最初にCSRF/XSRF (cross-site request forgery)対策として{% csrf_token %}を置いている。form要素にこのタグを置かないと、Djangoによりアクセス禁止のエラーとなる。

qustion_textの表示

ビューから受け取ったquestionオブジェクトのquestion_textプロパティーの内容をh1要素として表示させる。

エラー表示

ビューの処理でエラーになった場合error_message変数が定義されることを前提としている。DTLのifタグにより、error_messageがセットされているときはこれが表示され、選択肢とラジオボタンが表示される。

選択肢の表示

questionデータに対する選択肢はChoiceデータが関連付けられていて、そのコレクションはDTLのドット検索によりquestion.choice_set.allで得られる。

フォームでは、このコレクションの要素(各Choiceデータ)をDTLのforタグで1つずつ取出している。そして、各choiceについてラジオボタンとラベルテキストを生成している。

ラジオボタンの属性は以下のとおり。

name=”choice”
すべての選択肢に同じname属性を適用してグループ化している。
id=”choice{{ forloop.counter }}”
label要素で参照するidで、先頭から連番でchoice1, choice2, …のような値となる。forloop.counterDTLのforタグの変数で、ループカウンターの値が得られる。
value=”{{ choice.id }}”
選択されたラジオボタンに対応する値で、Choiceデータのidが充てられる。このidによって、データベース上の指定したデータが得られる。

このテンプレートがレンダリングされたときのHTMLは以下のとおり。valueの値が1, 2, 4となっているが、データの削除・追加によってAUTO_INCREMENTの値は必ずしも連続にならない。一方、forloop.counterを利用したidの数字部分は連番となっている。

ここでindexページのQuestionデータのうち"What's up?"をクリックすると、レンダリングされたdetail.htmlにより以下のページが表示される。

この段階でVoteボタンを押すと、polls.viewsモジュールのvote関数にルーティングされるが、この段階では”You’re voting on question 1.”とだけ表示される。

vote関数の実装

vote関数での処理

ここではフォームのアクション先であるvote関数の処理を実装する。処理内容は、Questionの持つ選択肢のうちditailページで選択・送信されたChoiceデータのvoteカウンターを1つ増やしてデータベースを変更するというもの。

コード

vote関数の内容を以下のように変更する。

モジュールのインポート

パッケージ先頭でHttpResponseRedirectモジュールをインポートしている。このモジュールは、URLconfで定義したルート名とパラメーターを与えてレスポンスを返す。

またChoiceモデルを扱うために、Questionに加えてChoiceモジュールもインポートしている。

Questionの取得

フォームのaction属性で、Questionデータのidをクエリーパラメーターで渡すようになっていて、vote関数の引数でこれを受け取る。

そのidQuestionデータを取得し、存在しなければ404エラーとなる。

投票登録:try~except~elseブロック

このブロックで、Questionデータに対する選択肢をデータベースから取得し、エラーならエラー処理をし、成功したならその選択肢の得票数を1つ増やす。詳細は以下の通り。

try節

try節では、前段で得られたQuestionデータの選択肢Coiceデータのうちフォームで選択されたものを取得する。

  • getメソッドでpkPOST['choice']に等しいデータを取り出している
  • POST['choice']はフォームにおいてname='choice'INPUT要素から得られるvalue属性の内容
  • 今回のフォームではラジオボタンのグループが'choice'であり、POST['choice']から選択されたボタンのvalue属性の値が得られる
  • フォームではvalue={{ choice.id }}としているので、この値は選択された選択肢に対応するChoiceデータのidの値

except節

except節では、引数で指定したKeyErrorChoice.DoesNotExistの2つの例外をキャッチしている。いずれかの例外が発生した場合に、現在処理中のQuestionデータを与えて元のdetailページを表示させるが、このときエラーメッセージをセットしているのでこれも表示される。

KeyErrorPOST['choice']でデータを取り出すときに'choice'というキーが存在しない場合に発生する。このような状況は次の場合に発生する。

  • 選択肢を持たないQuestionデータに対してVoteボタンを押した場合(今回の例の場合question_text"Hou're you doing?"のデータ)
  • HTMLのラジオボタンのname属性が改ざんされた場合

Choice.DoesNotExistの方は、getメソッドで条件に合うデータがデータベース上にないときに発生する。ただ今回のコードでは、DB上のデータが取得できない場合はget_object_or_404により404エラーへと飛ぶようになっているので、ここでDoesNotExist例外は発火しないのではないか。

else節

else節はtry節の処理が正常終了した場合に実行される。今回の場合、フォームで選択された選択肢のChoiceデータが無事取得できたことになるので、データベース上の得票数カウンターを1つ増やして投票結果表示のresultページにリダイレクトする。

得票数のカウントアップは簡単で、取得済みのデータについて以下を実行。

ただしこれはデータベースからメモリー上に取得されたデータを変更しただけなので、変更後のデータをデータベースに登録する必要がある。

最後に戻り値としてHttpResponseRedirectを返している。これはDjangoに特化したものではなく、HTTPでの処理の標準的な手筋。

動作確認

 

Django – render/redirect/HttpResponseなど

概要

ビュー関数/ビュークラスのメソッドはHttpResponseクラスやその派生クラスのインスタンスを戻り値として、テンプレートをレンダリングしたり指定したURLに遷移する。

この戻り値の与え方としては、HttpResponseやその派生クラスのインスタンスを直接与える方法と、django.shortcutsで定義された関数(render、 redirect)を使う方法がある。

HttpResponseはレスポンスボディ―を指定して表示。ショートカットのrenderは引数にテンプレートファイルを指定し、それを表示する。

URLを指定したリダイレクトには、HttpResponseRedirectやショートカットのrenderを使う。

レンダリング

HttpResponse

HttpResponsedjango.httpパッケージのモジュールで、ヘッダーや内容などを持つHTTPレスポンスのクラス。インスタンス生成時に引数にテキストを指定したテキストがレスポンスボディ―になり、直接表示される。

テキストのほか、イテレーターやファイルも指定できる。

render

renderdjango.shortcutsパッケージのモジュールで、指定したテンプレートファイルの内容をHttpRequestインスタンスとして返す。

テンプレートファイルに加えて、テンプレートに引き渡す変数コンテキストも指定できる。

リダイレクト

HttpResponseRedirect

HttpResponseRedirectdjango.httpパッケージのモジュールで、指定したURLに遷移するためのHTTPレスポンスのインスタンスを生成する。

HttpResponseRedirectHttpResponseRedirectBaseを継承し、HttpResponseRedirectBaseHttpResponseを継承している。

ビュー関数/メソッドの中で、URLを引数に与えてHttpResponseRedirectのインスタンスを生成し、戻り値にそのインスタンスを渡すことで、指定したURLにリダイレクトされる。

引数のURLは以下のように与えることができる。

  • ホスト名を含む絶対URL
  • アプリケーション名から始まるサブディレクトリーによる相対URL
  • urls.pypath関数で設定したルート名をreverse関数の引数に与えた戻り値(ルート名を直接与えることはできない)

redirect

redirectはdjango.shortcutsパッケージのモジュールで、指定したURLにリダイレクトするためのHTTPレスポンのためのスインスタンスを返す。

redirectは関数として定義され、デフォルトではHttpResponseRedirectのインスタンスを返すが、引数にpermanent=Trueを設定すると、HttpResponsePermanentRedirectのインスタンスを返す(このクラスは301ステータスを返す)。

redirectHttpResponseRedirectを返す際、resolve_url関数を介していて、reverse関数を使わず直接ルート名を渡すことができる。

 

Django – フォームデータ

概要

テンプレートのフォームで入力・送信されたデータをビューで受け取って処理する方法の基本。

ビュー関数/メソッドの引数(たとえばrequest)のPOST配列でフォームのINPUT要素のname属性値を指定して値を取得する。

request.POST['name属性値']

実装例

2つのページへのルーティング

urls.pyinputページとresultページへのルーティングを設定。inputページにフォームを置き、そこから送信されたデータをresultページで表示することとする。

DTLのurlタグを使うため、各ルートにname引数でルート名を付けている。

inputページのためのビュー

ルート名formtest:inputでルーティングされるview関数。単にinput.htmlテンプレートをレンダリングしている。

input.htmlテンプレート

input.htmlテンプレート。フォームには、textタイプのINPUT要素と、3つの選択肢を持つradioタイプのINPUT要素群が置かれている。

  • textタイプのINPUT要素のname属性はinput_test
  • radioタイプの3つのINPUT要素のname属性はradio_choiceで値はpinebambooplum

送信ボタンが押されると、methodで指定したURLに飛ぶが、ここではurls.pyで定義したformtest:resultに飛ぶようにDTLのurlタグを使っている。

resultビュー

フォームからの送信に対してviews.pyresult関数が呼ばれる。result.htmlテンプレートにcontext辞書を介して2つの変数input_textradio_choiceを渡している。

  • input_text変数には、name='input_text'で指定されたテキストの内容がrequest.POST['input_text']で取得されて代入される
  • radio_choice変数には、name='radio_choice'で指定されたラジオボタンのうち選択されたもののvalue値がrequest.POST[‘radio_choice’]で取得され、これに対応する文字列が代入される

result.htmlテンプレート

resultテンプレートでは、ビューのcontextで設定された変数の内容を表示する。

 

Django – DTL – URL

概要

urls.pyでURLパターンからビューへのルーティングを指定しただけの場合、テンプレートでそのルーティングを使うにはURLを直書きしなければならない。

これに対して、urls.pyのURLパターンを任意に変更しても影響が及ばないようにするには、DTLのurlタグを使う。

URLハードコーティングの場合

たとえばmyappアプリケーションのmainページからsubページへのリンクを貼りたいとする。

アプリケーションのurls.pyは以下のようになっているとする。

ルーティングされたビュー関数が以下のように書かれているとする。

レンダリングされるテンプレートでURLをハードコーティングした場合は以下のようになる。

main.html

sub.html

このときのURL指定と各ページの対応は以下のとおり。

  • [DOMAIN]/myapp/ → views.main → main.html
  • [DOMAIN]/myapp/sub → views.sub → sub.html

URLハードコーティングの問題

urls.py中のpath関数のURLのパターンを任意に変化させると、各テンプレート中のURLを全て見直さなければならない。これの影響を及ぼさせないようにしたい。

urls.pyでのname指定

urls.py中、抽象化したいpath関数にname引数を追加する。この場合はsubページへのpath関数を以下のように変更。

そして、subページへのURLの代わりにDTLのurlタグを使い、その引数にurls.pynameで指定した値を与える。

アプリケーションを指定する場合

異なるアプリケーションでnameに指定したい値が重複する場合、[app_name]:[path_name]で指定できるようにする。

path()関数でnameを指定する際、urls.pyの冒頭でapp_name変数にアプリケーション名の文字列を指定しておく。

そして、DTLのurlタグの引数にapp_nameで指定した値を加える。

まとめ

グローバルなパス名の場合

  1. urls.pypath関数にname引数でパス名を指定
  2. URLの代わりに{% url 'パス名' %}を指定

アプリケーションローカルなパス名の場合

  1. urls.pypath関数にname引数でパス名を指定
  2. urls.pyの冒頭でapp_name='アプリケーション名'を記述
  3. URLの代わりに{% url 'アプリケーション名:パス名' %}を指定

 

Django – クラスベースビューの基本

概要

Djangoのビューを実装するのに、関数で書く方法と、Viewクラスやその派生クラスを継承して必要なメソッドをオーバーライドする方法がある。

Djangoのオーソドックスな書き方ではクラスベースビューのListViewなどを利用し、コード量を減らすことが推奨されている。

ここでは関数による方法とViewクラスの継承クラスによる方法の2つを比較する。

基本形

テンプレートの準備

ビューからパラメーターを受け取り、単にそれを表示するテンプレートを準備する。ここではviewtestというアプリケーションを想定し、準備するテンプレートファイルはindex.htmlとする。

関数によるビューの実装

views.pyの記述

アプリケーションディレクトリー下のviews.pyファイルに、indexビューを関数で定義する。ビューではテンプレートに渡すパラメーターを文字列'Hello!'としている。

urls.pyの記述

アプリケーションのサブディレクトリーfunctionから、同じアプリケーションのindexビューへのルーティングを定義する。この例の場合localhost:8000/viewtest/functionのようにURLを指定し、ブラウザーでアクセスすることになる。

ここでサーバー起動状態でブラウザーに先のURLを指定すると、ブラウザーに以下のように表示される。

関数ビューの場合、GETを含むリクエストに対してurls.pyに従ってビューが呼び出され、その内容が実行される。

クラスベースビューによる実装

関数によるビューと同じ処理をクラスベースのビューで実装してみる。ここでは比較のために、関数ビューのコードを残してクラスベースビューのコードを追加していく。

views.pyの記述

クラスベースのビューは、Viewクラスやその派生クラス(ListViewなど)を継承し、getpostなどのリクエストに対応したメソッドを記述する。ここではGETリクエストにのみ反応させるため、getメソッドを実装している。

Viewクラスではgetメソッドは定義されていないが、Viewの派生クラスでGETメソッドでのリクエストがあるとViewクラスのhandlerが実行され、View.get()が実行される。そして派生クラスでget()を定義しているとこれがオーバーライドされたメソッドとして実行される。

参考:Django ViewではHttpメソッド名の関数を定義することができる

urls.pyの記述

クラスベースビューによるメソッドが呼び出されるようにアプリケーションのurls.pypath関数を追加する。

関数ベースの場合はpath関数の第2引数に関数表現のビューモジュールを指定したが、クラスベースの場合はIndexViewの親クラスViewas_view()メソッドを指定している。as_view()メソッドは内部関数view()を通してdispatchメソッドを返すので、結局パスが解決されるとdispatchメソッドが呼び出されることになる。

ここでサーバー起動状態でlocalhost:8000/viewtest/classなどとURLを指定すると、ブラウザーに以下のように表示される。

URLパラメーターを含む場合

関数によるビューの実装

urls.pyの記述

URLパラメーターを含む場合、URLパターンに型名やパラメーター名を入れる。

views.pyの記述

ルーティングで記述したパラメーター名をビュー関数の引数に指定し、これをテンプレートに渡す。

ここでサーバー起動状態でlocalhost:8000/viewtest/function/1などとURLを指定すると、ブラウザーに以下のように表示される。

クラスベースによる実装

urls.pyの記述

URLパターンにURLパラメーターを記述する方法は関数の場合と同じ。クラスベースビューの場合はas_viewメソッドの実行結果を渡す。

views.pyの記述

クラスベースビューの場合、getなどのメソッドの引数にパラメーターを指定する。引数の指定パターンは関数の場合と同じ。

ここでサーバー起動状態でlocalhost:8000/viewtest/class/2などとURLを指定すると、ブラウザーに以下のように表示される。

GET/POST処理

関数によるビューの実装

テンプレートの準備

GETで表示されるページにフォームを追加し、送信先をfunctionサブディレクトリー、メソッドをPOSTとする。

urls.pyの記述

今回のindexテンプレートはGET、POST両方のリクエストから呼び出されるため、functionサブディレクトリーのルーティング1つ。

views.pyの記述

リクエストメソッドの違いはrequest.methodの文字列で判定して処理を分ける。GETリクエストの場合は1つ目のifブロックが実行され、テンプレートに文字列'GET!'が渡される。またPOSTリクエストの場合は2つ目のifブロックが実行され、テンプレートには文字列'POST!'が渡される。

ここでサーバー起動状態でlocalhost:8000/viewtest/functionなどとURLを指定すると、views.index関数でGETに対応したifブロックが実行され、ブラウザーに以下のようにGET!と表示される。

このページで「送信」ボタンを押すと、今度はviews.index関数でPOSTに対応したifブロックが実行され、ブラウザーにPOST!と表示される。

クラスベースによる実装

テンプレートファイルの準備

POSTに対する処理を関数の場合と分けるため、送信先のURLのサブディレクトリーをclassとする。

urls.pyの記述

GET/POSTに関わらず、classサブディレクトリーでのリクエストを受け取った場合には、IndexViewクラス(のインスタンス)に処理を渡すように定義。

views.pyの記述

ルーティングで

ここでサーバー起動状態でlocalhost:8000/viewtest/classなどとURLを指定すると、views.IndexViewクラスでオーバーライドしたgetメソッドが実行され、ブラウザーに以下のように表示される。

このページで「送信」ボタンを押すと、今度はviews.IndexViewクラスでオーバーライドしたpostメソッドが実行され、ブラウザーに以下のように表示される。

クラスベースビューの基本のまとめ

要点

基本のクラスベースビューの要点は以下のとおり。

  • Viewクラスを継承したクラスを定義
  • GETやPOSTなどに対応したメソッドを定義
  • ルーティングでは、継承先のクラスの.as_view()メソッドを渡す

views.pyの記述

  • django.views.genericパッケージのViewモジュールをインポート
  • Viewクラスを継承したクラスを定義
  • getメソッド、postメソッドなどを定義
    • 第1引数はself
    • 第2引数はrequest
    • パラメーターがあればそれ以降
  • getメソッドの記述内容は、関数ベースの場合の内容と同じ
    • たとえばrender(request, 'target_page')

urls.pyの記述

  • urlpatterns属性のpath関数の第2引数でビュークラスを指定し、このときas_viewメソッドを指定する
    • たとえばpath('sub_dir', views_dir.MyViewClass.as_view())