5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

webAPIを作る。 EC2でDjangoRestFramework 1から環境構築

Last updated at Posted at 2020-10-21

##はじめに
この記事では**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 |
+----+----------------------------+--------+-------------+

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

##おわりに

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

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

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

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

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?