「Django REST Framework」でAPIを作る。
2022/3/16
2023/2/22
Django REST Frameworkを使ってAPIを作る過程のメモです。
この記事ではAPIを作るまでのコマンドやコードの中身を中心に書いていきます。各作業の解説をあわせて書くと長くなりそうなので、それぞれ別記事にしてまとめいこうと考えていきます。
目次
0)今回の概要
完成イメージ
- 「記事一覧データ」を取得するAPIを作成する(List)
- 「記事データ」を取得するAPIを作成する(Detail)
- ユーザー登録なしで利用可能にする
全体の作業フロー
- 必要なパッケージをインストール
- Djangoのプロジェクトを作る
- Djangoのアプリケーションを作る
- 「settings.py」を変更する
- 「models.py」を変更する
- 「serializers.py」を変更する
- 「urls.py」を変更する
- 「views.py」を変更する
- Githubにアップロードする
- Herokuにデプロイする
1)必要なパッケージをインストールする
$ pip install django django-environ mysqlclient dj-database-url django-heroku gunicorn psycopg2-binary djangorestframework django-filter django-cors-headers djoser
2)Djangoのプロジェクトを作成する
まずはDjangoのプロジェクトを置くためのディレクトリを作成し、そのディレクトリに移動します。
$ mkdir rest_api_project # 「rest_api_project」部分は自由(ディレクトリ名)
$ cd rest_api_project
作成したディレクトリ内で、Djangoのプロジェクトを作成します。
$ django-admin startproject rest_api . # 「rest_api」部分は自由(プロジェクト名)
3)Djangoのアプリケーションを作成する
$ django-admin startapp api # 「api」部分は自由(アプリケーション名)
【この時点でのディレクトリ構造】
rest_api_project
├ api
├ rest_api
└ manage.py
4)「settings.py」を変更する
rest_api直下にある「settings.py」を編集していきます。
from datetime import timedelta # 追加
from decouple import config # 追加
from dj_database_url import parse as dburl # 追加
INSTALLED_APPS = [
...,
'rest_framework', # 追加
'api.apps.ApiConfig', # 追加
'corsheaders', # 追加
'djoser', # 追加
'django_filters',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 追加
...
]
# 追加
CORS_ORIGIN_WHITELIST = [
"http://localhost:3000",
]
default_dburl = 'sqlite:///' + str(BASE_DIR / "db.sqlite3") # 追加
# "DATABASES"を変更
DATABASES = {
'default': config('DATABASE_URL', default=default_dburl, cast=dburl),
}
TIME_ZONE = 'Asia/Tokyo' # 変更
# 追加
STATIC_URL = '/static/'
STATIC_ROOT = str(BASE_DIR / 'staticfiles')
「.env」を作成する(環境変数の設定)
トップディレクトリ直下に「.env」ファイルを作成します。
api/settings.pyに記載されている「SECRET_KEY」と「DEBUG」をenvファイルに記載します。
SECRET_KEY=[シークレットキー]
DEBUG=False
また元々のapi/settings.pyの記載を変更して、「.env」ファイルから読み込むようにします。
from decouple import config # 追加
SECRET_KEY = config('SECRET_KEY') # 追加
DEBUG = config('DEBUG') # 追加
5)「models.py」(admin.py)を変更する
「api」ディレクトリ直下にある「models.py」を編集します。これでデータベースのテーブルとカラムが定義されます。
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=50)
content = models.CharField(max_length=500)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
コマンドを入力してデータベースを作成/更新します。
$ python manage.py makemigrations
$ python manage.py migrate
6)「serializers.py」を変更する
「api」ディレクトリ直下に「serializers.py」を作成します。
from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.ModelSerializer):
created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True)
class Meta:
model = Post
fields = ('id', 'title', 'content', 'created_at')
7)「urls.py」を変更する
「api」ディレクトリ直下に「urls.py」を作成します。
from django.urls import path
from api.views import PostListView, PostRetrieveView
urlpatterns = [
path('posts/', PostListView.as_view(), name='posts'),
path('post/<str:pk>/', PostRetrieveView.as_view(), name='post-detail'),
]
「rest_api」ディレクトリ直下に「urls.py」を作成します。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')), # 追加
]
8)「views.py」を変更する
「api」ディレクトリ直下にある「views.py」を編集します。
from .models import Post
from .serializers import PostSerializer
from rest_framework import generics
from rest_framework.permissions import AllowAny
class PostListView(generics.ListAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = (AllowAny,)
class PostRetrieveView(generics.RetrieveAPIView):
queryset = Post.objects.all()
serializer_class = PostSerializer
permission_classes = (AllowAny,)
9)Githubにアップロードする
「.gitignore」を作成する
Githubのリポジトリを作成する
Githubにプッシュする
10)Herokuにデプロイする
必要なライブラリをインストールする
$ pip install gunicorn
$ pip install psycopg2-binary
$ pip install gunicorn psycopg2-binary
「requirements.txt」を作成する
$ pip freeze > requirements.txt
「Procfile」を作成する
web: gunicorn rest_api.wsgi --log-file - # 「rest_api」部分は自由(プロジェクト名)
「runtime.txt」を作成する
python-3.8.12
「settings.py」を編集する
# 変更
ALLOWED_HOSTS = ['nextjs-restapi.herokuapp.com']
↑↑↑
ALLOWED_HOSTS = ['[herokuのアプリケーション名].herokuapp.com']
11)動作確認テストする
admin.pyで管理画面の設定をする
from django.contrib import admin
from .models import Post
admin.site.register(Post)
スーパーユーザーを作成する
管理画面を操作するためのスーパーユーザーを作成します。
$ python manage.py createsuperuser # (ローカル環境に作成)
$ heroku run python manage.py createsuperuser -app [herokuリポジトリ名] # (heroku環境に作成)
テストデータを入れる
エンドポイントにアクセスして確認する
おまけ:仮想環境で開発する
最近の記事
音楽生成AI「Suno」の使い方まとめ!作詞作曲が簡単にできる?
簡単に曲が作れるAIということでよく聞く「Suno(Chirp)」についてまとめました。
目次「Suno」とはテキストからさまざまな音声を生成する「Bark」歌詞から曲を生成する「Chirp」...
2023/11/24
2023/11/24
【Open AI】APIの料金まとめ|GPT・DALL·E・Whisperなど
Open AIのAPI(一部)の料金をまとめました。
参考のために日本円は「1ドル150円」で換算をしています。
目次Text generation: テキスト生成Assistants ...
2023/11/22
2023/11/22
【Next.js】Assistants APIの基本的なコードまとめ。
Open AIの「Assistants API」をNext.jsで使用する時の基本的なコードをまとめました。
目次Open AIのAPIセットアップ基本の使い方Threads: スレッドを作る...
2023/11/21
2023/11/21
【Next.js】Open AIのAPIでファイルをアップロードする方法。
今回は、Next.jsサイトからOpen AIのAPI(Upload file)で、ファイルをアップロードする方法を実装するのに時間がかかったのでその過程と最終コードをまとめます。(Vercelにデ...
2023/11/21
2023/11/22
「生成系AIのWEBプロダクトTOP50」をまとめてみる。
Andreessen Horowitzが出している記事で紹介されている「AIプロダクトの月間訪問者数ランキングTOP50」のサービスをまとめました。
目次ChatGPTcharacter.ai...
2023/10/3
2023/10/3
【Next.js 13】NextAuth+FireStoreにユーザー情報を保存する。
今回は、以下の3つをNext.js 13で実装するためのメモです。
Googleアカウントでログインできる
アカウント、セッション情報をFirestoreに保存する
サーバーサイ...
2023/7/12
2023/7/12