ホーム >  AWS >  【Vagrant】DRFアプリケーション作成、テスト起動【Django】

投稿日:   |  最終更新日:

【Vagrant】DRFアプリケーション作成、テスト起動【Django】

AWSDjangoDjango REST frameworkNginxPython

DRFアプリケーションを作成し、テスト起動します。

DRFアプリケーション

前回、AmazonLinux2の仮想環境にDjangoプロジェクトを作成しました。DRFアプリケーションを作成し、モデルを作成していきます。

DRF(Django Rest Framework)を使っていても、通常のDjangoと開発の流れは同じです。プロジェクトを作成したら、アプリケーションを作ります。manage.pyと同じ階層で、次のコマンドを実行します。

作業の流れ

1.vagrantを起動して、Amazon Linux2にログインします。

2.Pythonパッケージをインストールします。

前回まで

今回の作業は、以下の続きです。

【仮想環境】MacにVirtualBoxをインストール【Mac】

【Vagrant】MacにAWS公式のAmazon Linux2 Vagrant 環境を作成【オンプレミス】

【Vagrant】MacにAWS公式のAmazon Linux2 Vagrant Boxを作成、起動【オンプレミス】

Vagrant】Macに用意したVagrantのAmazon Linux2 環境にVirtualBox Guest Additionsをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にPythonをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にuwsgi、Django、Django Restframeworkをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にsqlite3、nginxをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にDjangoプロジェクト作成【オンプレミス】

※今回の記事は、既にAmazonLinux2のVagrant環境を作成済みであるとします。

環境

私のPC環境は以下の通りです。

PC MacBook Air (Retina, 13-inch, 2019)
CPU 1.6 GHz デュアルコアIntel Core i5
メモリ 16 GB 2133 MHz LPDDR3
OS 10.15.2
VirtualBox 6.1.12r139181
Vagrant 2.2.9

仮想環境

仮想環境は以下の通りです。

OS Amazon Linux release 2 (Karoo)
Python 3.7.9
Django 3.2
djangorestframework 3.12.4
djangorestframework-jwt 1.11.0
django-cleanup 5.2.0
uWSGI 2.0.19.1
Nginx 1.18.0

Vagrantのディレクトリ構成

  • ~/Work/
  • Vagrant/
  • AmazonLinux2/


AmazonLinux2仮想環境へログイン

①「ターミナル」を開いて下記のコマンドを入力します。

cd ~/Work/Vagrant/AmazonLinux2

②下記のコマンドを入力して仮想環境を起動します。

Vagrant up

③下記のコマンドを入力してログインします。

vagrant ssh

Djangoアプリケーションの作成

Djangoは大きくプロジェクトの単位があってその中に小さくアプリケーションが存在します。Djangoで開発するため下記のようにdjangoコマンドでuploaderアプリケーションを生成します。

現在のDjangoプロジェクトディレクトリ構成

  • mysite/
  • config/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • db.sqlite3
  • manage.py

①下記のコマンドを入力してアプリケーションを作成します。

cd mysite
python3 manage.py startapp nuploader1

②プロジェクトのurls.pyを編集します。

vi config/urls.py

以下の行を追加します。

from django.conf import settings
from django.contrib import admin
from django.urls import path
from django.conf.urls.static import static
from django.conf.urls import include, url

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


# 開発環境でのメディアファイルの配信設定
urlpatterns += static(
    settings.MEDIA_URL,
    document_root=settings.MEDIA_ROOT
)    

③プロジェクトのsettings.pyを編集します。

vi config/settings.py

「TEMPLATES」の「DIRS」を変更します。

import os
from pathlib import Path

・・・(省略)・・・

INSTALLED_APPS = [
    'nuploader1.apps.Nuploader1Config',  # 追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_cleanup.apps.CleanupConfig',  # django-cleanupを使いたいなら、これも追加
    'rest_framework',  # 追加
]

・・・(省略)・・・

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

・・・(省略)・・・

アプリケーションを作成したので、「INSTALLED_APPS」に「nuploader1.apps.Nuploader1Config」を追加します。

※DIRSは、Djangoのテンプレートのディレクトリを指定することができます。「os.path.join(BASE_DIR, ‘templates’)」を指定すると、プロジェクトディレクトリ(今回の場合は、mysiteディレクトリ)の直下になります。

④アプリケーションのviews.pyを編集します。

vi nuploader1/views.py

以下の行を追加します。

from django.shortcuts import render  # render(request, 'hello.html', context)
from django.http import HttpResponse  # HttpResponse('Hello, World !!')
from django.shortcuts import render
from django.views import View

def index(request):

    return render(request, 'nuploader1/index.html')

⑤アプリケーションのurls.pyを編集します。

vi nuploader1/views.py

以下の内容を記述します。

from django.urls import path
from . import views

app_name = 'nuploader1'

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

⑥プロジェクトディレクトリ直下に「templates/nuploader1」ディレクトリを作成し、index.htmlを作成します。

mkdir templates
mkdir templates/nuploader1
vi templates/nuploader1/index.html 

以下の内容を記述します。

<html>
  <header>
    <title>Hello World</title>
  </header>
  <body>
    Hello World
  </body>
</html>

⑦Djnagoのプロジェクトディレクトリに移動して、Pythonサーバを起動します。

cd mysite/
python3 manage.py runserver 0.0.0.0:8000

⑧ローカルのブラウザを起動して、アドレスに以下のURLを入力します。

http://127.0.0.1:8080/uploader/

以下のように、「HelloWorld」が表示されます。

CNTROL+Cで終了します。

Djangoモデルの作成

アプリケーションの中身を作っていきます。まずモデルを定義し、データベースのテーブル構造を定義します。

現在のDjangoプロジェクトディレクトリ構成

  • mysite/
  • config/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • nuploader1/
  • __init__.py
  • __pycache__
  • migrations
  • models.py
  • urls.py
  • views.py
  • templates
  • db.sqlite3
  • manage.py

①nuploader1/models.pyに、次のように書きます。

from django.db import models


class Composite(models.Model):
    name = models.CharField('名前', max_length=255)
    is_dir = models.BooleanField('ディレクトリか', default=True)
    src = models.FileField('ファイルソース', blank=True, null=True)
    parent = models.ForeignKey(
        'self', verbose_name='親ディレクトリ', on_delete=models.CASCADE,
        blank=True, null=True, limit_choices_to={'is_dir': True}
    )
    zip_depth = models.PositiveIntegerField('zipファイルの深さ', default=0)

    class Meta:
        ordering = ('-is_dir', 'name')

    def __str__(self):
        if self.is_dir:
            return f'{self.pk} - {self.name}/'
        else:
            return f'{self.pk} - {self.name}'

    def get_display_name(self):
        if self.is_dir:
            return f'{self.name}/'
        else:
            return f'{self.name}'

ファイルアップローダーのモデル

ファイルアップローダーでは、通常のファイルシステムのような作りです。ディレクトリを作ることができて、その中にディレクトリをネスト(入れ子)することもできます。また、そこにファイルを作ることもできます。

このような場合、ファイルとディレクトリを別モデルとして表現するよりは、一つのモデルとして表現するほうが管理しやすいことが多いです。

※ファイルとディレクトリを1つにまとめたものとして、Compositeという名前にしています。

解説(各フィールド)

name = models.CharField('名前', max_length=255)

ファイル・ディレクトリ名はnameフィールドに格納します。

is_dir = models.BooleanField('ディレクトリか', default=True)

ディレクトリかどうかのフラグをis_dirフィールドに格納します。

src = models.FileField('ファイルソース', blank=True, null=True)

ファイルの場合、ファイルのパスを格納します。

ディレクトリの場合は空になります。

    parent = models.ForeignKey(
        'self', verbose_name='親ディレクトリ', on_delete=models.CASCADE,
        blank=True, null=True, limit_choices_to={'is_dir': True}
    )

親ディレクトリがある場合は、parentフィールドに指定します。

親ディレクトリがない(つまり最上位のファイル・ディレクトリ)は空になります。

zip_depth = models.PositiveIntegerField('zipファイルの深さ', default=0)

そのディレクトリをzipとしてダウンロードしたい場合に使います。

例)

  • myproject/
  • css/
  • style.css
  • js/
  • main.js
  • index.html

以下のようにmyprojectというディレクトリがあります。

zip_depthを1にすると直下(index.htmlのある階層)が圧縮されます。

zip_depthを2にするとstyle.cssやmain.jsの階層までZIP圧縮される仕組みです。

解説(各メソッド)

    class Meta:
        ordering = ('-is_dir', 'name')

「class Meta」では、並び順です。これは結果的に、ディレクトリがファイルよりも上に表示されます。また、名前順で並び替えられるようになります。

    def __str__(self):
        if self.is_dir:
            return f'{self.pk} - {self.name}/'
        else:
            return f'{self.pk} - {self.name}'

「__str__」は、管理サイトやデバッグ時に使いやすいようにpkや名前を表示しています。

    def get_display_name(self):
        if self.is_dir:
            return f'{self.name}/'
        else:
            return f'{self.name}'

get_display_nameは、そのコンポジットの表示名を取得したい場合に使う予定です。ディレクトリの場合は末尾に「/」をつけて、ディレクトリとファイルの違いがわかりやすいように名前を表示します。


データベースへ反映

次は、データベースに今作ったモデルを反映します。

①以下のコマンドを実行します。

python3 manage.py makemigrations nuploader1

Migrations for 'nuploader1':
  nuploader1/migrations/0001_initial.py
python3 manage.py migrate

②前回スーパーユーザーを作成しましたが、もしまだなら、このタイミングで管理者も作成しておきましょう。

python manage.py createsuperuser

③nuploader1/admin.pyを開き、Django管理サイトでCompositeモデルを扱えるようにします。

  • mysite/
  • config/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • nuploader1/
  • __init__.py
  • __pycache__
  • migrations
  • admin.py
  • apps.py
  • models.py
  • urls.py
  • views.py
  • templates
  • db.sqlite3
  • manage.py
from django.contrib import admin
from .models import Composite

admin.site.register(Composite)

次回

Djangoの簡易サーバーを起動したらSQLite3のエラーが出ましたので、対処した内容を説明します。

【Django3.x】久々に開発サーバー起動時にSQLite3のエラーが出た【SQLite3】


トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告