ホーム >  Python > Django >  Djangoのルーティング

投稿日:   |  最終更新日:

Djangoのルーティング

DjangoPython

Django1.11.3環境でルーティングを使用します。

ルーティング

ルーティングは、リクエストをされたURLと処理するコードを対応付ける仕組みです。例えば、「http://127.0.0.1:8000」というURLにアクセスがあった場合、それを処理するための関数・メソッドを呼び出す仕組みをルーティングと呼びます。Djangoでは、特定のURLのパターンに対して、任意のビューをマッピングできます。

設定方法

ルーティングの設定を行うには、プロジェクトのurls.pyにあるurlpatternsにURLのパターンを記述します。アプリケーションを増やすには、この「urlpatterns」に追記します。また、URLのパターンは正規表現を用いて記述可能です。

urlpatterns

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^hello/', views.hello, name='hello'),
]

url()関数

urlパターンは、url()関数を使用して定義します。

url(regex, view, kwargs=None, name=None)
regex URLパターンを表す正規表現。定義されたリストの先頭からURLが正規表現にマッチするかチェックします。URLが複数のurlにマッチする場合は、urlpatternsの前にあるurlのビューにマッチします。
view 対応するビューを記述します。URLが正義表現にマッチした場合、ここで指定されたビューが呼び出されます。
kwargs オプション引数です。辞書を用いて任意の引数をビューに渡します。
name オプション引数です。このURLパターンの名前を指定します。名前を付けておくことで、逆にビューやテンプレートから参照できます。

環境

OS CentOS 7.1.1503
pyenv 1.1.3-5-g7dae197
Anaconda 3-4.3.0
MariaDB 5.5.52-1.el7
Apache 2.4.6
mod_wsgi 4.5.14
Django 1.11.3

URLキャプチャ

URLから正規表現を用いて、任意の値を取得することをURLキャプチャと呼びます。URLの設計によっては、「post?post_id=1」のようにクエリパラメータを使用せずに「post/1/」のようにURLのパスから数値や文字列を取得したい場合があります。

①以下のようなDjangoアプリ構成を作ります。プロジェクト名が「pj1」で、アプリケーション名が「item」です。プロジェクトの設定は済ませたものとします。

  • pj1/
  • pj1/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • item/
  • __init__.py
  • admin.py
  • apps.py
  • urls.py
  • urls.py
  • views.py
  • __pycache__/
  • migrations/
  • templates/
  • __init__.py
  • models.py
  • views.py
  • manage.py

②URLキャプチャを利用して、値を取得します。url()関数の第一引数であるregexを以下のように記載すると、URLのパスに含まれる値をビュー関数内で取得できます。itemディレクトリ配下のurls.pyを編集します。

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^hello/', views.hello, name='hello'),

    #①/post/以下に数字が渡された場合にマッチ
    url(r'^post/(?P<post_id>\d+)/$', views.post, name='post'),
    #②/news/以下に文字列が渡された場合にマッチ
    url(r'^news/(?P<slug>[-\w]+)/$', views.news, name='news'),
]
url(r'^post/(?P<post_id>\d+)/$', views.post, name='post')

#①は、正規表現のパターンを丸括弧で囲みます。そのパターンにpost_idという名前をつけています。

url(r'^news/(?P<slug>[-\w]+)/$', views.news, name='news'),

#②は、パターンにslugという名前をつけています。URLがパターンにマッチした場合、マッチしたテキストがキャプチャ(補足)され、ビュー関数の引数として渡されます。

「\(バックスラッシュ)」になっているところは、「\」を入力します。英語圏で “\” と表現される文字は、 ASCIIコードで ‘\x5c’ですが、日本のJISコードで ‘\x5c’ は “¥” です。内部的には同じ文字として扱われます。

③itemディレクトリ配下のviews.pyを以下のように編集します。

from django.http import HttpResponse

def post(request, post_id):
    return HttpResponse('post_idは={0}です。'.format(post_id))

def news(request, slug):
    return HttpResponse('slugは={0}です。'.format(slug))

④#①の動作確認をします。Djangoのwebサーバーを起動して、webブラウザから以下のURLにアクセスします。

http://ローカルのipアドレス/item/post/1/

URLに含まれる「1」をビュー関数「def post(request, post_id)」の引数として取得しています。

⑤#①の動作確認をします。Djangoのwebサーバーを起動して、webブラウザから以下のURLにアクセスします。

http://ローカルのipアドレス/item/news/slug/

URLに含まれる「slug」をビュー関数「def news(request, slug)」の引数として取得しています。

トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告