[PYTHON] Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST

introduction

Créez une API qui fonctionne sur DynamoDB sur AWS avec django REST Framework et boto3. Activez les opérations GET, POST, PUT et DELETE.

Création de table Dynamodb (préparation)

Préparez à l'avance un tableau comme celui ci-dessous et mettez-y des données. Nom de la table: Fruits hash key: Name

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

Créer un projet django

Créer un projet django (dynamo_operation) et une application (api)

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

Modifier setting.py

Ajoutez la configuration rest_framework et ʻapp créée précédemment à setting.py`.

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', #ajouter à
    'api.apps.ApiConfig', #ajouter à
]

Créer un modèle pour la requête DynamoDB

Dans django, model est préparé pour la création et le fonctionnement de la base de données. Puisque la requête à DynamoDB utilise boto3, model n'est pas nécessaire, mais cette fois nous avons préparé model (dynamo_model.py).

api/dynamo_model.py


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

Modifier views.py

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):
    #ENTIER OBTENIR
    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):
    #GET unique
    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)

Traitez la requête avec class qui hérite de ʻAPIView de rest_framework. DynamoRequest gère la demande sans le paramètre de chemin, etDynamoDetailRequest gère la demande avec le paramètre de chemin (pk). En héritant de ʻAPIView, il est possible d'ajouter des traitements correspondant à chaque méthode en préparant une fonction pour chaque méthode HTTP.

Modification de 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())
]

Modifiez également ʻurls.pydans le dossierdynamo_opration`

dynamo_opration/urls.py


from django.urls import path, include

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

Vérifier le fonctionnement avec la commande curl

démarrer le serveur

$ python manage.py runserver

GET (recherche complète)

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

#réponse
[{"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/

Table après requête POST スクリーンショット 2020-08-10 23.16.38.png

L'élément pêche a été ajouté.

GET (single)

Obtenir un article Apple

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

#réponse
{"name":"apple","price":"100"}

PUT Changer le prix de la pomme de 100-> 200

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

Tableau après demande PUT スクリーンショット 2020-08-10 23.21.52.png

DELETE Supprimez l'élément pêche.

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

Tableau après la demande DELETE スクリーンショット 2020-08-10 23.23.47.png

en conclusion

J'ai créé une API REST qui exploite DynamoDB avec django REST Framework + boto3. Cette fois, j'ai préparé dynamodb_model.py pour gérer le modèle, mais cela n'a peut-être pas été nécessaire (j'aimerais améliorer la conception ici à l'avenir).

Recommended Posts

Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Essayez de créer une application Todo avec le framework Django REST
Comment créer une API Rest dans Django
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Créer une application Todo avec Django REST Framework + Angular
La première API à créer avec le framework Python Djnago REST
Essayez de créer un article de Qiita avec l'API REST [Préparation environnementale]
Framework Django REST Un peu utile à savoir.
Créer une API avec Django
Comment créer un sous-menu avec le plug-in [Blender]
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
Créons-le en appliquant Protocol Buffer à l'API avec Serverless Framework.
Créer une page d'accueil avec django
Créer une API autour de l'authentification des utilisateurs avec Django REST Framework
Comment générer automatiquement un document API avec le framework Django REST et POST à partir de l'écran de document
Lorsque vous souhaitez filtrer avec le framework Django REST
Créez une carte thermique de tweet avec l'API Google Maps
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
Transition vers l'écran de mise à jour avec le Django a tag
Framework Django REST avec Vue.js
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 3 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 4 ~
Comment écrire une validation personnalisée dans Django REST Framework
Comment réinitialiser le mot de passe via l'API à l'aide du framework Rest Django
Probablement le moyen le plus simple de créer un pdf avec Python 3
Créez une API Web capable de fournir des images avec Django
Créez une API d'intégration sociale pour les applications smartphone avec Django
Utilisez Nutanix avec l'API REST, partie 2
Étapes pour créer un projet Django
[Django] Utiliser MessagePack avec le framework Django REST
Créer un téléchargeur de fichiers avec Django
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
Créez un alias pour Route53 vers CloudFront avec l'API AWS
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Implémentation de CRUD à l'aide de l'API REST avec Python + Django Rest framework + igGrid
Les utilisateurs de Rails essaient de créer un moteur de blog simple avec Django
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon
Comment envoyer une requête à l'API DMM (FANZA) avec python
Comment créer une API de machine learning sans serveur avec AWS Lambda
Comprendre la commodité de Django Rest Framework
CRUD GET avec Nuxt & Django REST Framework ②
Notes diverses sur le framework Django REST
API REST facile avec API Gateway / Lambda / DynamoDB
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
J'ai changé le générateur de jetons jwt en simplejwt avec Django Rest Auth.
Comment gérer les caractères déformés dans json de Django REST Framework
[AWS SAM] Créer une API avec DynamoDB + Lambda + API Gateway
Le moyen le plus simple de démarrer avec Django
Comment développer une application de panier avec Django
Créons une API REST en utilisant SpringBoot + MongoDB
Créez un tableau de bord pour les appareils réseau avec Django!
Étapes pour créer un bot Twitter avec Python
Enregistrer l'objet dans un fichier avec pickle
Procédure de création d'application multi-plateforme avec kivy
Créez une application Hello World avec un seul fichier avec django
Créez un outil de traduction avec Translate Toolkit
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser
Créez une API REST à l'aide du modèle appris dans Lobe et TensorFlow Serving.
Solution lorsque Not Found apparaît lors de la frappe de l'API de Django REST Framework de l'extérieur
Notez la solution car django n'a pas pu s'installer avec pip