投稿日: | 最終更新日:
【Vagrant】DRFアプリケーション作成、テスト起動【Django】
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をインストール【オンプレミス】
※今回の記事は、既に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のエラーが出ましたので、対処した内容を説明します。
- Python 114
- 制作 54
- RaspberryPi 41
- Django 40
- WordPress 40
- Linux 27
- VPS 22
- JavaScript 21
- PHP 20
- HTML・CSS 19
- AWS 16
- 仮想環境 15
- レスポンシブデザイン 13
- マイコン 11
- WEB全般 11
- 動画製作 9
- Webサービス 8
- 統合開発環境 8
- 機械学習 8
- PyCharm 7
- jQuery 7
- AfterEffects 7
- 起業・設立 7
- Django REST framework 6
- C# 6
- デザイン 6
- SEO 6
- pydata 6
- Visual Studio 5
- 数学 5
- 携帯サイト 5
- heroku 5
- Mac 5
- illustrator 5
- node.js 5
- Anaconda 5
- Nginx 4
- Jupyter Notebook 4
- インフラ 4
- Google Colaboratory 4
- symfony 4
- Webスクレイピング 3
- photoshop 3
- Go言語 3
- PC 3
- ツール 3
- Docker 3
- facebook 3
- 作業効率化 3
- データベース 3
- Cloud9 3
- コマンド 2
- micro:bit 2
- Kali Linux 2
- Webサーバー 2
- MariaDB 2
- ドローン 2
- コンテナ 2
- DaVinci Resolve 2
- ネットワーク 2
- Java 2
- movie 2
- PCDJ 2
- 音楽 2
- XSERVER 2
- Ansible 1
- Vue.js 1
- JSON 1
- Bootstrap 1
- バージョン管理システム 1
- SSL 1
- S3 1
- ムームードメイン 1
- ネットワーク 1
- アニメーション 1
- D3.js 1
- Rhino 1
- アニメ 1
- git 1
- windows 1
- アクセス解析 1
- スマートフォン 1
- アフィリエイトノウハウ 1
- 知識 1
- TypeScript 1
- 役立つ本・書籍 1
- データサイエンス 1
- ESP32 1
- AI 1
- ownCloud 1
- API 1