Django

【Djangoで開発(1)】環境構築〜Hello World

ゴールの確認

以下は最終的なディレクトリ構造です。

.
└── code
    ├── .venv
    # 生成したプロジェクト
    ├── config
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    # 生成したアプリケーション
    ├── api_tweet
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── apps.py
    │   ├── migrations
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── .env
    ├── .gitignore
    ├── Pipfile
    ├── Pipfile.lock
    └── manage.py

環境構築〜Hello World

pipenv環境構築とライブラリのインストール

まずは、pipenvを用いて仮想環境を構築していきます。構築した仮想環境内に開発で使うライブラリをインストールします。

$ pipenv --python=3.7

$ pipenv install\
django==2.1\
mysqlclient\
gunicorn

requirements.txtを作成

$ pipenv lock -r > requirements.txt

.gitignoreを作成

次にgitの管理対象から外すファイル・フォルダを指定します。

$ touch .gitignore

.venv
__pycache__/

Pipfileにコマンドを追加

Pipfileの[scripts]に以下のように定義することで、短いコマンドを指定できます。

[scripts]
server = "python manage.py runserver"
shell = "python manage.py shell"
makemigrations = "python manage.py makemigrations"
sqlmigrate = "python manage.py sqlmigrate"
migrate = "python manage.py migrate"
showmigrations = "python manage.py showmigrations"
check = "python manage.py check"
createsuperuser = "python manage.py createsuperuser"
wsgi = "gunicorn config.wsgi:application"

プロジェクトを作成

$ pipenv run django-admin startproject config .

アプリケーションを作成

$ pipenv run django-admin startapp api_tweet

HTMLファイルを作成

作成したアプリケーションの中にtemplatesディレクトリを作成し、ここをHTMLファイルの置き場所にします。

$ mkdir api_tweet/templates

$ touch templates/api_tweet/index.html

サンプルのHTMLファイルを用意しておきます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>Hello World</h1>
</body>
</html>

作成したアプリケーションの読み込みを定義

INSTALLED_APPS = [
    'api_tweet',  # 追加
    ・・・
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],  # 編集
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

TEMPLATESの内容は?

ここにはDjangoがどのようにテンプレートを読み込むかが書かれている、
という認識で大丈夫です。

‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]
→templatesディレクトリ内を探すよう指示している

‘APP_DIRS’: True
→INSTALLED_APPSに記述してあるアプリケーションのそれぞれのtemplatesを探しにいく

なぜ、templatesディレクトリ内にアプリケーション名のディレクトリを記述するのか?

簡単にいうと、上で説明した設定ファイルの記述だけだと、Djangoが全てのアプリケーション内のtemplatesディレクトリ内を順に探してしまいます。

(なぜなら、templates/内を探せ、と言われてるから。)

これでは、効率が悪いので、指定するために、templatesディレクトリ内にアプリケーション名のディレクトリを作成しています。
こうすることで、Djangoは直接、templates/[アプリケーション名]/というディレクトリを探しにいけます。

僕も、完全に理解したわけではないのですが、こんな感じの理解でやっています。
わからなければ、ふーん、でいいと思います!

HelloWorldまで、もう一息です!

ルーティングをアプリケーションごとに管理

urls.pyは、startprojectコマンドを実行した際にconfig直下に生成されています。これとは別にアプリケーション直下にもurls.pyを作成します。

$ touch api_tweet/urls.py

読み込みの流れは、
リクエスト→config/urls.py→[ アプリケーション名 ]/urls.py
という感じです。

config/urls.py

from django.contrib import admin
from django.urls import path, include # 追加

urlpatterns = [
    # 第一引数で指定した文字列を第二引数で指定したファイルへ渡す
    path("", include("api_tweet.urls")),
    path("api_tweet/", include("api_tweet.urls")),
    # 管理画面
    path("admin/", admin.site.urls),
]

api_tweet/urls.py

from django.urls import path
from . import views

app_name = "[アプリケーション名]"  # 名前空間(tempates/[アプリケーション名]/index.html)
urlpatterns = [
    path("", views.index, name="index")
]

リクエスト時の処理を作成

実際にユーザーからリクエストされてからの流れは、
リクエスト→何らかの処理→HTMLを返す
のように想定します。

from django.shortcuts import render

def index(request):
    return render(request, "api_tweet/index.html")

CSSを適用する

$ mkdir static static/css

$ touch static/css/style.css

staticディレクトリの場所を指定する記述を追加します。

# staticディレクトリの場所
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, '../static')
]

最後にHTMLを編集します。

{% load static %} <!-- 追加 -->

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="{% static 'css/style.css' %}"> <!-- 追加 -->
    <title>シフト管理</title>
</head>

<body>
    <h1>トップページ</h1>
</body>

</html>

お疲れ様でした、これでコーディングは終了です。

あとは、以下のコマンドでサーバーを起動して、localhost:8000にHello Worldと表示されれば成功です!

$ pipenv run python manage.py runserver

データベースとの接続

MySQL内にデータベースを作成

$ mysql -u root

> create database [ データベース名(プロジェクト名) ];

config/settings.py

DB_NAME=[ プロジェクト名 ]
DB_USERNAME=root
DB_PASSWORD=

接続するデータベースをMySQLに変更し、

import os
env = os.environ

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': env['DB_NAME'],
        'USER': env['DB_USERNAME'],
        'PASSWORD': env['DB_PASSWORD']
    }
}

ALLOWED_HOSTS = ['*']

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

マイグレーションを実行

$ pipenv run python3 manage.py migrate

COMMENT

メールアドレスが公開されることはありません。