Djangoプロジェクトのデフォルト設定をカスタムしよう！


# 経緯
pythonのwebフレームワークであるDjangoの標準設定を毎度変更するのに飽きたのでshellスクリプトで実行してもらうべく作った内容の覚書です。


## 実行環境
実行環境は以下のとおりです。
- OS：
    - Mac
- installed lib：
    - pip
    - venv

ただタイムゾーンや言語設定を変えるだけだと面白くないので、Djangoでもホットリロード機能を使ってサクサク開発できるようにdjango-livereload-serverライブラリを追加設定しています。
使い方や詳細については下記リンクを確認してください。
[django-livereload-server (GitHub Link)](https://github.com/tjwalch/django-livereload-server,"リンク")
[How to use django-livereload-server (Youtube Link)](https://youtu.be/d00MOk5kt4I, "youtube Link")


## コード
```shell: setupCustomDjango.sh (ターミナル)

#! /bin/bash

echo "プロジェクト名を指定してください :"
read project_name

# 定数に入替
readonly PROJECT_NAME=$project_name
# 実行環境の名前を取得 macの場合はDarwinが戻り値
current_os_name=`uname`
mac_name=Darwin

if [ $current_os_name != $mac_name ]; then
    echo "MacOS以外です"
    exit 0
else
    # echo "Mac環境下での実行内容"
    python -m venv venv
    source venv/bin/activate
    django-admin startproject $PROJECT_NAME
    cd $PROJECT_NAME
    pip install --upgrade pip
    echo \n
    pip install django
    echo \n
    
    # hot reloadのライブラリ
    pip install django-livereload-server

    echo "venv\\nstatic\\n${PROJECT_NAME}/__pycache__" > .gitignore
    # pip list

    pip freeze > requirements.txt
fi

cd $PROJECT_NAME
fileName="settings" 
function replaceStringFunc()
{
    local readonly TMP_TYPE="tmp"
    local readonly TARGET_TYPE="py"

    if [ $4 = "lang" ] || [ $4 = "tz" ];then
        sed -e "s/$1/$2/" $3.$TARGET_TYPE > $3.$TMP_TYPE

    elif [ $4 = "apps" ];then
        # livereloadは置換対象の前に追記すること
        sed -e "s/$1/$2\\n    $1/" $3.$TARGET_TYPE > $3.$TMP_TYPE
    
    elif [ $4 = "middleware" ];then
        sed -e "s/$1/$1\\n    $2/" $3.$TARGET_TYPE > $3.$TMP_TYPE
    fi

    # ファイル削除
    rm $3.$TARGET_TYPE

    # ファイルの拡張子書き換え
    mv $3.$TMP_TYPE $3.$TARGET_TYPE
}


# ============================
# 言語設定を英語から日本語に変更
rep1before="en-us"
rep1after="ja"
targetContent="lang"

replaceStringFunc $rep1before $rep1after $fileName $targetContent
# ============================


# ============================
# タイムゾーンをアメリカから東京に変更
rep2before="UTC"
rep2after="Asia\/Tokyo"
targetContent="tz"

replaceStringFunc $rep2before $rep2after $fileName $targetContent
# ============================


# ============================
# INSTALLED_APPSのstaticfilesの項目の直前に追加
rep3before='\"django.contrib.staticfiles\"'
rep3after='\"livereload\"\,'
targetContent="apps"

replaceStringFunc $rep3before $rep3after $fileName $targetContent
# ============================

# ============================
# MIDDLEWAREに追加
rep4before='\"django.middleware.clickjacking\.XFrameOptionsMiddleware\"\,'
rep4after='\"livereload.middleware.LiveReloadScript\"\,'
targetContent="middleware"

replaceStringFunc $rep4before $rep4after $fileName $targetContent
# ============================


echo "
下記の順番でターミナルを2つ立てて実行してください

============================
※まず仮想環境を立ててプロジェクトフォルダに入ってください
source venv/bin/activate
cd ${PROJECT_NAME}

※ホットリロードライブラリを起動させてください
python manage.py livereload


※ このコマンドは別のターミナルを立ててください
cd ${PROJECT_NAME}
python manage.py runserver
============================
"

# if文の記述方法
# https://tex2e.github.io/blog/shell/bash-and-or


```


あとはこのファイルをターミナルで実行するだけです
```shell:ターミナル
sh setupCustomDjango.sh
```
プロジェクト名を聞かれるのでターミナルで入力しましょう。

envに関する設定も初期設定でできるといいなとも思うので、それも時間があればいつか追記したいと思います。

作ったプロジェクトでのhot reloadを実感するには他にも追加しないといけないファイル(templatesにhtmlだったり、urls.pyやviews.pyの変更とか)があったりしますが、そこは飛ばしてます。
希望があればまた今度。


お疲れ様でした。