[PYTHON] Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben

Einführung

Erstellen Sie eine API, die mit DynamoDB unter AWS mit django REST Framework und boto3 ausgeführt wird. Aktivieren Sie die Operationen GET, POST, PUT und DELETE.

Dynamodb-Tabellenerstellung (Vorbereitung)

Bereiten Sie im Voraus eine Tabelle wie die folgende vor und geben Sie einige Daten ein. Tabellenname: Früchte hash key: Name

スクリーンショット 2020-08-10 22.16.19.png

Erstellen eines Django-Projekts

Erstellen Sie ein Django-Projekt (dynamo_operation) und eine App (api).

$ django-admin startproject dynamo_operation
$ cd dynamo_operation/
$ django-admin startapp api 

Bearbeiten Sie settings.py

Fügen Sie rest_framework und die zuvor erstellte app-Konfiguration zu settings.py hinzu.

dynamo_operation/setting.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework', #hinzufügen
    'api.apps.ApiConfig', #hinzufügen
]

Modell für DynamoDB-Anforderung erstellen

In Django wird "Modell" für die Erstellung und den Betrieb der Datenbank vorbereitet. Da die Anfrage an DynamoDB boto3 verwendet, ist model nicht erforderlich, aber diesmal haben wir model (dynamo_model.py) vorbereitet.

api/dynamo_model.py


class Fruit():
    def __init__(self, name):
        self.name = name

Views.py bearbeiten

api/views.py


from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response 
from api.dynamo_models import Fruit
from boto3 import client

dynamodb_client = client('dynamodb')

class DynamoRequest(APIView):
    #Ganz GET
    def get(self, request):
        response = []
        items = dynamodb_client.scan(TableName='Fruits')['Items']
        for item in items:
            fruit = Fruit(item['Name']['S'])
            fruit.price = item.get('Price',{}).get('N', '')
            response.append(fruit.__dict__)
        return Response(response)
    
    def post(self, request):
        request_data = request.data
        item = {'Name': {'S': request_data['Name']}}

        if 'Price' in request_data:
            item['Price'] = {'N': request_data['Price']}

        dynamodb_client.put_item(
            TableName = 'Fruits',
            Item = item
        )
        return Response(status=status.HTTP_201_CREATED)


class DynamoDetailRequest(APIView):
    #Single GET
    def get(self, request, pk):
        item = dynamodb_client.get_item(
            TableName = 'Fruits',
            Key = {
                'Name': {'S': pk},
            }
        )['Item']
        fruit = Fruit(item['Name']['S'])
        fruit.price = item.get('Price',{}).get('N', '')
        return Response(fruit.__dict__)
    
    def put(self, request, pk):
        request_data = request.data

        item = dynamodb_client.get_item(
            TableName = 'Fruits',
            Key = {
                'Name': {'S': pk},
            }
        )['Item']

        price = item.get('Price',{}).get('N', '0')

        if 'Price' in request_data:
            price = request_data['Price']

        dynamodb_client.put_item(
            TableName = 'Fruits',
            Item = {
                'Name': {'S': item['Name']['S']},
                'Price': {'N': price}
            }
        )
        return Response(status=status.HTTP_200_OK)
    
    def delete(self, request, pk):
        dynamodb_client.delete_item(
            TableName = 'Fruits',
            Key = {
                'Name': {'S': pk},
            }
        )
        return Response(status=status.HTTP_204_NO_CONTENT)

Verarbeiten Sie die Anfrage mit class, die APIView von rest_framework erbt. DynamoRequest behandelt die Anfrage ohne den Pfadparameter undDynamoDetailRequest behandelt die Anfrage mit dem Pfadparameter (pk). Durch das Erben von "APIView" ist es möglich, die jeder Methode entsprechende Verarbeitung hinzuzufügen, indem für jede HTTP-Methode eine Funktion vorbereitet wird.

Bearbeiten von urls.py

api/urls.py


from django.urls import path
from api import views

urlpatterns = [
    path('api/', views.DynamoRequest.as_view()),
    path('api/<pk>/', views.DynamoDetailRequest.as_view())
]

Bearbeiten Sie auch urls.py im Ordner dynamo_opration

dynamo_opration/urls.py


from django.urls import path, include

urlpatterns = [
    path('', include('api.urls')),
]

Überprüfen Sie die Funktion mit dem Befehl curl

Server starten

$ python manage.py runserver

GET (ganze Suche)

$ curl http://127.0.0.1:8000/api/

#Antwort
[{"name":"orange","price":"200"},{"name":"banana","price":"100"},{"name":"apple","price":"100"}]

POST

$ curl -X POST \
  -H 'Content-Type:application/json' \
  -d '{"Name": "peach", "Price": "400"}' \
  http://127.0.0.1:8000/api/

Tabelle nach POST-Anfrage スクリーンショット 2020-08-10 23.16.38.png

Der Pfirsichartikel wurde hinzugefügt.

GET (Single)

Holen Sie sich Apfelartikel

$ curl http://127.0.0.1:8000/api/apple/

#Antwort
{"name":"apple","price":"100"}

PUT Ändern Sie den Apfelpreis von 100-> 200

$ curl -X PUT \
  -H 'Content-Type:application/json' \
  -d '{"Price": "200"}' \
  http://127.0.0.1:8000/api/apple/

Tabelle nach PUT-Anfrage スクリーンショット 2020-08-10 23.21.52.png

DELETE Löschen Sie den Pfirsichartikel.

$ curl -X DELETE http://127.0.0.1:8000/api/peach/

Tabelle nach DELETE-Anfrage スクリーンショット 2020-08-10 23.23.47.png

abschließend

Ich habe eine REST-API erstellt, die DynamoDB mit django REST Framework + boto3 betreibt. Dieses Mal habe ich dynamodb_model.py vorbereitet, um das Modell zu verwalten, aber es war möglicherweise nicht erforderlich (ich möchte das Design hier in Zukunft verbessern).

Recommended Posts

Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
So erstellen Sie eine Rest-API in Django
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Versuchen Sie, einen Artikel von Qiita mit der REST-API [Umweltvorbereitung] zu erstellen.
Django REST Framework Ein wenig nützlich zu wissen.
Erstellen Sie eine API mit Django
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
Erstellen wir es, indem wir den Protokollpuffer mit Serverless Framework auf die API anwenden.
Erstellen Sie eine Homepage mit Django
Erstellen Sie eine API für die Benutzerauthentifizierung mit Django REST Framework
So generieren Sie automatisch ein API-Dokument mit dem Django REST-Framework und POST vom Dokumentbildschirm
Wenn Sie mit dem Django REST-Framework filtern möchten
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
Übergang zum Update-Bildschirm mit dem Django-Tag
Django REST Framework mit Vue.js
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Zurücksetzen des Passworts über die API mit dem Django Rest Framework
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Erstellen Sie mit Django eine API für die soziale Integration von Smartphone-Apps
Betreiben Sie Nutanix mit der REST-API Teil 2
Schritte zum Erstellen eines Django-Projekts
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Erstellen Sie mit Django einen Datei-Uploader
Ich habe versucht, eine RESTful-API zu erstellen, indem ich die explosive Fast-API des Python-Frameworks mit MySQL verbunden habe.
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Implementierung von CRUD mithilfe der REST-API mit Python + Django Rest Framework + igGrid
Rails-Benutzer versuchen, mit Django eine einfache Blog-Engine zu erstellen
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt
So senden Sie eine Anfrage mit Python an die DMM (FANZA) -API
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Verstehen Sie den Komfort des Django Rest Framework
CRUD GET mit Nuxt & Django REST Framework ②
Verschiedene Hinweise zum Django REST-Framework
Einfache REST-API mit API Gateway / Lambda / DynamoDB
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Ich habe den JWT-Token-Generator mit Django Rest Auth auf SimpleJWT geändert.
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
[AWS SAM] Erstellen Sie eine API mit DynamoDB + Lambda + API Gateway
Der einfachste Weg, um mit Django zu beginnen
So entwickeln Sie eine Cart-App mit Django
Erstellen wir eine REST-API mit SpringBoot + MongoDB
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Schritte zum Erstellen eines Twitter-Bots mit Python
Speichern Sie das Objekt in einer Datei mit pickle
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Erstellen Sie ein Übersetzungswerkzeug mit dem Translate Toolkit
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
Erstellen Sie eine REST-API mit dem in Lobe und TensorFlow Serving erlernten Modell.
Lösung, wenn nicht gefunden, wird angezeigt, wenn die API von Django REST Framework von außen aufgerufen wird
Beachten Sie die Lösung, da Django nicht mit pip installiert werden konnte