JSひろばアプリ開発4日目:Djangoプロジェクトの作成

JSひろばアプリ作成まで~4日目

前回まではVueのフレームワークを使い、フロントエンドのアプリを作成しました。まだモックのデータでしか操作できないので、実際にREST APIを作成したVue側で使えるようにしていきます。 今日は、PythonのウェブフレームワークのDjangoを使ってAPIを作っていきます。Flaskよりもアドミンページがあったりセキュリティの設定が最初から入っているなど開発の面でもスピードアップができる素晴らしいフレームワークです。 YouTubeでもDjangoとDjango REST APIを説明したプレイリストがあるので是非見てください。 作業日 2022年12月13日 作業にかけた時間 2時間 合計作業時間 11時間 作業内容 Djangoのプロジェクト作成virtualenvの設定requirements.txtに書き出しDRFのインストールDBのテーブルの構成モデル、URL、ビューの設定PostgreSQLに接続 Djangoのプロジェクト では早速Djangoのプロジェクトを作成します。Python3がインストールされていることを確認してください。 その前に仮想環境のvirtualenvが入っているか確認します。入っていない場合は下記のコマンドでインストールしましょう。 仮想環境の説明はこちらの動画を見てください。必ず役に立ちますよ。 では正しいファイルパスにいることを確認して下記のコマンドで仮想環境をアクティベートします。 これでプロンプトの最初に(env)と表示されればOKです。 Djangoのインストール ではDjangoとDjango REST Frameworkをインストールします。 他にも必要なパッケージがあればその都度インストールすると思いますが、今のところはなさそうです。 Djangoはバージョン4.1がリリースされているので最新のものを入れておきましょう。 必要であればgit initでリポを作成しましょう。詳しいGitとGitHubの使い方はこちらの動画を見てください。 では、下記のコマンドでDjangoのプロジェクトをスタートします。 次にmanage.pyのファイルを使ってDjangoのアプリを作成します。 次にを開発用の仮のデータベースをSQLiteで作成します。 その後にテストランしてみましょう。 これでセッションのテーブルができました。 では実際にブラウザにアクセスしてDjangoのデフォルトのページが表示されるか見てみます。 OKですね。では実際にコードに入ります。 アプリの登録 先ほど登録したcommandアプリをDjangoのプロジェクトに教えてあげます。 Settings.pyでcommandアプリとRESTフレームワークのアプリを登録しました。 次にプロジェクトフォルダのurls.pyにAPIのエンドポイントとなるURLを登録します。 このrouterファイルは後から作成します。まずはAPIの前にデータが登録できるところまで確認しましょう。 モデルの作成 ではデータベースの枠となるmodels.pyを作成していきます。 とりあえずはこんな感じで作成しました。 Views.pyの作成 Views.pyはモデルともとに何をするのか指示する場所になります。 ここではモデルをシリアル化してAPIを作成するように指示しています。 CommandSerializerのファイルがまだできていないのでそれを作成します。 CommandSerializer では同じファイルパスにserializers.pyを作成しましょう。 まずはこれだけ設定していきます。 admin.pyの登録 Djangoのアドミンパネルでテーブルが見れるようにモデルを登録します。 スーパーユーザーの登録 Djangoのスーパーユーザーを作成してアドミンパネルからテーブルが作成できるか見てみましょう。 再度テーブルのマイグレーションを行います。 … Read more

Django REST APIを公開

DjangoAPI-Demo

皆さん、こんにちは。 今日は、PythonのウェブフレームワークDjangoで作成したREST APIを公開するので是非使ってみてください。 APIの概要 このAPIはコールセンターをイメージしたDBを構成し、CRUD操作(Create,Read,Update,Delete)を可能にしたAPIです。 もう一つにトークン認証でログインしたユーザーのみアクセスできるAPIもあります。 そちらは、81番ポートからアクセスしてください。今回はトークン認証の不要なAPIのみ紹介します。 使えるAPI 利用可能なAPI http://172.104.81.40/api/ このURL(URI)にアクセスすると、下記のように各URLからAPIにアクセスできます。 Office:オフィス情報のAPIです。 Staff:従業員のAPIです。Officeの情報が紐づいています。 Tickets:お客様からのコール情報に他のテーブル(スタッフ、店舗情報、チケットカテゴリ)が紐づいています。 Ticket-Categories:コールのカテゴリ情報です。 Company:企業情報です。 StoreS:各企業の店舗情報です。 Customer-contact:お客様の連絡先です。 Djangoセットアップの手順 下記のURLにソースコードがアップロードされているので自由にクローンして使ってください。 https://github.com/TraitOtaku/Django-TicketAppAPI Gitを使ってクローンからセットアップまでの手順です。 モデルの内容 各アプリのmodels.pyを参照して受け入れるデータタイプとデータが必須かどうかを確認してください。 blank=True, null=Trueの場合はデータがなしでもOKです。 シリアライザーの内容 各アプリのSerializers.pyが先ほどのDBとコミュニケーションをとるmodels.pyをシリアル化してAPIの役目をします。チケットの例でいうとReadのGETリクエストが来たときとその他のリクエストで別々のリスポンスを返すようにしています。その設定はViews.pyで行いますが、APIの内容はここで決めます。 https://github.com/TraitOtaku/Django-TicketAppAPI/blob/master/tickets/serializers.py UIからデータを操作してみる では、実際にDjangoのAPIのUIを使用してデータを操作してみましょう。 http://172.104.81.40/api/tickets/ 上記のJSONデータを入れてあげると、DjangoからAcceptのリスポンスが返されてデータが追加されました。 レコードの更新と削除 先ほど作成したレコードはIDが1で作成されました。このデータにアクセスするには下記のようにURLの最後にIDを追加すればOKです。 http://172.104.81.40/api/tickets/1/ そうするとDELETEのオプションと下記にPUTとPATCHのオプションが追加されるのでそこからレコードを削除するなり修正するなりできます。

無料で使えるAPIを紹介

無料で使えるAPI

皆さんこんにちは。

今日はフロントエンドで使えそうな、ポートフォリオのプロジェクトで使えそうな無料のAPIを紹介します。

真面目なものから、ふざけたものまで色々集めたので是非、使ってみてください。

NASAの宇宙API

ユーザー登録が必要です。

日替わりの宇宙画像とかがあるそうです。

https://api.nasa.gov/index.html

天気予報API

天気情報のAPIは誰しもが使うマストなAPIですね。簡単な天気アプリとかに使えそうです。

これもユーザー登録が必要になります。

https://openweathermap.org/api

米国株式のAPI

Polygon.ioというところが提供しているAPIです。GitHubで登録してAPIキーを手に入れた後にAPIにアクセスできるようです。


ユーザー登録なしで使えるAPI

ここから、ユーザー登録が不要ですぐに使えるAPIを紹介します。

ポケモンAPI

みんなの大好きなポケモンのデータがAPIになりました。

https://pokeapi.co/

参考URL: https://pokeapi.co/api/v2/pokemon/charizard

カクテルAPI

カクテルのレシピがAPIになってます。

https://www.thecocktaildb.com/api.php

サンプルURL:https://www.thecocktaildb.com/api/json/v1/1/search.php?s=margarita

ビットコインAPI

クリプトのAPIです。CoinBaseが提供しています。

https://docs.cloud.coinbase.com/sign-in-with-coinbase/docs/api-users#data-endpoints

サンプルURL:https://api.coinbase.com/v2/currencies

為替API

為替のレートのAPIです。

https://www.coingecko.com/en/api

サンプルURL:https://api.coingecko.com/api/v3/exchange_rates

アメリカの統計

アメリカの人口や統計がデータになったAPIです。

https://datausa.io/about/api/

サンプルURL: https://datausa.io/api/data?drilldowns=Nation&measures=Population

犬の画像

ランダムで犬の画像が表示されます。

https://dog.ceo/dog-api/

サンプルURL:https://dog.ceo/api/breeds/image/random

アニメAPI

アメリカで有名なMyAnimeListの非公式のAPIです。

https://jikan.moe/

サンプルURL: https://api.jikan.moe/v4/anime?q=naruto&sfw

本のAPI

OpenLibraryという組織で提供している本のAPIです。

https://openlibrary.org/developers/api

サンプルURL: http://openlibrary.org/api/volumes/brief/isbn/9780525440987.json

ランダムユーザーAPI

自動でユーザーを生成してくれるAPIです。

https://randomuser.me/

サンプルURL: https://randomuser.me/api/

とりあえず、これだけあれば次のプロジェクトの参考になるのではないでしょうか?

お疲れ様でした。

Django RESTクイックスタート

今日はシンプルなAPIを作成し、アドミンユーザーがブラウザから実際にAPIを見れるようにするところまで紹介したいと思います。

始める前に。。。Django REST APIはDjangoの基礎を理解していることを前提に学ぶことをお勧めします。

プロジェクトのセットアップ

 tutorialという名前のプロジェクトを作成し、 quickstartという名前でアプリを作成します。

# Create the project directory
mkdir tutorial
cd tutorial

# Create a virtual environment to isolate our package dependencies locally
python3 -m venv env
source env/bin/activate  # On Windows use `env\Scripts\activate`

# Install Django and Django REST framework into the virtual environment
pip install django
pip install djangorestframework

# Set up a new project with a single application
django-admin startproject tutorial .  # Note the trailing '.' character
cd tutorial
django-admin startapp quickstart
cd ..

プロジェクトのファイル構成はこんな感じになります。

$ pwd
<some path>/tutorial
$ find .
.
./manage.py
./tutorial
./tutorial/__init__.py
./tutorial/quickstart
./tutorial/quickstart/__init__.py
./tutorial/quickstart/admin.py
./tutorial/quickstart/apps.py
./tutorial/quickstart/migrations
./tutorial/quickstart/migrations/__init__.py
./tutorial/quickstart/models.py
./tutorial/quickstart/tests.py
./tutorial/quickstart/views.py
./tutorial/asgi.py
./tutorial/settings.py
./tutorial/urls.py
./tutorial/wsgi.py

ではデータベースを更新しましょう。

python manage.py migrate

次にDjango側のアドミンを作成します。例として、名前は admin でパスワードはpassword123にしましょう。このユーザーを後からAuthenticate(認証)で使います。

python manage.py createsuperuser --email admin@example.com --username admin

これで初期の設定はOKです。では早速ロジックを作るべく、コーディングにとりかかりましょう。

Serializers(シリアル化)

まずは、Serializersの設定をおこないます。慣習としてserializers.pyというファイル名を使うようにしましょう。では、 tutorial/quickstart/serializers.pyのファイルを作成し、データベースのデータをシリアル化させる役目をここで指示します。

from django.contrib.auth.models import User, Group
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ['url', 'username', 'email', 'groups']


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ['url', 'name']

今回は例としてHyperlinkedModelSerializerを使用しています。これはModelSerializerに似ているものです。違いは、primary keyがModelSerializerになるのですが、HyperlinkedModelSerializerはurlがpライマリーキーフィールドとして設定されます。ハイパーリンクはRESTfulのデザインとして良い慣習とされているので覚えておきましょう。

Views

Viewsでは、ユーザーからリクエストがあった際にどのような動きをさせるか指示させるファイルでしたね。通常のDjangoならHTMLのテンプレートを返したりしますが、今回はAPIを返すように指示します。

では、次の tutorial/quickstart/views.pyを開きコーディングしましょう。

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer
    permission_classes = [permissions.IsAuthenticated]


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
    permission_classes = [permissions.IsAuthenticated]

ここでViewSetsの登場です。ViewSetsはCRUDのすべてのリクエストに対応できるスーパーセットです。これで、いちいちDELETEのリクエストやPUTのリクエストがあった動きを毎回書く必要がなくなりました。

もちろん、何か特別な動きをさせたいときはこれを上書きすることもできます。

今はこのロジックを使ってクリーンなコードのままにしておきます。

URLs

では次の tutorial/urls.pyからAPIのエンドポイントとなるURI(URL)を設定していきます。

from django.urls import include, path
from rest_framework import routers
from tutorial.quickstart import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

ここで覚えておきたいのが、ViewSetsはひとつのURLでCRUDのすべてのリクエストを受け取ることができることです。

なので、ここでは単純に先ほど作成したViewSetsと登録するだけでOKです。

繰り返しになりますが、単純にGETリクエストだけを受け付けたい場合は普通のクラスベースのViewを設定することでできます。

最後に、Djangoでついてくるログインとログアウトのロジックを追加することができることを紹介します。例えば顧客情報などの重要な情報は認証されたユーザーしかアクセスできないようにしたいですよね。

他にもいろいろなやり方でAPIを守る方法があるのでこれから学んでいきましょう。

Pagination(ページ)

ページネーションでは、1つのリクエストに対して返すデータの数を制限することができます。

これは tutorial/settings.pyで設定することができます。

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

Settings

次に、'rest_framework' をINSTALLED_APPSに追加してDjango側でライブライが追加されたことを登録してあげます。このセッティングのファイルはtutorial/settings.pyになります。

INSTALLED_APPS = [
    ...
    'rest_framework',
]

いいですね。


APIをテストする

では早速テストサーバーを起動してAPIを確認してみましょう。

python manage.py runserver

コマンドラインやcurlのようなツールを使ってAPIをテストすることもできます。

bash: curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/users/
{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "email": "admin@example.com",
            "groups": [],
            "url": "http://127.0.0.1:8000/users/1/",
            "username": "admin"
        },
    ]
}

もしくはhttpieでもこのようにテストできます。

bash: http -a admin:password123 http://127.0.0.1:8000/users/

HTTP/1.1 200 OK
...
{
    "count": 2,
    "next": null,
    "previous": null,
    "results": [
        {
            "email": "admin@example.com",
            "groups": [],
            "url": "http://localhost:8000/users/1/",
            "username": "paul"
        },
    ]
}

一番手っ取り早いのがDjangoのブラウザで確認することですね。URL http://127.0.0.1:8000/users/

Quick start image

もし、ブラウザからAPIを確認したい場合はDjangoアプリケーションにログインしていることを忘れずに確認してください。

では、これでDjango REST Frameworkのクイックスタートの説明を終了します。

Django – ネスト化されたAPI

準備するもの

・Django REST Frameworkのコード

チケットシステムの例

今日はこのチケット管理システムもモデルを元に説明します。

Djangoのアプリという概念で、このDjnagoプロジェクトに下記の3つのアプリが設定されております。

  • Customers
  • Members
  • Tickets

では、それぞれもモデルを見ると、アプリに必要なデータベースのモデルがあることが分かりますね。

Foregin KeyがPKで表示される

通常、ViewSetやAPIViewで作成したForeignKeyの項目はそのキーのPK(プライマリーキー)で表示されます。これはデータベースを見ると分かりますが、DB自体がこの外部キーをPKとして保管しているからです。

これだとせっかくAPIにしてもクライアント側のアプリでは使い物になりませんね。

StringRelatedFieldの使い方

その問題を簡単に解決できるのがStringRelatedFieldです。

これはモデルで設定した__Str__の値を返してくれます。

    def __str__(self):

        return self.inquiry

ただしこの問題は、これらのStringRelatedFieldを使うとReadOnlyのAPIになり、いざユーザー側からPOST(データの投稿)をしたい場合にエラーが発生します。

DjangoRESTのエンドポイントのHTMLフォームからも項目が削除されたことでも確認できますね。

ネスト化されたAPIモデル

ほかに、depthメタを使用してforeign keyの一階層下まで参照することができます。

この画像のようにモデルをシリアル化する際にforeign Keyでリファレンス(参照)しているキーをどの階層まで出力されるか設定することができます。

これも便利ですがReadOnlyです。

    class Meta:

        model = Ticket

        fields = '__all__'

        # depth = 1

APIでForeignKeyを受け付ける方法

Django RESTフレームワークでも、外部キー(Foregin Key)の扱いは我々デベロッパーに任されており、魔法のようなソリューションはありません。と記載されております。

色々試した結果、このオープンソースのライブラリが一番簡単な解決方法だと思ったので紹介します。

このライブラリはBeda Sotwareというロシアの医療ソフト開発会社が提供しているようですね。

https://github.com/beda-software/drf-writable-nested

ではこのライブラリをインストールしましょう。

pip install drf-writable-nested

その後に単純にシリアライザーのパラメーターを下のように変えるだけです。

class TicketSerializer(WritableNestedModelSerializer):

    # category = CategorySerializer()

    # staff = MemberSerializer()

    # store = StoreSerializer()

で、それぞれのシリアライザーをインポートすればCRUDレディーのAPIが完成です。

実際に試してください。

お疲れ様です。

Django API Authってなに?Token Authenticationを使ってみよう

サマリー

APIのエンドポイントを守れ!
 

準備するもの

  • Pythonとpip
  • Django RESTFrameworkのプロジェクト

Authってなに?

Authは認証のことで、Autheniticationの事を意味します。ここで、Authorizationと間違える事が多いですがこの2つは全くの別ものなのでちゃんと理解をしておきましょう。

Authentication(認証)→誰かを証明すること

Authorization(権限を与える)→特定のデータへのアクセスを許可するか

なのでAuth(認証)された人がどのPermissionがあるのかを判断する方法になり、それから、認証された人が特定のデータにアクセスできるかをAuthorizeするわけですね。

例でいうと会社のセキュリティカードを持っていればそのカードのステータスによってアクセスできる場所が決まってくるような感じでしょうか。

Authはなぜ必要か

APIのエンドポイントのURI(URL)にアクセスできる誰もがその情報を手に入れることができます。その情報を守るために認証された人だけにデータのアクセス権限を与えるためです。

特にデータの更新や削除ができる権限は限られた人だけに与えたいですよね。

Authの種類について

Djangoで主流なAuthシステムを紹介します。

  1. Basic Authentication→ログインIDとPWだけの簡単なものです。
  2. Token Authentication→トークンを使ってHTTP認証をします。クライアント・サーバーセットアップのデスクトップアプリやモバイルアプリに最適です。
  3. SessionAuthentication→DjangoについてくるセッションAuthのシステムを使えます。時間が経つとログアウトされる仕組みとかも作れます。
  4. JWT(JSON Web Toekn)→ ここ数年で人気になったJSONウェブトークンでの認証システムです。

BasicAuthenticationを使おう

他にJWTとDjoserのライブラリもお勧めです。

まずは公式ドキュメンテーションを読みましょう。

https://www.django-rest-framework.org/api-guide/authentication/

settings.pyの設定

ではプロジェクトディレクトリ内のsettings.pyに下記のラインを追加しましょう。

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': [

        'rest_framework.authentication.BasicAuthentication',

        'rest_framework.authentication.SessionAuthentication',

    ]

}

Views.pyの設定

ここでAiuthenticationに必要なモジュールをインポートします。

from rest_framework.authentication import SessionAuthentication, BasicAuthentication

from rest_framework.permissions import IsAuthenticated

あとは、クラスを貼り付けるだけ!

from .models import Member

from .serializers import MemberSerializer

from rest_framework import viewsets

#これを追加

from rest_framework.authentication import SessionAuthentication, BasicAuthentication

#これを追加

from rest_framework.permissions import IsAuthenticated




class MemberViewSet(viewsets.ReadOnlyModelViewSet):

    #これを追加

    authentication_classes = [SessionAuthentication, BasicAuthentication]

    #これを追加

    permission_classes = [IsAuthenticated]



    queryset = Member.objects.filter(status="Employed")

    # queryset = Member.objects.all()

    serializer_class = MemberSerializer

APIのエンドポイントの確認

では、DjangoのユーザーでログインしていないブラウザでURIにアクセスしましょう。

このように、APIのデータが出力されなくなりましたね。

ここで重要なのが、APIの発信元がHTTPSでないとログイン情報が盗まれることがあるので必ずHttps://を使うようにしましょう。

しかし、これだとDjangoのアドミンパネルからログインしていないとAPIが見れないのでクライアント側では使えなさそうですね。

(※このログインページはカスタマイズできますが次の方法で試してみましょう。)

TokenAuthを使おう

ではAuthのイメージが沸いたところでTokenAuthの設定をしていきます。

settings.pyの設定

では、REST_FRAMEWORKの項目を下記のように更新しましょう。

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': [

        'rest_framework.authentication.TokenAuthentication'

    ],

    'DEFAULT_PERMISSION_CLASSES': [

        'rest_framework.permissions.IsAuthenticated'

    ]

}

では、Views.pyのAuthも項目は一旦削除しましょう。

で、APIのエンドポイントに行くとデータが見れなくなったことがわかりましたね。

http://127.0.0.1:8000/api/?format=api

このAPIのルートから全てTokenがないとアクセスが制限されます。

ちなみにこれをなくして、viewごとでauth設定をすることもでき、一部のapiだけにauthをかけられます。

Tokenを取得するURLを作成

まずはsettings.pyに下記のtokenアプリを追加します。

INSTALLED_APPS = [

    ...

    'rest_framework.authtoken'

]

ではurls.pyにTokenを作成するURLを作成します。

from rest_framework.authtoken import views




urlpatterns = [

    path('api-token-auth/', views.obtain_auth_token, name='api-token-auth')

]

URLの名前はなんでもよいです。

アプリを登録した後にDBのマイグレーションを忘れないようにしてください。

これでToeknテーブルがアドミンパネルに表示されました。

これでユーザーがログインしたときに生成されるトークンと照らし合わせてアクセス権限を判断できるようになります。

ログイン情報を作成

もし、ログインする情報がない人は先にスーパーユーザーを作っておきましょう。

python manage.py createsuperuser

テストでリクエストを送ってみる

では下記のURLにアクセスしてみます。

http://127.0.0.1:8000/api-token-auth/

下記のようにGETリクエストが拒否されました。

ではログイン情報と一緒にPOSTメソッドでリクエストを送ってみます。

HttpieでURLにPOSTリクエストを送る

では下記のコマンドでテストツールのhttpieをインストールします。

pip instal httpie

で、先ほど作成したapi-token-authのURLにPOSTリクエストを送ります。

http POST http://127.0.0.1:8000/api-token-auth/ username="admin" password="admin"

これでTokenが作成されればOKです。

トークンを使ってAPIにアクセスする

では先ほど作成されたTokenを使ってAPIにアクセスできるか試してみましょう。

http http://127.0.0.1:8000/api/tickets/ “Authorization: Token 330b6d34c6ac24a3606b14495e9311e0681821c2”

問題なくレスポンスがかえってきましたね。

※同じようにHTTPSを使うようにしましょう。

Django REST API COR Headersの使い方

Django CORSとは

Django CORSはホスト側のAPIリソースを取り扱う、そしてセキュリティのメカニズムのことです。

このCORSが設定されていないと、アプリからDjangoAPIとコミュニケーションをしようとしてもエラーになってしまいます。

CORSをインストール

python -m pip install django-cors-headers

Settings,.pyの更新

INSTALLED_APPS = [

...

'corsheaders',

...

]

ミドルウェアの更新

ここで注意したいのはCORSのラインが他のミドルウェアよりも先(上)に来るようにします。

MIDDLEWARE = [

...,

'corsheaders.middleware.CorsMiddleware',

'django.middleware.common.CommonMiddleware',

...,

]

Allowed Originの設定

CORS_ALLOWED_ORIGINS = [

"https://domain.com",

"https://api.domain.com",

"http://localhost:8080",

"http://127.0.0.1:9000"

]

CORS_ALLOW_METHODS

必要に応じてHTTPのリクエストのメソッドも制限できます。

CORS_ALLOW_METHODS = [

'DELETE',

'GET',

'OPTIONS',

'PATCH',

'POST',

'PUT',

]

CORS_ALLOW_HEADERS

これも必要に応じてHTTPリクエストのヘッダーを制限できます。

CORS_ALLOW_HEADERS = [

'accept',

'accept-encoding',

'authorization',

'content-type',

'dnt',

'origin',

'user-agent',

'x-csrftoken',

'x-requested-with',

]

DjangoでAPIをつくろう

知っておくべきこと

・Djangoの基本は説明しませんので別の動画/記事で先に理解しておくこと

・Pythonの基本

・APIの意味

今回使用するもの

・Windows10(OSはあまり関係ありません)

・Python3

・pip

・Django REST framework

Django REST Frameworkってなに?

Django自体はバックエンドのフレームワークの中でもスピーディに開発でき、セキュリティも設定されてるいてくる優れモノです。

他にはPHPのLaravelとか、nodeJSのExpressJSとかが近いもので存在します。

詳しくはDjangoの公式ドキュメンテーションを見てください。

https://www.djangoproject.com/

しかし!実際の開発の現場では、Djangoだけの仕事っていうのはあまりありません。DjangoにAPIを組み込んでマルチプラットフォーム(Web、モバイルアプリ、exeファイル)からデータにアクセスさせるというやり方の方が良いです。

これでDjangoの良さを活かしつつ、ユーザー側にはreact、vue、Anguler等のJSフレームワークでフルスタックにする方がスケールもしやすく、デバッグも楽になります。

では、前置きはこれくらいにして早速Django RESTFramework(DRF)を触っていきましょう。

DRFが提供するAPIの種類

APIでは、JSONファイルのデータを公開したり、アプリのデータを発信、受け取る際に使います。例えば天気の情報をAPIで受け取り、自分のサイトに表示するとかですね。

serializerを理解する

Djangoは通常PostgreSQLなどのデータベースと接続されています。デフォルトでは、SQLiteというポータブルのDB(データベース)がついてきますが、セキュリティのこともあり、デプロイする際には使いません。

DRFのSerializerはこのデータベースのデータをシリアル化することによってDjangoアプリからデータをAPIとして公開する役目を持ちます。

views.pyを理解する

ではこのシリアル化されたデータをDjangoのViews.pyというファイルの中でどのように扱うか指示をしてあげます。ここでフィルターをしたり、順番を変えたりもできます。

urls.pyを理解する

最後にどのURLでクライアント(ユーザー側)がアクセスできるかを指示します。

セットアップ

Pythonが入っていることを確認してください。

python –version

python3 —version

仮想環境を使ってホストターミナル(つまりは私のWIndowsPC)から独立した環境を作ります。必要ない人は飛ばしてください。(OSによってコマンドが異なります。)

環境を作りたいファイルパスで下記のコマンド

ENVは私がつけた名前なのでなんでもいいです。

pip install virtualenv

Virtualenv ENV

ENV\Scripts\activate.bat

Djangoのインストール

pip install django
pip list

プロジェクトの作成

Djangoがインストールできたら下記のコマンドでdjangoのプロジェクトを作成します。

django-admin startproject djangoapi

#djangoapiの部分は自分で分かりやすいものにしてください。

で、新しいプロジェクト名のディレクトリができました。

次にDjangoのRESTフレームワークをインストールします。

pip install djangorestframework

pip list

アプリの追加

今できたプロジェクトファイルとは別にアプリケーションごとのディレクトリを作成します。

まずはmasnage.pyのある場所に移動します。

cd djangoapi

python manage.py startapp apiapp

settings.pyを設定

ではテキストエディタでメインのプロジェクトファイルのsettings.pyを開き、

INSTALLED_APPS にrest_frameworkを追加します。

あとさっき作ったapiappも登録します。

INSTALLED_APPS = [

    'django.contrib.admin',

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.messages',

    'django.contrib.staticfiles',

    'rest_framework',

    'apiapp',

]

プロジェクトのurls.pyを設定

これもdjangoの設定なので詳しくは説明しません。

apiappのurls.pyに転送します。

from django.contrib import admin
from django.urls import path, include


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

アプリの方にurls.pyを作成しておく。

from django.urls import path

urlpatterns = [
]

アプリ側のviews.pyの設定

データベースに接続する前に簡単なテキストデータが出力できるか試します。

ここでapiの設定の仕方でファンクションベースとクラスベースの設定の仕方があります。

ファンクションベースは細かい設定がしやすいですが、行が長くなりがちで、クラスベースはコードの数が少ないと違いと考えておいて問題ないと思います。

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.decorators import api_view



@api_view(['GET'])
def getData(request):
  person = {'name':'Shiro', 'age':31}
  return Response(person)

さっきのurls.pyにエンドポイントを作成

from django.urls import path
from .views import getData

urlpatterns = [
    path('api/', ('apiapp.urls')),
    path('', getData),
]

テストラン

python manage.py makemigrations

Python manage.py migrate

python manage.py runserver

http://127.0.0.1:8000/をブラウザで開く。

これでAPIのエンドポイントが設定できましたね。

では、実際のデータを参照するように設定します。l

メンバーアプリを作成する。

では、同じ要領でメンバーのデータを参照するAPIを作成していきます。

python manage.py startapp members

settings.pyにアプリを登録

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    # Installed app
    'apiapp',
    'members'
]

モデルの登録

モデルはデータベースの方のようなもので、Django側でデータベースで受け入れるデータの種類やデータの長さを規制しておくことができます。

では、models.pyで下記のように例としてモデルを登録します。

from django.db import models

class Members(models.Model):
  name = models.CharField(max_length=30)
  email = models.EmailField(max_length=60)
  phone = models.IntegerField()
  date = models.DateTimeField(auto_now_add=True)

  #auto_now_addはレコードの作成した日と時間のみ記録する

モデルをシリアル化する

では、このmembersモデルをAPIにするための作業を行います。

Membersディレクトリ内にserializers.pyを作成します。

from rest_framework import serializers
from .models import Members




class MembersSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=30)
    email = serializers.EmailField(max_length=60)
    phone = serializers.IntegerField()
    date = serializers.DateTimeField()



    class Meta:
        model = Members
        # fields = ['name', 'email', 'phone', 'date']
        fields = '__all__'

Viewsの登録

今回はクラスベースでAPIにしてみましょう。

クラスベースの中でもいくつか方法があります。

まずは基本となるAPIviewを使ったやり方を紹介しますが、Viewsetという.CRUDの全部がセットになったものもあります。(CRUDはクリエイト、リード、アップデート、デリートpの略)

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Members
from .serializers import MembersSerializer




class MemberList(APIView):
    def get(self, request, format=None):
        members = Members.objects.all()
        serializer = MembersSerializer(members, many=True)
        return Response(serializer.data)




Urls.pyの設定

プロジェクト側のurls.pyをアプリ側に転送して、アプリ側のurls.pyでclassのMemberListのエンドポイントを作成します。

#djagoapi/urls.py

from django.contrib import admin
from django.urls import path, include



urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('apiapp.urls')),
    path('members/', include('members.urls')),
]

#members.urls.py

from django.urls import path
from .views import MemberList

urlpatterns = [
    path('', MemberList.as_view()),
]

DBをマイグレーション

では、実際にAPIができたかを確認する前に、models.pyのDBの枠組みを流し込みます。

python manage.py makemigrations

python manage.py migrate

python manage.py runserver

テストデータの作成

ではデータが空っぽなのでテスト用に入れていきます。

python manage.py createsuperuser

アドミンパネルにアクセスする前にDBモデルを登録して表示できるようにします。

#members/admin.py

from django.contrib import admin
from .models import Members
# Register your models here.
admin.site.register(Members)

ウェブサーバーを実行してURLからアドミンパネルにアクセスします。

http://127.0.0.1:8000/admin/

Djangoが勝手にmembersにsをつけたのでmodels.pyで変更します。

from django.db import models


class Members(models.Model):
    name = models.CharField(max_length=30)
    email = models.EmailField(max_length=60)
    phone = models.IntegerField()
    date = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = 'Members'


    def __str__(self):
        return self.name

Pluralは複数形のことです。

あと、__str__の所で、どのように表示したいか教えてあげます。この場合はメンバーのnameのデータを返してあげるようにします。

では、データ登録してみましょう。

では、これでAPIのエンドポイントに行ってみるとAPIが出力されていることが分かりますね!

では、次回はこのDjango RESTFrameworkのAPIでPOSTリクエストやDELETEのリクエストを送ってユーザー側から記事の投稿や削除ができるようにします。

お楽しみに。