Django REST APIを公開

皆さん、こんにちは。

今日は、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": "http://172.104.81.40/api/office/",
    "staff": "http://172.104.81.40/api/staff/",
    "tickets": "http://172.104.81.40/api/tickets/",
    "ticket-categories": "http://172.104.81.40/api/ticket-categories/",
    "company": "http://172.104.81.40/api/company/",
    "store": "http://172.104.81.40/api/store/",
    "customer-contact": "http://172.104.81.40/api/customer-contact/"

Office:オフィス情報のAPIです。

Staff:従業員のAPIです。Officeの情報が紐づいています。

Tickets:お客様からのコール情報に他のテーブル(スタッフ、店舗情報、チケットカテゴリ)が紐づいています。

Ticket-Categories:コールのカテゴリ情報です。

Company:企業情報です。

StoreS:各企業の店舗情報です。

Customer-contact:お客様の連絡先です。

Djangoセットアップの手順

下記のURLにソースコードがアップロードされているので自由にクローンして使ってください。

https://github.com/TraitOtaku/Django-TicketAppAPI

Gitを使ってクローンからセットアップまでの手順です。

git clone https://github.com/TraitOtaku/Django-TicketAppAPI.git

cd Django-TicketAppAPI
virtualenv env
bin\Scripts\activate

pip install -r requirements.txt

python manage.py makemigrations
python manage.py migrate

python manage.py createsuperuser

python manage.py runserver

モデルの内容

各アプリのmodels.pyを参照して受け入れるデータタイプとデータが必須かどうかを確認してください。

blank=True, null=Trueの場合はデータがなしでもOKです。

class Ticket(models.Model):
    category = models.ForeignKey(
        TicketCategory, on_delete=models.PROTECT, related_name="category_name")
    created_by = models.ForeignKey(
        'members.Member', on_delete=models.PROTECT, blank=True, null=True, default=None, related_name='ticket_created_by')
    updated_by = models.ForeignKey(
        'members.Member', on_delete=models.PROTECT, blank=True, null=True, default=None, related_name='ticket_updated_by') 
    ticket_date = models.DateTimeField(blank=True, null=True)

    is_open = models.BooleanField(default=False)
    is_email = models.BooleanField(default=False)
    complete_by = models.DateField(blank=True, null=True)
    open_details = models.CharField(max_length=100, null=True, blank=True)

    inquiry = models.CharField(max_length=1000)
    respond = models.CharField(max_length=1000)

    # Custromer Info
    company = models.ForeignKey(Company, on_delete=models.PROTECT, blank=True, null=True)
    store = models.ForeignKey(Store, on_delete=models.PROTECT, blank=True, null=True)

    is_contact = models.BooleanField(default=False)
    contact = models.ForeignKey(CustomerContact, on_delete=models.PROTECT, blank=True, null=True)

    contact_name = models.CharField(max_length=100, blank=True, null=True)
    email = models.EmailField(max_length=100, blank=True, null=True)
    phone = models.CharField(max_length=100, blank=True, null=True)

シリアライザーの内容

各アプリのSerializers.pyが先ほどのDBとコミュニケーションをとるmodels.pyをシリアル化してAPIの役目をします。チケットの例でいうとReadのGETリクエストが来たときとその他のリクエストで別々のリスポンスを返すようにしています。その設定はViews.pyで行いますが、APIの内容はここで決めます。

https://github.com/TraitOtaku/Django-TicketAppAPI/blob/master/tickets/serializers.py

class TicketSerializer(serializers.ModelSerializer):
    # ticket_date = serializers.DateTimeField()
    ticket_date = serializers.DateTimeField(
        format="%m/%d/%Y %H:%M", input_formats=["%m/%d/%Y %H:%M"])

    # complete_by = serializers.DateField(allow_null=True)
    # complete_by = serializers.DateField(
    #     format="%m/%d/%Y", allow_null=True)
    complete_by = serializers.DateField(
        format="%m/%d/%Y", input_formats=["%m/%d/%Y"], allow_null=True)
    class Meta:
        model = Ticket
        fields = '__all__'
        # depth = 1

class TicketReadSerializer(TicketSerializer):
    category = CategorySerializer(read_only=True)
    updated_by = MemberSerializer(read_only=True)
    created_by = MemberSerializer(read_only=True)
    escalated_to = MemberSerializer(read_only=True)
    contact = CustomerContactReadSerializer(read_only=True)
    store = StoreSerializer(read_only=True)
    company = CompanySerializer(read_only=True)

UIからデータを操作してみる

では、実際にDjangoのAPIのUIを使用してデータを操作してみましょう。

http://172.104.81.40/api/tickets/

{
    "ticket_date": "01/01/2022 21:15",
    "complete_by": null,
    "is_open": false,
    "is_email": false,
    "open_details": "",
    "inquiry": "新しいパソコンが欲しい",
    "respond": "しょうがないね",
    "is_contact": false,
    "contact_name": "",
    "email": "okyakusama@ichiban.com",
    "phone": "123-123-123",
    "category": 1,
    "created_by": 1,
    "updated_by": null,
    "company": null,
    "store": 1,
    "contact": null
}

上記のJSONデータを入れてあげると、DjangoからAcceptのリスポンスが返されてデータが追加されました。

レコードの更新と削除

先ほど作成したレコードはIDが1で作成されました。このデータにアクセスするには下記のようにURLの最後にIDを追加すればOKです。

http://172.104.81.40/api/tickets/1/

そうするとDELETEのオプションと下記にPUTとPATCHのオプションが追加されるのでそこからレコードを削除するなり修正するなりできます。