1. akidon0000

    No comment

    akidon0000
Changes in body
Source | HTML | Preview
@@ -1,506 +1,507 @@
##はじめに
この記事では**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
#pollsと言う名前のアプリを作成する
[ec2-user] $ python manage.py startapp polls
+[ec2-user] $ pip install djangorestframework
```
[前回の記事[2.2],[2.5]参照](https://qiita.com/akidon0000/items/0f55bc8a948e3aa5d3e9)
**FileZillaを使ってsettings.pyを編集**
```testDjango/settings.py
#IPアドレスをグーグルなどで検索した時エラー内容を返してくれる
DEBUG = True
#変更
ALLOWED_HOSTS = ['(EC2のオープンIPアドレス)','localhost']
#変更
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
...
(略)
...
#デフォルトの設定をリマーク
# 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/'
```
**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 |
+----+----------------------------+--------+-------------+
```
これで登録に成功しました。
##おわりに
この記事で誰かの役に立っていただければ幸いです。
次回は NginX,Gunicorn を使って本番環境(初心者の私が作る)を作ってみようかと思います。
それではでは
##参考サイト
以下と本記事の途中に非常に参考にさせていただいたサイトを紹介しています。
ありがとうございました。
[1].[Django REST frameworkチュートリアル その1](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)