[PYTHON] Comprendre la commodité de Django Rest Framework

introduction

Cet article est une suite de Last. L'article précédent décrivait la partie conceptuelle de l'API. Cette fois, j'aimerais créer une API en utilisant Python et Django. L'API créée cette fois-ci est aussi simple que d'envoyer des données (à partir du navigateur) et de les enregistrer dans la base de données, et de les déplacer vers n'importe quel point de terminaison pour afficher les données dans la base de données. Il crée également des API sans utiliser ** Django Rest Framework **. La raison en est que je pensais pouvoir comprendre la commodité du framework Django Rest en construisant avec du ** code Python ** sans utiliser le framework fourni par Django.

Personne cible

Ceux qui connaissent la grammaire de base de Python et ceux qui connaissent le mécanisme de base de Django. (L'installation et l'installation de Django sont considérablement omises.)

Réglage initial

Le premier élément important dans la création d'une API est le ** type de données à gérer **. L'envoi de données à l'API ne signifie pas qu'elles seront stockées dans la base de données sans autorisation, mais l'API stockera les données en fonction du modèle des données conçu dans ** models.py **. Commencez par définir la partie ** quel type de données traiter ** dans le modèle.

models.py


from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    timestamp = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.title

Cette fois, j'ai conçu un modèle qui suppose que les données du blog sont gérées par l'API. Données qui ont un titre, le contenu de l'article, la date et l'heure de publication. Si vous pouvez écrire un modèle, passons à ** migrer **. Ensuite, enregistrez ** Post ** dans ** admin.py ** et entrez des données de test à partir de la page d'administration. Entrez une valeur appropriée pour chaque élément et enregistrez-la comme indiqué dans la figure ci-dessous. スクリーンショット 2020-02-06 13.08.20.png

Afficher les données sur n'importe quel point de terminaison

Maintenant, affichons les données enregistrées à partir de la page d'administration sur n'importe quel point de terminaison. La première chose à retenir est que les API modernes renvoient des ** données JSON ** lorsque vous envoyez une requête. Par conséquent, la valeur de retour de la fonction posts de ** views.py ** est ** JsonResponse **. En dehors de cela, le code simple rapproche ** QuerySet ** des données JSON. Tournez le QuerySet avec une instruction for pour en faire un type de dictionnaire et placez-le dans la liste. A partir de là, Django fera le travail pour vous, et les données de type dictionnaire dans la liste Python seront automatiquement ** sérialisées ** en données JSON.

views.py


from .models import Post

def posts(request):

    posts = Post.objects.all()
    post_list = []
    for post in posts:
        post_dict = {
            'pk': post.pk,
            'title': post.title,
            'description': post.description,
            'timestamp': post.timestamp,
        }
        post_list.append(post_dict)

    return JsonResponse(post_list, safe=False)

    # non-Pour convertir des données de type dict en données JSON"safe=False"Décrire.

Créez n'importe quel point de terminaison.

urls.py


from application_name.views import posts #ajouter à

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/post/', posts), #ajouter à
]

À ce stade, configurons un serveur local une fois et passons au point de terminaison créé. Je n'ai pas eu besoin de saisir la clé primaire cette fois, mais c'est pratique lors de la vérification lors de tests comme celui-ci. J'ai pu confirmer correctement les données, donc ce fut un succès! Vient ensuite la requête POST. スクリーンショット 2020-02-06 13.49.16.png

Traitement d'écriture pour la requête POST

Le rôle de l'API utilisant Django est de stocker de nouvelles données basées sur models.py dans la base de données lorsqu'elles sont envoyées via une ** requête POST **. C'est difficile à comprendre même si j'écris un peu, donc pour expliquer brièvement, le rôle du côté API est de ** traiter ** et ** sauvegarder ** les données envoyées sous une forme facile à sauvegarder. Alors ensuite, j'écrirai le code à traiter et enregistrer.

views.py


#Ajoutez le code suivant. L'instruction if suivante est écrite au-dessus du traitement de la requête GET.
from django.http import HttpResponse
import json

def posts(request):

    if request.method == 'POST':
        data = json.loads(request.body)
        post = Post(
            title=data['title'],
            description=data['description'],
            )
        post.save()
        return HttpResponse(201)

    posts = Post.objects.all()
    # ~~Ce qui suit est omis~~

** Django ** n'a pas de fonction standard pour ** désérialiser ** automatiquement (renvoyer les données JSON sous une forme gérable) pour les données JSON envoyées, donc le code à désérialiser est fourni. Vous devez l'écrire. Cette fonctionnalité est nécessaire car elle ne peut être enregistrée dans la base de données que si elle est restaurée dans un format de données pouvant être géré par Python. Placez les données JSON dans une variable appropriée et désérialisez (processus) à l'aide de cette variable. De plus, ** Django ** n'a pas la capacité de sauvegarder automatiquement les données des vues, donc écrivez explicitement ** post.save ** à la fin.

En fait envoyer une demande POST

Cette fois, j'aimerais utiliser ** axios ** pour envoyer une ** requête POST ** à l'API. Si vous souhaitez implémenter ** ajax ** dans votre propre application, il est recommandé d'utiliser la ** bibliothèque axios ** de Javascript. Tout d'abord, créez une page dans des modèles pour envoyer une requête POST. Ajoutez axios à cette page en utilisant ** cdn **.

main.html



    <body>
        <p>Test Page</p>   
    </body>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script> #Ajouter avec cdn
</html>

Créé avec ** fonction basée ** dans la vue. Faites également le routage.

views.py


def main_page(request):
    return render(request, 'main.html', context=None)

urls.py


from application_name.views import main_page #ajouter à

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', main_page),    #Ajouter un itinéraire
    path('api/post/', posts),
]

Configurez un serveur local et accédez à l'URL où ** main.html ** est affiché. Vérifions donc si l'API fonctionne correctement depuis la console ** des outils de développement **. Étant donné que les données envoyées par la requête POST doivent être des ** données JSON **, faites-en un type de dictionnaire. Faites-en une variable par souci de clarté en tant qu'argument.

console


/* 
Créer une fonction asynchrone
Envoyer une demande et répondre
Je veux attendre car il faut du temps pour envoyer une demande
Le point de terminaison de l'API peut être un chemin relatif car le serveur est déjà opérationnel
*/

async function addPost(title, description) {
    const response = await axios.post('api/post/', {'title': title, 'description': description})
    console.log(response)
}

//Instanciation
addPost('sending from axios', 'some test messages')

Cependant, si vous faites cela, vous devriez obtenir une instruction d'erreur ** 403 Forbidden **. Lorsque le 403 revient ainsi, vous pouvez voir toutes les ** requêtes ** que vous avez envoyées dans les outils de développement du navigateur ** Réseau **. Comme vous pouvez le voir dans l'image ci-dessous, vous pouvez voir la partie (données) de la charge utile que vous essayiez d'envoyer. スクリーンショット 2020-02-05 17.09.40.png Ensuite, si vous regardez la partie ** Response **, vous verrez des ** instructions html ** que vous voyez souvent. Pour faciliter l'affichage de cette réponse dans votre navigateur, copiez la ** instruction html de réponse ** et réécrivez-la avec ** innerHTML **. C'est un peu difficile à expliquer avec des mots, alors jetez un œil au code ci-dessous.

console


document.querySelector('body').innerHTML = `Instruction HTML de réponse`

Si vous l'exécutez avec ceci, vous devriez voir que l'erreur vient du côté de Django. Je mettrai l'écran d'erreur ci-dessous. Si vous regardez la déclaration d'erreur, vous pouvez voir que la ** vérification CSRF ** a échoué. Si vous utilisez le formulaire avec Django, cela indique que vous pouvez utiliser ** csrf_token **, mais cette fois nous envoyons des données en utilisant ajax, donc cette méthode ne peut pas le résoudre. Pour faire ajax dans Django, utilisez une méthode que vous n'utilisez pas normalement. スクリーンショット 2020-02-05 17.56.22.png Pour expliquer le flux de la ** vérification CSRF ** en premier lieu, Django montre que la face avant accède aux données du même site au lieu d'y accéder depuis un autre emplacement, et Django les reçoit. Donne des autorisations de données au recto. Si vous pensez à nouveau à ** 403 Forbidden ** avec cela à l'esprit, vous pouvez voir que cela signifie que vous n'avez pas l'autorité (l'autorisation) pour gérer les données. Cependant, comme mentionné précédemment, le formulaire n'est pas utilisé, donc ** csrf_token ** ne peut pas être utilisé. Donc cette fois, mettez csrf_token dans ** Cookie ** et collez-le dans un fichier javascript.

sample.js


axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"

À l'origine, en collant le code ci-dessus en haut du ** fichier js ** qui envoie la requête ajax, vous pouvez faire la requête en utilisant axios have ** Cookie ** avec csrf_token par défaut. Je vais. Cela devrait résoudre l'erreur précédente. Puisque nous n'aurons aucune fonction autre que la communication ajax utilisant Javascript cette fois, créez un fichier js avec un nom arbitraire et écrivez uniquement le code ci-dessus. Chargez (connectez) ce fichier avec ** main.html ** comme indiqué ci-dessous, et faites-le également fonctionner sur la console des outils de développement.

main.html



    <body>
        <p>Test Page</p>   
    </body>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script type="text/javascript" src="{% static 'sample.js' %}"></script> #ajouter à
</html>

Lorsque je mets une valeur dans l'argument dans la console et que je l'instancie comme auparavant, le code d'état 201 est renvoyé sans aucune erreur cette fois. En d'autres termes, c'est un succès! スクリーンショット 2020-02-05 21.49.44.png Pour le moment, accédez au point de terminaison ** 'api / post /' ** et vérifiez si les données POSTÉES s'affichent correctement. スクリーンショット 2020-02-05 23.22.02.pngプライマリーキーが3のデータが先ほど追加したデータなので、ちゃんとGET, POSTリクエストが動いていることが分かります。

Pourquoi utiliser Django Rest Framework

Tout d'abord, je pense que la raison principale est que ** Django Rest Framework ** (DRF) réduit considérablement le code lié au traitement des données et à l'authentification que nous ne traitons pas cette fois. Cependant, je pense que la prochaine raison est que les verbes HTTP tels que PUT, PATCH et DELETE seront disponibles. Normalement, ** Django ** les ignore, vous ne pouvez donc pas l'utiliser si vous le souhaitez. ** DRF ** gère facilement les autres requêtes, vous pouvez donc tirer le meilleur parti de sa fonction d'API. Je pense qu'il y a beaucoup d'autres raisons, mais pour le moment, je pense que ce sont les deux principales raisons.

finalement

Comment était le contenu de l'article? Il sert également de mémorandum à moi, et il est devenu assez long, alors merci à ceux qui l'ont lu jusqu'au bout. Si vous avez des erreurs ou des erreurs typographiques, n'hésitez pas à les signaler. La prochaine fois, j'aimerais créer une application simple en utilisant une API externe.

Recommended Posts

Comprendre la commodité de Django Rest Framework
Notes diverses sur le framework Django REST
Bases du framework Django REST
Astuces Django Rest Framework
Essayez de créer une application Todo avec le framework Django REST
[Django Rest Framework] Personnalisez la fonction de filtre à l'aide de Django-Filter
Bloc d'achoppement du framework Django REST
Framework Django REST avec Vue.js
Connectez-vous avec Django Rest Framework
Comment écrire une validation personnalisée dans Django REST Framework
Comprendre le contenu du pipeline sklearn
[Django] Utiliser MessagePack avec le framework Django REST
Implémentation de la fonction d'authentification JWT dans Django REST Framework à l'aide de djoser
Implémentation de CRUD à l'aide de l'API REST avec Python + Django Rest framework + igGrid
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Créer une API RESTful avec Django Rest Framework
J'ai essayé le serveur asynchrone de Django 3.0
Suppression logique dans Django, DRF (Django REST Framework)
[Python3] Comprendre les bases de Beautiful Soup
Un outil administratif qui peut être créé immédiatement avec le framework ng-admin + Django REST
Comment vérifier la version de Django
CRUD GET avec Nuxt & Django REST Framework ②
CRUD POST avec Nuxt & Django REST Framework
CRUD GET avec Nuxt & Django REST Framework ①
Comprendre la partie "temporaire" d'UNIX / Linux
Django REST Framework + Considération de conception d'architecture propre
Prenons la description de docker-compose.yml (Django + MySQL ③)
[Python3] Comprendre les bases des opérations sur les fichiers
Implémentation de la fonction d'authentification du modèle utilisateur personnalisé dans Django REST Framework à l'aide de djoser
Comment gérer les caractères déformés dans json de Django REST Framework
CRUD PUT, DELETE avec Nuxt & Django REST Framework
Sortie exclusive de l'application Django utilisant ngrok
Solution lorsque Not Found apparaît lors de la frappe de l'API de Django REST Framework de l'extérieur
J'ai vérifié la période de rétention de session de django
Framework Django REST Un peu utile à savoir.
L'histoire de l'affichage des fichiers multimédias dans Django
Implémenter la fonctionnalité de connexion JWT dans le framework Django REST
Notes de connaissances nécessaires pour comprendre le framework Python
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser
Le mur lors du passage du service Django de Python 2.7 à la série Python 3
Notes d'apprentissage pour la fonction migrations dans le framework Django (2)
Créer une application Todo avec Django REST Framework + Angular
[Recette du formateur] J'ai touché le flacon du framework Python.
Plus de nouvelles méthodes d'authentification des utilisateurs avec Django REST Framework
Autour de l'installation du framework de gestion de projet Python Trac
Un mémo pour comprendre visuellement l'axe des pandas.
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
[Statistiques] Comprendre le mécanisme des graphiques Q-Q avec animation.
Créer une API autour de l'authentification des utilisateurs avec Django REST Framework
Lorsque vous souhaitez filtrer avec le framework Django REST
Je veux bien comprendre les bases de Bokeh
List, méthode pour les ressources imbriquées dans le framework Django REST
Implémentez l'API à une vitesse explosive en utilisant Django REST Framework
Notes d'apprentissage pour la fonction migrations dans le framework Django (3)
[Django] Changer l'adresse IP par défaut de la commande runserver
[Ev3dev] Comprenons le mécanisme de contrôle LCD (écran)
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
Notes d'apprentissage pour la fonction migrations dans le framework Django (1)
14 quiz pour comprendre la portée étonnamment compliquée de Python