CLOVER🍀

That was when it all began.

はじめてのDjango

ちょっと、PythonでWebアプリケーションを書いてみようと思いまして。

Djangoというのが割とメジャーなようなので、少し試してみたいと思います。

Django?

Pythonで書かれた、フルスタックなWebアプリケーションフレームワークだそうです。

The Web framework for perfectionists with deadlines | Django

現在のバージョンは、2.2です。

Djangoとは?ということで、Overview。

Django overview | Django

  • 早く作れる
  • 多くの機能がある
  • セキュア
  • スケーラブル
  • 広い用途に使える

というようなことが謳われています。

ドキュメントは、こちら。

Django documentation | Django documentation | Django

日本語訳も行われているようです(一部、英語のままのものもあったりしますが)。

Django ドキュメント | Django ドキュメント | Django

とりあえず、簡単にGetting Started的な感じでやってみましょう。

今回はデータベースも使わず、リクエストを受け付けて、単純なテンプレートから返すだけのアプリケーションを作成してみたいと
思います。

環境

今回の環境は、こちら。

$ python3 -V
Python 3.6.7

インストールとプロジェクトの構築

まずは、Djangoをインストールします。

$ pip3 install Django

インストールされたバージョン。

Django==2.2

こちらに沿って、進めていってみましょう。

はじめての Django アプリ作成、その 1 | Django ドキュメント | Django

Djangoのモジュールが認識されていることを、確認してみます。

$ python3 -m django --version
2.2

プロジェクトとアプリケーションを作成します。今回は、それぞれ「mysite」と「myapp」としました。

$ django-admin startproject mysite
$ cd mysite
$ django-admin startapp myapp

アプリケーションを作成したら、プロジェクトのsettings.pyの「INSTALLED_APPS」に追加します。
mysite/settings.py

INSTALLED_APPS = [
    'myapp.apps.MyappConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

また、プロジェクトのurls.pyに、アプリケーションのurlsをincludeします。ここでincludeしているurls.pyは、後ほど作成します。 mysite/urls.py

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

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

アプリケーションの中身を作る

それでは、アプリケーションの中身を書いていきます。ここでの内容は、チュートリアルの以下の2ページを見て作成しました。

はじめての Django アプリ作成、その 1 | Django ドキュメント | Django

はじめての Django アプリ作成、その 3 | Django ドキュメント | Django

最初に、リクエストを受け取るViewを作成します。
myapp/views.py

from django.shortcuts import render
from django.template import loader

# Create your views here.
def books(request):
    context = {
        "books": [
            {
                "isbn": "978-4873117386",
                "title": "入門 Python 3",
                "price": 3996,
            },
            {
                "isbn": "978-4797389463",
                "title": "みんなのPython 第4版",
                "price": 2916,
            },
            {
                "isbn": "978-4800711670",
                "title": "詳細! Python 3 入門ノート",
                "price": 2894,
            }
        ]
    }

    return render(request, "myapp/books.html", context)

書籍のデータをテンプレートに渡すようにしましょう。

テンプレートは、こんな感じで簡単に。
myapp/templates/myapp/books.html

<h1>書籍一覧</h1>
<ul>
{% for book in books %}
    <li>{{ book.isbn }}: {{ book.title }} {{ book.price }}</li>
{% endfor %}
</ul>

テンプレートの書き方は、こちらを。Djangoのテンプレートらしいです。

The Django Template Language | Django ドキュメント | Django

forなどは、タグとして利用しているそうです。

タグ

Djangoのテンプレート以外にも、Jinja2を使うこともできるそうな。

テンプレート | Django ドキュメント | Django

あとは、このアプリケーションで使えるURLを定義します。mysite側でincludeしていたのは、この内容になります。
myapp/urls.py

from django.urls import path

from . import views

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

確認

開発サーバーを起動して確認してみましょう。

$ python3 manage.py runserver

確認。

$ curl localhost:8000/myapp/books
<h1>書籍一覧</h1>
<ul>

    <li>978-4873117386: 入門 Python 3 3996</li>

    <li>978-4797389463: みんなのPython 第4版 2916</li>

    <li>978-4800711670: 詳細! Python 3 入門ノート 2894</li>

</ul>

動きました!

けっこう手こずったのですが、とりあえず目標到達。

ハマったこと。

  • 「django-admin startapp」を実行する前に、ディレクトリを移るのを忘れる
  • プロジェクトの「settings.py」の「INSTALLED_APPS」に、作成したアプリケーションを追加するのを忘れる