Django Girls Tutorialのまとめ
Django Girl で利用したコマンドを記載
Django Girlsのチュートリアルで書かれているものをざーとまとめる。
読んだらチュートリアルにある簡易アプリを作成→デプロイする、ゴール。
前提条件
- Anacondaをインストールしていること
※この記事は書きかけのため、まだ参考にならず。
Django内で利用する言葉について
- プロジェクト アプリ
- アプリケーション アプリの機能のこと。これらの集合体がプロジェクト
適当なディレクトリを作成し、そこに移動する。
移動した上で
django-admin startproject <project_name> .
または
django-admin.py startproject <project_name> .
するとディレクトリ構成として以下となる。
user ├── manage.py └── <project_name> ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
ファイルの簡単な説明として
- manage.py 管理用スクリプト。Webサーバ立ち上げ等用途は幅広い
- settings.py 設定ファイル
- url.py 取得するurlによってページ遷移するために必要
大元の設定を変更する
<project_name>/settings.pyを変更する
以下を項目を下記に書き換えることで、日本語表示になったりする LANGUAGE_CODE = 'ja-JP' TIME_ZONE = 'Asia/Tokyo' USE_TZ = False
DataBaseの設定
データベースの利用については<project_name>/settings.pyの以下で設定する
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
上記だとsqlite3を利用するとある。
他のデータベースを使いたい場合、ここをmysqlやpostgresql等に変更すればよい
データベースのセットアップ
python manage.py migrate
成功した場合、db.sqlite3というフォルダが作られていることを確認
Djangoの内部サーバーを起動
python manage.py runserver
以下にアクセス
http://127.0.0.1:8000/
アプリケーションの作成
python manage.py startapp <application_name>
アプリケーションを作成したらDjangoに認識させる
<project_name>/settings.pyを以下のように書き換える
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', '<application_name>' )
アプリケーションを作成したら、その都度Djangoに認識してもらうよう
settings.pyのINSTALLED_APPSに追加していく
今後のコードはDjango Girlsのチュートリアルに沿うため、一つ一つ取り上げない。
必要なものはポイントで挙げていく。
Modelについて
動かしたいもの(オブジェクト)とその振る舞い(メソッド)をそれぞれ考える。
本家記事はpostblogとなっているので、オブジェクトは
- author
- title
- text
- created_date
- publish_date
となっている。 アプリケーションのモデルについては<application_name>/models.pyを編集する
blog/models.py
from django.db import models from django.utils import timezone class Post(models.Model): author = models.ForeignKey('auth.User') title = models.CharField(max_length=200) text = models.TextField() created_date = models.DateTimeField( default=timezone.now) published_date = models.DateTimeField( blank=True, null=True) def publish(self): self.published_date = timezone.now() self.save() def __str__(self): return self.title
class model_name(models.Model)の
models.Modelを継承することでDjangoがデータベースに保存するべきものだということを認識する。
from django.db import models from django.utils import timezone class Model_name(models.Model): # データベースで利用するフィールドを定義 # def hogehoge(): #モデルを操作する処理を記載
Modelを作成したら、Djangoに変更を認識させるため、migrationを行う
python manage.py makemigrations <application_name>
※コマンドを打つとエラーが出るが下記を参照し解決できる
https://teratail.com/questions/87245
成功すると
Migrations for '<application_name>': 0001_initial.py: - Create model <model_name>
という表示が出る
Djangoに変更を認識させた後、データベースへ登録する移行ファイルを作成させる
python manage.py migrate <application_name>
今回登録したModelを管理ページでみるために、Django adminを利用する
<application_name>/admin.pyを編集する
from django.contrib import admin from .models import <model_name> admin.site.register(<model_name>)
以下のコマンドを実行する
python manage.py runserver
以下にアクセスすると、管理画面にログインするページが表示される
http://127.0.0.1:8000/admin/
管理ページにアクセスするユーザーを作成するため、以下のコマンドを実行する
python manage.py createsuperuser
Herokuへデプロイする
Django Girlsのチュートリアルをそのまま行うとうまくできない。
以下を行うこと。
python -V
バージョン確認する
同ディレクトリ内に「runtime.txt」を作成し確認済のバージョンを記入する。
python-<version>
次に以下のコマンドを入力する
pip install --upgrade psycopg2
さらに以下のコマンドを入力する
pip freeze > requirements.txt
次に同じディレクトリに「Procfile」というファイルを作成する。
中身としては以下を記入する。
web: gunicorn <project_name>.wsgi
Heroku上のサーバとローカルとの環境が異なるため、ローカルの環境でも動作できるよう、データベースの設定を保存する。
<project_name>/local_settings.pyを作成する
import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } DEBUG = True
プロジェクト大元の設定も変更する
<project_name>/settings.pyを編集する
import dj_database_url DATABASES['default'] = dj_database_url.config() SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') ALLOWED_HOSTS = ['*'] STATIC_ROOT = 'staticfiles' DEBUG = False try: from .local_settings import * except ImportError: pass
wsgiファイルの設定変更
<project_name>/wsgi.pyに以下を追加する
from whitenoise.django import DjangoWhiteNoise application = DjangoWhiteNoise(application)