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

##はじめに
この記事では**DjangoでwebAPIを作成しよう！**という記事です。

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

前回の記事
[[AWS]EC2,RDS,Djangoを使ってみた。1から環境構築](https://qiita.com/akidon0000/items/0f55bc8a948e3aa5d3e9)

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






##前提条件

- [EC2,RDS,Djangoの接続完了済](https://qiita.com/akidon0000/items/0f55bc8a948e3aa5d3e9)







##Djangoのプロジェクト作成





```

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

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

[前回の記事[2.2],[2.5]参照](https://qiita.com/akidon0000/items/0f55bc8a948e3aa5d3e9)

**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について
](https://qiita.com/frosty/items/8c715a53d7920c9cd1eb)






###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は誰が動かしているのか？（デプロイのための俯瞰）](https://qiita.com/ming_hentech/items/9e21fe175988448e204b)




```

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

[ec2-user] $ python manage.py runserver
```





このあとGoogleChromeなどで




```

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




と検索すると





```

[]
```




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







##データを入れる

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

[Advanced REST clientダウンロード](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo/details?hl=ja-JP)


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

![スクリーンショット 2020-10-21 14.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/c2408a40-8b15-a6b2-f54e-f02ea6511365.png)

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



```

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



この情報を追加します。

![スクリーンショット 2020-10-21 14.07.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/b480b672-b4a9-7a0a-0831-54d88ba1d782.png)


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

![スクリーンショット 2020-10-21 14.10.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/83803e80-6ce2-365a-ad3d-69086e0950ca.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チュートリアル その１](https://qiita.com/Gattaca/items/419e2a2cf23b6a9f1028)
[2].[djangoは誰が動かしているのか？（デプロイのための俯瞰）](https://qiita.com/ming_hentech/items/9e21fe175988448e204b)
[3].[【学習メモ】MakemigrationsとMigrateについて
](https://qiita.com/frosty/items/8c715a53d7920c9cd1eb)
[4].[よく使うMySQLコマンド集](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)