Djangoアプリ作成

Djangoのインストールと基本的なDjangoアプリを作成するスクリプトです。
# 前準備
スクリプトを実行するために必要な環境を準備します。
pythonのpip,venvをインストールします。
sudoが使えない場合は、以下のコマンドでsudoに追加後、一度、ログアウト/ログインして下さい。
```
su -
apt install sudo
usermod -aG sudo user_name
```
```
sudo apt install python3-pip
sudo apt install python3-venv
```
sudo権限を削除する場合
```
sudo deluser user_name sudo
```
以下のスクリプトは、インストールスクリプトが動作できるかを確認するスクリプトです。
このスクリプトを実行して、install OKになるか確認して下さい。
```bash:check.sh
result=0
echo "インストールチェック"
echo "pythonチェック"
python3 --version &> /dev/null
if [ $? -ne 0 ] ; then
    echo "python3 NG"
    result=-1
else
    echo "python3 OK"
    echo "pipチェック"
    pip3 -V &> /dev/null
    if [ $? -ne 0 ] ; then
        echo "pip3    NG"
        result=-1
    else
        echo "pip3    OK"
    fi
    echo "venvチェック"
    python3 -m venv myvenv &> /dev/null
    if [ $? -ne 0 ] ; then
        echo "venv    NG"
        result=-1
    else
        echo "venv    OK"
    fi
    rm -rf myvenv 
    echo "sudoチェック"
    str=`getent group sudo`
    substr=`whoami`
    if [[ "$str" =~ .*"$substr".* ]]; then
        echo "sudo    OK"
    else
        echo "sudo    NG"
        result=-1
    fi
    if [ $result -ne 0 ] ; then
        echo "install NG"
    else
        echo "install OK"
    fi
fi
```
# Python仮想環境作成
Djangoをインストールするための仮想環境を作成します。
仮想環境フォルダ名は、myvenvとしています。
```
python3 -m venv myvenv
```
# Djangoインストールと設定
仮想環境を有効にして、Djangoをインストールして、プロジェクトを作成します。
```
. myvenv/bin/activate
python3 -m pip install django
django-admin startproject mysite .
```
settings.pyを修正します。
ALLOWED_HOSTSを'*'にすることで、すべてのサーバのアドレスでリクエストを受け付けます。
LANGUAGE_CODEを'ja'にすることで、環境が日本語になります。管理画面も日本語に変わります。
TIME_ZONEを'Asia/Tokyo'にします。
STATIC_ROOT = BASE_DIR / 'static'を追加します。
`python3 manage.py collectstatic`を実行した際にSTATIC_ROOTで指定したフォルダにstaticファイルがコピーされます。
BASE_DIRは、`BASE_DIR = Path(__file__).resolve().parent.parent`となっているので、settings.pyの親ディレクトリ（manage.pyが在るディレクトリ）です。
```
cd mysite
sed -i -e "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = \['*'\]/" settings.py
sed -i -e "s/LANGUAGE_CODE = 'en-us'/LANGUAGE_CODE = 'ja'/" settings.py
sed -i -e "s/TIME_ZONE = 'UTC'/TIME_ZONE = 'Asia\/Tokyo'/" settings.py
sed -i -e "s/STATIC_URL = 'static\/'/STATIC_URL = '\/static\/'\nSTATIC_ROOT = BASE_DIR \/ 'static'/" settings.py
cd ..
python3 manage.py migrate
```
# Djangoアプリ作成と設定
Djangoアプリを作成します。
YOUR-APP：このアプリの名前
作成後、mysiteフォルダのsettings.pyのINSTALLED_APPSにアプリを追加します。
YOUR-APPをsnake_caseからUpperCamelCaseに変換して、追加します。
最初のsedで先頭の文字を大文字に変換、次のsedで_の次の文字を大文字に変換、最後のsedで_を削除。
```
python3 manage.py startapp YOUR-APP
cd mysite
model_name=`echo YOUR-APP | sed "s/\(.\)/\U\1/" | sed "s/\(_.\)/\U\1/g" | sed "s/_//g"`
sed -i -e "s/INSTALLED_APPS = \[/INSTALLED_APPS = \[\n    'YOUR-APP.apps.${model_name}Config',/" settings.py
cd ..
```
Djangoにモデルの変更があったことを伝え、保存します。
```
python3 manage.py makemigrations YOUR-APP
python3 manage.py migrate YOUR-APP
```
# Adminユーザ作成
管理者ユーザー作成しておきます。
```
python3 manage.py createsuperuser
```
# urls.py作成
mysiteフォルダのurls.pyに```from django.urls import path```を追加します。
urls.pyのurlpatternsにpath('', include('YOUR-APP.urls'))を追加します。
YOUR-APP：このアプリの名前
```
cd mysite
sed -i -e "s/from django.urls import path/from django.urls import path, include/" urls.py
sed -i -e "s/urlpatterns = \[/urlpatterns = \[\n    path('', include('$2.urls')),/" urls.py
```
YOUR-APPフォルダにurls.pyを作成しします。
```
cd ../YOUR-APP
touch urls.py
```
urls.pyに以下のプログラムを追加します。
```python:urls.py
from django.urls import path
from . import views"
urlpatterns = [
    path('', views.index, name='index'),
]
```
# views.py作成
views.pyに関数indexを追加します。
テンプレートに'YOUR-APP is installed'を引き渡します。
```python:views.py
def index(request):
    content = 'YOUR-APP is installed'
    return render(request, '$2/index.html', {'content': content})
```
# テンプレート作成
テンプレートフォルダを作成し、テンプレートフォルダの中にYOUR-APPフォルダを作成します。
YOUR-APPフォルダにindex.htmlファイルを作成します。
```
mkdir templates
cd templates
mkdir YOUR-APP
cd YOUR-APP
touch index.html
```
index.htmlに以下のコードを追加します。
```html:index.html
{% load static %}
<html>
<head>
<link rel=\"stylesheet\" href=\"{% static 'css/YOUR-APP.css' %}\">
</head>
<body>
<p>{{ content }}</p>
</body>
</html>
```
# CSS作成
ディレクトリを２つ上がり、スタティックフォルダを作成し、スタティックフォルダにcssフォルダを作成します。
cssフォルダにYOUR-APP.cssファイルを作成します。
```
cd ..
cd ..
mkdir static
cd static
mkdir css
cd css
touch YOUR-APP.css
```
YOUR-APP.cssに以下のコードを追加します。
```YOUR-APP.css
p {
    color: red;
}
```
# requirements.txtの作成
ディレクトリを３つ上がり、manage.pyがあるディレクトリにrequirements.txtを作成します。
作成は、任意です。
本番サイトで、同じバージョンのDjangoをインストールする際に使用します。
```
cd ..
cd ..
cd ..
pip freeze > requirements.txt
```
# .gitignoreの作成
gitで無視させるためのファイルを作成します。
```
touch .gitignore
```
.gitignoreに以下のコードを追加します。
必要に応じて、追加・削除してください。
```.gitignore
*.pyc
*~
/.vscode
__pycache__
myvenv
db.sqlite3
/static
.DS_Store
```
# スクリプト
`. install.sh PROJECT YOUR-APP`を実行すると
PROJECTフォルダを作成し、その中にPythonの仮想環境の作成とDjangoのインストールを行います。
サンプル用のYOUR-APPアプリを作成し、サンプル用のテンプレートとCSSを作成します。
OSは、日本語環境で使用してください。
英語環境で実行すると、途中で管理者ユーザーを作成する際に文字化けします。
```bash:install.sh
if [ $# -ne 2 ];then
    echo "Usage: $0 PROJECT YOUR-APP"
else
    x=`echo $1 | tr -d "[a-z][A-Z][0-9]_-"`
    if [ -n "$x" ]; then
        echo "Usage: $0 PROJECT YOUR-APP"
        echo "PROJECTには[a-z][A-Z][0-9]_-だけ使えます。"
    else
        y=`echo $2 | tr -d "[a-z]_"`
        if [ -n "$y" ]; then
            echo "Usage: $0 PROJECT YOUR-APP"
            echo "YOUR-APPには[a-z]_だけ使えます。"
        else
        mkdir $1
        cd $1
        echo "仮想環境作成"
        python3 -m venv myvenv
        echo "Django インストール"
        . myvenv/bin/activate
        python3 -m pip install django
        echo "プロジェクト作成"
        django-admin startproject mysite .
        cd mysite
        sed -i -e "s/ALLOWED_HOSTS = \[\]/ALLOWED_HOSTS = \['*'\]/" settings.py
        sed -i -e "s/LANGUAGE_CODE = 'en-us'/LANGUAGE_CODE = 'ja'/" settings.py
        sed -i -e "s/TIME_ZONE = 'UTC'/TIME_ZONE = 'Asia\/Tokyo'/" settings.py
        sed -i -e "s/STATIC_URL = 'static\/'/STATIC_URL = '\/static\/'\nSTATIC_ROOT = BASE_DIR \/ 'static'/" settings.py
        cd ..
        echo "アプリケーション作成"
        python3 manage.py migrate
        python3 manage.py startapp $2
        cd mysite
        model_name=`echo $2 |  sed "s/\(.\)/\U\1/" | sed "s/\(_.\)/\U\1/g" | sed "s/_//g"`
        sed -i -e "s/INSTALLED_APPS = \[/INSTALLED_APPS = \[\n    '$2.apps.${model_name}Config',/" settings.py
        cd ..
        python3 manage.py makemigrations $2
        python3 manage.py migrate $2
        echo "Adminユーザ作成"
        python3 manage.py createsuperuser
        cd mysite
        echo "urls.py作成"
        sed -i -e "s/from django.urls import path/from django.urls import path, include/" urls.py
        sed -i -e "s/urlpatterns = \[/urlpatterns = \[\n    path('', include('$2.urls')),/" urls.py
        cd ../$2
        touch urls.py
        echo "from django.urls import path" >> urls.py
        echo "from . import views" >> urls.py
        echo "urlpatterns = [" >> urls.py
        echo "    path('', views.index, name='index')," >> urls.py
        echo "]" >> urls.py
        echo "views.py作成"
        echo "def index(request):" >> views.py
        echo "    content = '$2 is installed'" >> views.py
        echo "    return render(request, '$2/index.html', {'content': content})" >> views.py
        echo "テンプレート作成"
        mkdir templates
        cd templates
        mkdir $2
        cd $2
        touch index.html
        echo "{% load static %}" >> index.html
        echo "<html>" >> index.html
        echo "<head>" >> index.html
        echo "<link rel=\"stylesheet\" href=\"{% static 'css/$2.css' %}\">" >> index.html
        echo "</head>" >> index.html
        echo "<body>" >> index.html
        echo "<p>{{ content }}</p>" >> index.html
        echo "</body>" >> index.html
        echo "</html>" >> index.html
        cd ..
        cd ..
        echo "CSS作成"
        mkdir static
        cd static
        mkdir css
        cd css
        touch $2.css
        echo "p {" >> $2.css
        echo "    color: red;" >> $2.css
        echo "}" >> $2.css
        cd ..
        cd ..
        cd ..
        pip freeze > requirements.txt
        touch .gitignore
        echo "*.pyc" >> .gitignore
        echo "*~" >> .gitignore
        echo "/.vscode" >> .gitignore
        echo "__pycache__" >> .gitignore
        echo "myvenv" >> .gitignore
        echo "db.sqlite3" >> .gitignore
        echo "/static" >> .gitignore
        echo ".DS_Store" >> .gitignore
        echo "端末のIPアドレス"
        ip a
        echo "サーバー起動"
        python3 manage.py runserver 0.0.0.0:8000
        fi
    fi
fi
```