Djangoのビューの扱い方とパスの通し方(views.pyとurls.py)

Djangoのアプリケーションを作成すると views.py というファイルができます。

見た目を調整するためのファイルですね。まずこれをいじります。それからurls.pyでブラウザからアクセスできるようにルーティングします。

アプリケーションの生成方法についてはこちら↓

https://hodalog.com/how-to-start-python-django/

ちなみに次のようなディレクトリ構成のプロジェクトで進めます。

hello
├── hello # <- プロジェクト
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── hello_app # <- アプリケーション
│   ├── __init__.py
│   ├── __pycache__
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── manage.py

views.pyにページを書く

views.pyの初期状態は次のようになっています。

from django.shortcuts import render

# Create your views here.

ご丁寧にviewはここに作れ、って書いてありますね。1行目はrender関数を使えるようにする記述です。

適当にいじってみます。

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hi Django~!!")

2行目にHttpResponseクラスを追加するためのimport文。Webアプリケーションにアクセスしたユーザー(クライアント)にレスポンスを返すためのクラスですね。次に定義しているindex関数でレスポンスの内容を指定しています。

プロジェクト側のurls.pyでルーティングする

urls.pyというファイルがアプリケーション側ではなくプロジェクト側のディレクトリにありますが、このファイルでURLを設定します。

次のコードはデフォルトのファイルにhello_app/へのpathを追記したものです。

from django.contrib import admin
from django.urls import path
import hello_app.views as hello

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', hello.index),
]

1行目と2行目にあるimport文はpathを通したり管理画面(admin画面)を使えるようにするためのものですね。

3行目でhello_appディレクトリのviewファイルをhelloという名前でインポートしています。

ここで urlpatterns という配列にpathを追記するとurlが叩けるようになるみたいです。

path('hello_app/', hello_app.index)

↑これでhello_app/にアクセスした時、hello_appのviews.pyに記述したindex関数を呼び出します。

ちなみに↓これは管理画面へのpathを通してます。

path('admin/', admin.site.urls)

アプリケーションへのアクセス

Webサーバーを起動します。

python manage.py runserver 0:8000
#Port番号を指定しているが、これは環境による。

ブラウザからアクセスしてみると「Hi Django~!!」と出力されます。

Djangoのviews.pyとurls.pyをいじって「Hi django」と表示させる

ちなみにadmin/へアクセスすると、管理画面のログインページが表示されます。

Djangoの管理画面のログインページ

アプリケーションディレクトリの中にurls.pyを用意する

プロジェクトディレクトリに置かれているurls.pyを使ってルーティングしましたが、この方法はとても大変です。アプリケーションを追加するたびにpathを追記する必要があるため、いろんなアプリケーションのpathがごちゃ混ぜになってしまいます。

そこで、アプリケーションごとにurls.pyを用意する手法を採用します。

アプリケーションディレクトリにurls.pyを作成し、次のコードを入れてみます。

from django.urls import path
from . import views # <- urls.pyが置かれているディレクトリからviews.pyをインポート

urlpatterns = [
    path('', views.index, name='index'),
]

from . import views でurls.pyが置かれているディレクトリからviews.pyをインポート、 path('', views.index, name='index'), で hello/indexまたはhello/と叩いた時にviewsのindex関数が呼ばれるようにパスを通しています。

次にプロジェクト側のurls.pyのコードを下記のようにします。

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', include('hello_app.urls')),
]

2行目のimport文でincludeを使えるようにし、 include('hello_app.urls') でhello_appディレクトリにあるurls.pyを読んでいます。

この方法でも同じようにブラウザからアクセスできるはずです。

まとめ

ビューの扱い方とパスの通し方についてまとめました。やったね!urls.pyには2通りの書き方がありますが、大きなプロジェクトになるほど、アプリケーションごとにurls.pyを用意するやり方が、使いやすいでしょうね。