LoginSignup
2
1

More than 1 year has passed since last update.

Django + MySQLで開発をするときにやること

Last updated at Posted at 2022-11-13

はじめに

Djangoでwebアプリケーションの開発環境を作るときに毎度やるルーティンをいつでも見返せるように記します。著: 大高隆 動かして学ぶ! Python Django 開発入門を参考にしています。Djangoでアプリケーション開発を始めたい初心者向けです。

あくまでも素人が個人的に開発しているもののノートなので、セキュリティ上問題がある箇所があるかもしれません。自己責任でお願いします。

プロジェクトを作成する

django-admin startproject <プロジェクト名>

settings.pyを編集する

.envで環境変数を扱う

settings.pyにあるSECRET_KEYの文字列とmysql上でのユーザー名やパスワード等を.envファイルという環境変数を扱うファイルに書きます。

SECRET_KEY='django-insecure-0123456789qwertyuiop'

MYSQL_DATABASE='mysql'
MYSQL_USER='mysql'
MYSQL_PASSWORD='mysql'
MYSQL_HOST='mysql'

環境変数を読み込む

ここからがsettings.pyでの作業になります。
.envに書いた環境変数をsettings.py上でenvに読み込ませます。

import os, environ

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

env = environ.Env()
env.read_env(os.path.join(BASE_DIR,'.env'))

秘密鍵をenvで読み込ませます。これをしないとGithubに怒られます。

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env('SECRET_KEY')

ALLOWED_HOSTSを全て許可します。本番環境等では注意した方がいいかもしれません。

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']

データベースをMySQLに変更

envから環境変数を読み込ませて、パスワード等を安全に記述します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': env('MYSQL_DATABASE'),  # データベース名
        'USER': env('MYSQL_USER'),
        'PASSWORD': env('MYSQL_PASSWORD'),
        'HOST': env('MYSQL_HOST'),
        'PORT': '3306',
        'OPTIONS': {
            'charset': 'utf8mb4',  # 文字コード
        },
    }
}

言語とタイムゾーンを日本仕様に変更

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_TZ = True

ロギングを設定

著: 大高隆 動かして学ぶ! Python Django 開発入門を引用

# ロギング設定
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,

    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'INFO',
        },
        'game': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    },

    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'dev',
        },
    },

    'formatters': {
        'dev': {
            'format': '\t'.join([
                '%(asctime)s',
                '[%(levelname)s]',
                '%(pathname)s(Line:%(lineno)d)',
                '%(message)s',
            ])
        },
    }
}

静的ファイル(static)が配置されている場所を設定

staticとは画像やcssです。javascriptとかもここに配置かも。

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

セッション変数を設定

セッション変数を使うと別々のテンプレート(htmlファイル)やview間でも変数をやり取りすることができます。セッション変数は辞書型(連想配列)です。

# セッションをキャッシュで保存する
SESSION_ENGINE = "django.contrib.sessions.backends.cache"

# 画面を閉じたらセッションが失効する
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

SESSION_SAVE_EVERY_REQUEST = True

docker-composeで環境構築

開発メンバーが簡単に環境構築できるようにするため、docker-composeで環境構築をします。

Dockerfileの作成

これをそのまま引用してきました。

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/

docker-compose.ymlの作成

Django + MySQLの環境を作ります。文字コードをutf8mb4に command や volumes を記述していますが、不要な方は適宜削除してください。また、.envファイルで記述した環境変数をこちらでも${MYSQL_USER}のように読み込んでいます。

version: "3"

services:
  db:
    image: mysql
    restart: always
    hostname: mysql
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    # データベースの文字コードを utf8mb4 に変更
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./my.cnf:/etc/my.cnf

  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

requirements.txtの作成

必要な任意のライブラリを記述しましょう。

Django
mysqlclient
django-environ
requests
numpy
matplotlib
environ
pandas

my.cnfの作成 (任意)

もしMySQLでの文字コードに不具合がある方はこのようにmy.cnfを編集・作成してみてください。

[mysqld]
character-set-server=utf8mb4

skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8mb4
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

アプリケーションを追加する

アプリケーションを以下のように追加した後にやることを記します。今回はgameというアプリケーション名という体で進めます。

python manage.py startapp <アプリケーション名>

settingsにアプリケーションを追加する

<プロジェクト名>/settings.pyに追加したアプリケーションを記述します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'game.apps.GameConfig',  # こちらを追加
]

ルーティングを設定

まずは<プロジェクト名>下にあるurls.pyに以下のように記述する。

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('game.urls'))  # 追加したアプリケーションを記述
]

次に、game(アプリケーション名)下にurls.pyを作成し、以下のように記述する。

from django.urls import path

from . import views


app_name = 'game'
urlpatterns = [
    path('', views.IndexView.as_view(), name="index")
]

ビューを作成

views.pyにはサーバー側(?)でやりたい操作を記述します。ここが脳みたいなところと思っています。

from django.views import generic


class IndexView(generic.TemplateView):
    template_name = "index.html"

テンプレートを作成

game(アプリケーション名)下にtemplatesというディレクトリを作成し、そこにテンプレート(htmlファイル)を置いていく。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>トップページ</title>
</head>

<body>
    hello world!
<body
</html>

docker-composeを動かしてみる

まずbuildします。

docker-compose build

次にupします。

docker-compose up

もしうまくいかない場合はデータベース側のコンテナを先に立ち上げてからweb側のコンテナを立ち上げると良いかもです。

docker-compose up -d db
docker-compose up

うまくいくとターミナル上にhttp://0.0.0.0:8000/が現れると思うので、それをブラウザに貼り付けてください。ブラウザに貼り付けた後にダメだった人はhttp://localhost:8000/でうまくいけるかもしれません。ブラウザ上にhello worldと出ていれば成功です。

おわりに

私は就活中(2022/11/13)ですが、webアプリケーション開発の経験が少しでもあると、インターンの選考等でかなり有利になると思いました。お時間のある時にぜひ、始めてみてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1