[PYTHON] J'ai créé une API Web

introduction

Cet article concerne le 21e jour du Calendrier de l'Avent Volare 2019.

Cette fois, j'ai créé l'API de l'application iOS pour la première fois. En partie parce que j'étudie, j'ai essayé de créer une API en utilisant le Django REST Framework, donc j'aimerais écrire à ce sujet: détendu: L'article sur le côté iOS de l'application créée est ici

À propos de l'appli

La principale cible de la création d'applications est les étudiants vivant seuls comme nous: dark_sunglasses: Pour plus de détails sur la façon dont l'application a été choisie, Il est difficile de penser aux menus lors de la cuisson, mais les applications existantes recherchent en regardant ce qu'il y a dans le réfrigérateur. → La cible des existantes est pour les personnes

J'aime ça. J'ai trouvé pratique d'avoir une application qui présente automatiquement les menus en saisissant "Je n'aime pas"! → En gros, je ne fais pas grand-chose, je veux faire ce que j'aime à tout moment (il n'y a pas beaucoup d'ingrédients dans le réfrigérateur: fantôme :)

J'ai décidé de partir d'un tel point! (Si vous n'avez pas le même concept, faisons-en un: détendu :)

Ryu-chan, qui développe l'équipe ensemble, explique l'application. Cette fois, j'étais en charge de ce backend.

Ce que vous avez mis en œuvre

Dans le back-end, nous avons implémenté les 5 fonctions suivantes!

J'étais en charge de trois d'entre eux, donc j'écrirai sur cette partie!

Authentification d'utilisateur

from main.models import User, FoodConfigParam
from main.serializers import AuthSerializer
from rest_framework.generics import GenericAPIView
from rest_framework.exceptions import AuthenticationFailed
from rest_framework.response import Response
import random

from rest_framework_jwt.settings import api_settings
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

class RegisterAuthView(GenericAPIView):
    permission_classes = ()
    serializer_class = AuthSerializer
    def post(self, request):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        #Renvoie le jeton si uuid est enregistré
        if User.objects.filter(uuid=serializer.data['uuid']):
            user = User.objects.get(uuid=serializer.data['uuid'])
            payload = jwt_payload_handler(user)
            return Response({
                'token': jwt_encode_handler(payload),
            })

        user = User.objects.create_user(uuid=serializer.data['uuid'])
        user.save()
        if not user:
            raise AuthenticationFailed()
        payload = jwt_payload_handler(user)
        #Ajouter des ingrédients par défaut lors de l'inscription en tant qu'utilisateur
        user = User.objects.filter(uuid=serializer.data['uuid']).last()
        food = FoodConfigParam()
        food.create_defaultfood(user=user)
        return Response({
            'token': jwt_encode_handler(payload),
        })

Nous vérifions s'il y a un utilisateur dans la base de données qui correspond à l'UUID envoyé, et sinon, nous créons un utilisateur.

Affichage de la liste des ingrédients et changement de lot pour chaque utilisateur

from main.models import FoodConfigParam
from main.serializers import FoodConfigParamSerializer
from rest_framework.generics import GenericAPIView
from rest_framework.views import APIView
from rest_framework.response import Response

class UserFoodConfig(GenericAPIView):
    queryset = FoodConfigParam.objects.all()
    serializer_class = FoodConfigParamSerializer

    def get(self, request):
        foodConfigParams = FoodConfigParam.objects.filter(user=request.user)
        serializer = FoodConfigParamSerializer(foodConfigParams, many=True)
        return Response({'data': serializer.data})

    def put(self, request):
        res = []
        for config in request.data['data']:
            name = config['name']
            rate = config['rate']
            #Extraire ceux qui correspondent à l'utilisateur enregistré et au nom de l'ingrédient
            foodConfigParam = FoodConfigParam.objects.get(user=request.user, name=name)
            #Changement de probabilité
            serializer = FoodConfigParamSerializer(foodConfigParam, data={'rate': rate}, partial=True)
            serializer.is_valid(raise_exception=True)
            serializer.save()
            res.append(serializer.data)
        return Response({'data': res})

Ceux qui correspondent à l'utilisateur et au nom de l'ingrédient sont extraits et le taux d'apparition est modifié.

Ce qui était difficile

L'API que j'ai créée ne fonctionnait pas bien ou fonctionnait, mais elle fonctionnait de manière inattendue lors de la connexion à iOS. Côté iOS, il semble qu'il y ait plusieurs choses comme éviter autant que possible d'écrire de la logique et réduire le nombre de communications, Je sentais que si je n'avais pas plus de connaissances sur la face avant, je ne pourrais pas communiquer et ce serait difficile ... J'ai consulté le côté iOS et j'ai continué tout en discutant de la facilité de le faire, et j'ai appris.

en conclusion

Cette fois, je faisais quelque chose qui fonctionne pour le moment, donc je ne comprends toujours pas RESTful: pleurer: J'ai donc décidé de connaître les bienfaits de django-rest-framework et d'étudier afin de pouvoir en tirer le meilleur parti. Merci d'avoir lu jusqu'au bout.

Recommended Posts

J'ai créé une API Web
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai essayé de faire un "putain de gros convertisseur de littérature"
J'ai créé une API de recherche de château avec Elasticsearch + Sudachi + Go + echo
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai créé un éditeur de texte simple en utilisant PyQt
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer un linebot (préparation)
J'ai essayé de toucher l'API COTOHA
J'ai essayé de comparer le cadre d'application Web
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer un système qui ne récupère que les tweets supprimés
Rubyist a essayé de créer une API simple avec Python + bouteille + MySQL
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé de déboguer.
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
Je veux faire de matplotlib un thème sombre
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé de créer une méthode de super résolution / SRCNN ①
Je veux faire un jeu avec Python
J'ai essayé de faire de l'IA pour Smash Bra
J'ai lu "Comment créer un laboratoire de piratage"
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai essayé de créer une méthode de super résolution / SRCNN ③
J'ai essayé de créer une méthode de super résolution / SRCNN ②
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ①
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ②
J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
Je souhaite créer une application Web en utilisant React et Python flask
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé d'apprendre PredNet
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai essayé d'organiser SVM.
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
J'ai essayé d'implémenter un pseudo pachislot en Python
Suite ・ J'ai essayé de créer Slackbot après avoir étudié Python3
[Go + Gin] J'ai essayé de créer un environnement Docker
J'ai essayé de découvrir notre obscurité avec l'API Chatwork