Help us understand the problem. What is going on with this article?

webAPIを作ってみた! EC2でDjangoRestFramework 1から環境構築

はじめに

この記事ではDjangoでwebAPIを作成しよう!という記事です。

RDSのMySQLを使用しています。

前回の記事の続きですのでわからなくなったら参考にしてください
[AWS]EC2,RDS,Djangoを使ってみた。1から環境構築

$             <- 自分のPCターミナルでのコマンド
[ec2-user] $  <- EC2にログイン中でのコマンド
MySQL >       <- MySQLにログイン中でのコマンド
#             <- 私のコメント
>>>           <- 実行結果(出力値)

前提条件

Djangoのプロジェクト作成

前回の記事でも書きましたが、もう一度書いておきます。

プロジェクトを作成しましょう

#testDjangoというプロジェクトを作成する
[ec2-user] $ django-admin startproject testDjango

[ec2-user] $ cd
[ec2-user] $ cd testDjango

前回の記事[2.2],[2.5]参照

FileZillaを使ってsettings.pyを編集

testDjango/settings.py
#IPアドレスをグーグルなどで検索した時エラー内容を返してくれる
DEBUG = True

#変更
ALLOWED_HOSTS = ['(EC2のオープンIPアドレス)','localhost']

...
()
...

#デフォルトの設定をリマーク
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': BASE_DIR / 'db.sqlite3',
#     }
# }

#新しく記入
#[NAME]はRDS内のテーブル名、後に作成します。
#[USER,PASSWORD,HOST]はそれぞれ入力
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbtest',
        'USER': '(DBマスターユーザー)',
        'PASSWORD': '(DBマスターユーザーパスワード)',
        'HOST': '(DBエンドポイント)',
        'PORT': '3306',
    }
}

...
()
...

#日本語に変更
#LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja'

#日本時間に変更
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'
#pollsと言う名前のアプリを作成する
[ec2-user] $ python manage.py startapp polls
[ec2-user] $ pip install djangorestframework

順番大切

testDjango/settings.py
...
()
...

#変更
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'polls.apps.PollsConfig',
]
#(アプリ名).apps.(先頭大文字アプリ名)Config

...
()
...

RDSのMySQLにログイン

[ec2-user] $ mysql -h (DBエンドポイント) -u (DBマスターユーザー名) -p
# パスワードを要求されるので入力(文字は表示されないが打ち込めています)(コピペ可)

>>> Welcome to the MariaDB monitor.
# が表示されればRDSのMySQLに接続ができた

#データベース内一覧を表示(小文字でも可 show database;)
MySQL > SHOW databases;

#「dbtest」という名前のテーブルを作成
MySQL > CREATE DATABASE dbtest;

#終了
MySQL > exit

Djangoの設定

モデルの作成

polls/models.py
from django.db import models

class User(models.Model):
    #作成時刻を記録
    created = models.DateTimeField(auto_now_add=True)
    #Userの名前を記録
    name = models.CharField(max_length=100, blank=True, default='')
    #Userのemail
    mail = models.TextField()

    class Meta:
        ordering = ('created',)

データベースのマイグレーションを行う

[ec2-user] $ python manage.py makemigrations polls
[ec2-user] $ python manage.py migrate

確認してみます

MySQL > show databases;
MySQL > use dbtest;
MySQL > show tables;
>>>
+----------------------------+
| Tables_in_dbtest           |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| example_table              |
| polls_user                 | <--生成されている
+----------------------------+   (アプリ名)_user

MySQL > exit

以下の記事が参考になります
【学習メモ】MakemigrationsとMigrateについて

serializers.pyの作成

デフォルトでは生成されていないため、メモ帳か何かで作成しFileZillaで転送してください

  • シリアライズとは、ソフトウェア内部で扱っているデータをそのまま、保存したり送受信することができるように変換することです。
polls/serializers.py
from rest_framework import serializers
from polls.models import User


class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'name', 'mail')

views.pyを実装

polls/views.py
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from polls.models import User
from polls.serializers import UserSerializer


@csrf_exempt
def user_list(request):

    if request.method == 'GET':
        #UserをMySQLから全件取得
        polls = User.objects.all()
        serializer = UserSerializer(polls, many=True)
        #Jsonで返してくる
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = UserSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            #登録成功するとJsonデータが帰ってくる  ##status 200番台は処理が成功した
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

polls/urls.pyを作成する

これも新規作成してください

polls/urls.py
from django.urls import path
from polls import views

urlpatterns = [
    path('user/', views.user_list),
]

大元のurls.pyに接続します

testDjango/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('polls.urls')),
]

これで設定は終了です。

テストする

ローカルのサーバーを立てます
ローカルとはなんぞ?と言う方は以下の記事がわかりやすかったです
djangoは誰が動かしているのか?(デプロイのための俯瞰)

[ec2-user] $ cd
[ec2-user] $ cd testDjango

[ec2-user] $ python manage.py runserver

このあとGoogleChromeなどで

http://(EC2のオープンIPアドレス)/user/

と検索すると

[]

と空の括弧が返ってきたと思います。

データを入れる

このままだと不便なので
GoogleChromeの拡張機能のARCをダウンロードしましょう

Advanced REST clientダウンロード

GETで通信してみると空の括弧が返ってきます

スクリーンショット 2020-10-21 14.01.45.png

POSTで通信してみます。その際に

{"name":"tanaka","mail":"T@gmail.com"}

この情報を追加します。

スクリーンショット 2020-10-21 14.07.27.png

SENDを押すとレスポンスが返ってきます

スクリーンショット 2020-10-21 14.10.35.png

またGETできちんと登録できたか確認してみるといいでしょう。

またデータベースは

MySQL > use dbtest;
MySQL > SELECT * FROM polls_user;
>>>
+----+----------------------------+--------+-------------+
| id | created                    | name   | mail        |
+----+----------------------------+--------+-------------+
|  1 | 2020-10-21 05:10:23.730602 | tanaka | T@gmail.com |
+----+----------------------------+--------+-------------+

これで登録に成功しました。

おわりに

この記事で誰かの役に立っていただければ幸いです。

次回は NginX,Gunicorn を使って本番環境(初心者の私が作る)を作ってみようかと思います。

それではでは

参考サイト

以下と本記事の途中に非常に参考にさせていただいたサイトを紹介しています。
ありがとうございました。

[1].Django REST frameworkチュートリアル その1
[2].djangoは誰が動かしているのか?(デプロイのための俯瞰)
[3].【学習メモ】MakemigrationsとMigrateについて

[4].よく使うMySQLコマンド集

akidon0000
四国の大学生
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away