この記事では、Django の URL マッピングと、URL リクエストとそれに対応する View をリンクさせる方法について詳しく学びます。
最初の記事で、チュートリアルの最後に入力した sayHello/ ページに Django Hello World を表示するために、具体的にどのように、何をしたかを理解します。
まずは Django の URL ライブラリを理解することから始めましょう。
Django URL ライブラリの基本
django.urls ライブラリには、私たちの Web アプリケーションで使う様々な関数があり ます。
それらについてもっと学びましょう。
1. path(route,view, kwargs, name)
この関数は、urlpatternsに含まれる必要がある要素を返します。
つまり、pathは要素(例えばView)とそのURLの間のリンクとして機能します。
- ルート
これは、特定のビューのURLです。
例えば: ‘/’ はルートです。
つまり、URLからこのページを要求すると、サーバーはそのページにリンクされたビューを返します。
- ビュー
ここでは、リンクする必要のあるビューの名前を記述する必要があります。
または、”include “関数を使って、別のurls.pyファイルを追加します。
- **3. **kwargs and *args
Pythonの関数定義におけるargsは、変数入力の引数リストとして使用される構文です。
アスタリスク1個で使用します。
例えば、ある関数に任意の数の引数を入力する必要がある場合、 *args を使用します。
例えば、次の例を見てみましょう。
def myFun( * args):
for arg in args:
print (arg)
myFun( "Hello" , "There" , "Hi" , "There" )
|
つまり、ここでは引数をいくつでも指定することができ、その引数をすべて取り込んでくれるのです。
argで引数をリストとして保存し、argsでargの行を使用することで、リストから各要素を取り出していると考えることができます。
このように、argsはリストとして、argはリストとして、それぞれ要素を与えています。
というわけで、上記のコードを実行すると、以下のようになります。
def myFun(**kwargs): for item,price in kwargs.items():
print(f"{item}={price}")
myFun(Book=100,Pen=10,Watch=4000) |
Pythonの関数定義におけるkwargsは、キーワードとなる変数引数のリストとして使用されます。
これはダブルアスタリスクで使われる。
つまり、例えば、ある関数に任意の数の引数(キーワード)を入力する必要がある場合は、 **kwargs を使用します。
例えば、key-wordedの意味を理解するために、次のような例を見てみましょう。
path( 'name/<int:id>' ,views.name_id,{ "foo" : "bar" })
|
上の例でわかるように、完全な値を渡すことができます。
変数名とその変数が持つ値を、代入演算子を使って渡しているのです。
引数はkwargsによってPythonの辞書として保存されていると考えることができます。
したがって、kwargs.items()の項目、価格の行を使って、項目(本、ペンなど)とその価格(100、10など)を取り上げているのです。
*** は、辞書を要素に分割します。
このように、key-wordの要素を個別に取得できるのが *kwargs であり、key-wordの要素を辞書として取得できるのが kwargs です。
path(‘ ’, sayHello, name = ‘sayHello’)
|
Django の path() では、URL ルートと一緒にビューにもっと情報を送る必要がある場合、 kwargs を使うことができます。
例えば
path(‘sayHello / ’,include(‘HellpWorldApp.urls’))
|
name/25 という URL を使って、 Django は views.name_id( request, id = 25, foo =’bar’) を呼び出します。
- 名前
Name は URL がリンクしている特定のビューの名前を指定するために使われます。
2. include(module,namespace=None)
この関数は、include 関数によってインクルードされるべき別の URL conf ファイルを受け取ります。
つまり、他のurls.pyファイルとリンクを形成するには、include関数を使用する必要があります。
名前空間は内部に記述することもできますが、今はその必要はありません。
Django で URL をビューにマップする方法?
path(‘sayHello/’, include(HelloWorldApp.urls)), |
ここでは、上で学んだ構文で path() 関数を使っています。
path(‘sayHello/’, sayHello, name = ‘sayHello’) |
ここで sayHello は views.py の関数ベースのビュー名です。
パスには空白文字列を指定し、ベースディレクトリ (私の場合は http://127.0.0.1:8000/) からビューに直接アクセスできるようにしています。
Django プロジェクトにおける URL マッピング
path(‘ ’, include(HelloWorldApp.urls)) |
path() 関数は、アプリに存在する urls.py ファイルに URL をリンクしています。
そのため、上で学習した構文で include() 関数が必要です。
例えば、ここでは
def Books(request):
return HttpResponse( "This is a books webpage" )
|
path と include 関数の他に、 re.path() と register_converter() 関数がありますが、 Python-Django のコースではあまり使うことはありません。
Note: project/urls.py で、私たちは次のように使いました。
path( 'Books/' , Books,name = 'Books' ),
|
ここで、app/urls.py で sayHello/ と書いても、project/urls.py で単に ‘ ‘ と書いても、動作は同じになります。
以下は実装例です。
apps/urls.pyです。
def BookID(request,bookid):
return HttpResponse(f "The book Id is:{bookid}" )
|
projects/urls.py:
path( 'Books/<int:bookid>' , BookID, name = 'BookID' ),
|
複数のViewを使用する場合は、この新しい方法を使用することが推奨されます。
したがって、今後は、エンドポイントを apps/urls.py に、’ ‘(ホストウェブサイトのリンク)を project/urls.py に保持することになります。
したがって、以下の画像のように変更することができます。
パスとインクルード関数についてわかったところで、1つ動かして複数のビューを作り、異なるエンドポイントにリンクさせましょう。
複数の View に対応する Django の URL マッピング
hello world の記事で行ったように、views.py にもう一つ View を追加していきます。
ビュー Book を作成しましょう。
コードを追加します。
新しいViewのために、別のエンドポイントを作成する必要があります。
apps/urls.py の中で、エンドポイント ‘ Books/’ のパスを追加するだけです。
では、サーバを起動して、ブラウザで確認してみましょう。
URL マッピング – 変数エンドポイント
本のIDをリクエストとして受け取り、単にIDを示す行を返すViewを作成してみましょう。
views.pyで、’Books/’のようなエンドポイントを持つ別のViewを作成しましょう。
ここでは、リクエストと一緒に本のIDを受け取り、その特定の本に特化したレスポンスを返します。
ここで、apps/urls.pyにエンドポイントを追加する必要があります。
ここでは、のような構文で記述します。
実行し、確認してみましょう。
ブラウザを起動して、127.0.0.1:8000/Books/1にアクセスしましょう。
他のランダムなBook IDを確認することもできます。
私たちのWebページが動作していることがわかります。
このように、上記の知識を使って、任意のViewをURLと対応付けることができます。
まとめ
というわけで、これで終わりです。
さて、次は Django のビューについて、そして views.py で実際に行ったことについて書く番です。
となります。