Open11

Django学習(Coursera Meta Back-End Developper course)

osanaiksosanaiks

Djangoで環境構築とサーバー起動

1 virtualenvの設定

まず仮想環境を構築するためにvirtualenv(venv)をインストールする。

terminal
pip3 install virtualenv

homebrewでインストールしたPythonを使っているなら、下記のコマンドと思われる。

terminal
brew install virtualenv

次に設定仮想環境を構築する

terminal
virtualenv {任意のディレクトリ名}

2 仮想環境の適用

適用する場合

terminal
source  {任意のディレクトリ名}/bin/activate

終了する場合(シンプル)

terminal
diactivate`

3 Djangoのインストール

terminal
pip3 install django

4 Djangoのproject設定

terminal
django-admin startproject {任意のproject名}

5 Djangoのapp設定

terminal
cd {任意のproject名}
python3 manage.py staratapp {任意のapp名}

6 DBの設定

terminal
python3 manage.py migration

7 サーバー起動

teminal
python3 manage.py runserver
osanaiksosanaiks

Djangoでのルーティング

ゴールはこの画面表示

app内の実装

  • app内のviews.pyにメソッドを書く
project/app/views.py
from django.urls import HttpResponse

def home(response):
    return HttpResponse('hogehoge')
  • app内にurls.pyを作る
project/app/urls.py
from django.urls import path
from . import views # 同じディレクトリに存在するmoduleなのでfrom .

urlpatterns = [
    path('', views.home, name="home"),  
]

project直下の実装

  • project内のurls.pyのurlPattersに、pathを追加する
project/project/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('myapp.urls')), # 追加
]

urlPatternsではなくurlpatternsなので注意

  • project内のsettings.pyのINSTALLED_APPSにappの情報を追加する
project/project/setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp' # どっちか追加
    'myapp.apps.MyappConfig', # どっちか追加
]

サーバー起動

親のprojectでコマンドを叩き起動

terminal
python manage.py runserver

出でくるlocalhostのリンクをクリックすれば、ゴールの画面が表示される

osanaiksosanaiks

ルーディングでpathパラメーターの渡し方

pathをappに渡す場合

ゴールはこの画面

urlの例
{ドメイン名}/drinks/mocha

appの実装

app内のviews.pyで、該当のfunctionのパラメーターにpathを追加する

project/app/views.py
from django.shortcuts import render
from django.http import HttpResponse

def drinks(request,drink_name):
    drinkDic = {
        'mocha':'type of coffee',
        'tea':'type of beverage',
        'lemonade' : 'type of refreshment',
    }
    choice_of_drink = drinkDic[drink_name]
    title = f"<h2> {drink_name} </h2>"
    return HttpResponse(f"<h2>{drink_name}</h2> " + choice_of_drink)

urls.pyに`任意のpathを渡す

project/app/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('drinks/<str:drink_name>', views.drinks, name="drink_name"),
]
osanaiksosanaiks

用語の整理

  • app_name => どのurls.pyにあるurlpatters(namespace)かを示す
  • url_name => urlPatternsのうちどのURLかを示す

app_nameとurl nameがわかればreverse()でurlを導き出せる

from django.urls import path
from . import views

app_name = 'blog'  # URL名前空間

urlpatterns = [
    path('post/<int:id>/', views.post_detail, name='post_detail'),  # URL名
]
osanaiksosanaiks

ModelとMigration

ModelはDBのテーブル・スキーマと同じ構造を持ったクラス。Migrationは、データベーススキーマの変更を管理するためのバージョン管理システムとして機能する。ModelをベースにMigrationをし、テーブルの中身や構造を更新する。

CLIコマンドの整理

Migrationには下記のCLIコマンドが用意されている。

  • makemigrations
  • migrate
  • showmigrations
  • sqlmigrate

makemigrations

モデル(models.py)に加えた変更を元に、どのようにデータベースを更新すべきかを記述したスクリプトを自動生成する。

migrate

migration fileに基づいて、実際にDBのテーブルの構造を更新する。

showmigrations

migrationの経過を表示してくれる(git logのイメージ)

sqlmigrate

不明

osanaiksosanaiks

実際のMigrationとModelの操作

最初のmigrate

まず初期段階としてmigrateを行う。runserverの際に元々警告がterminalに出てくるので、すでに行なっている場合は不要だし、Model作った後でも行う。

terminal
python manage.py migrate

このリストに記載された分のデフォルトのディレクトリが作られると思われる。作られる中身の詳細は不明。

project/settings.py
INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
]

Model作成

DBのスキーマとなるModelを作る前にappを用意し、myappに移動する(ここまでに用意済の場合は不要)。

terminal
python manage.py startapp app
cd myapp

model.pyを用意する(terminal使わなくても良い)。

termial
touch models.py

Modelを作成する。

project/app/models.py
from django.db import models 
class Person(models.Model): 
    name = models.CharField(max_length=20) 
    email = models.EmailField() 
    phone = models.CharField(max_length=20)

Modelを作ったらadmin.pyにも追加する。これで管理画面上で操作できるようになる

project/project/manage.py
from . models import Person

admin.site.register(Person)

CreateMigration

Modelからマイグレーションファイルが作成される。

terminal
python manage.py makemigrations 
Migrations for 'app': 
  app\migrations\0001_initial.py 
    - Create model Person

Migration

再びMigrationすることでマイグレーションファイルを読みとり、DBが更新される

terminal
python manage.py migrate
osanaiksosanaiks

Migrationの取り消し

migrationの取り消し、というか戻す方法について記載する。
まずはmigrationの履歴を確認

terminal
python manage.py showmigrations

どこまで戻すかを確認。コマンドの中で指定する。
0001まで戻る場合

terminal
python manage.py migrate app_name 0001