Implémentation de CRUD à l'aide de l'API REST avec Python + Django Rest framework + igGrid

Bonjour. Je suis Nakae de l'équipe de conseil technique d'Infrastructuretics Japan Co., Ltd. Notre activité principale est de fournir un support technique et des contenus de formation à nos clients.

Infragistics (IG) est un éditeur de logiciels d'outils de développement. Nous développons et fournissons principalement des composants d'interface utilisateur pour diverses plates-formes. Cette fois, je me concentrerai sur un produit appelé Ignite UI pour jQuery qui peut introduire les composants d'interface utilisateur riches d'IG aux applications Web, quel que soit le langage du backend.

Ignite UI for jQuery https://jp.infragistics.com/products/ignite-ui

L'un des groupes de composants d'interface utilisateur les plus fréquemment utilisés dans IG est le composant de grille. Un composant de grille est un composant qui affiche des données dans une table. L'interface utilisateur Ignite pour jQuery igGrid possède les fonctionnalités intégrées suivantes:

Dans cet article, je vais vous montrer comment combiner une application Web construite avec Python + Django avec Ignite UI pour jQuery afin d'implémenter un igGrid avec la fonctionnalité CRUD.

Django a un framework appelé le framework Django REST qui facilite la mise en œuvre d'une API Web.

Django REST framework https://www.django-rest-framework.org/

De plus, il est possible de lier les données acquises par REST en tant que source de données à l'igGrid d'Ignite UI pour jQuery. Prenez les mesures appropriées contre REST en fonction du contenu des nouveaux ajouts, mises à jour et suppressions de lignes sur la grille.

Mise à jour REST (igGrid) https://jp.igniteui.com/help/iggrid-rest-updating

En combinant ces deux fonctions (le framework Django REST et igGrid pouvant être lié avec REST), il est possible d'implémenter igGrid avec la fonction CRUD très facilement.

L'image de réalisation finale est la suivante. Image from Gyazo

Les données sont répertoriées à l'aide du composant de grille et le traitement des nouveaux ajouts, mises à jour et suppression est géré par l'interface utilisateur. Lorsque vous cliquez sur le bouton Enregistrer, chaque processus est exécuté par l'API et la base de données est mise à jour.

Implémenter REST avec Python + Django

Dans Django, nous partirons du principe que l'intégration de la base de données et de l'application a été implémentée. Si vous êtes nouveau sur Django cette fois, veuillez vous référer au document suivant et continuer avec le contenu jusqu'à «Première création d'application Django, partie 2», puis voir le contenu suivant.

Documentation Django 2.2 https://docs.djangoproject.com/ja/2.2/contents/

Aussi cette fois

Il est implémenté à.

Installation et initialisation du framework Django REST

Installez également django-filter.

$ pip install djangorestframework
$ pip install django-filter

settting.py


INSTALLED_APPS = [
    ...
    'rest_framework',
]

Créer une application pour l'API

$ python manage.py startapp api

Paramètres du modèle

Cette fois, j'ai créé le modèle suivant pour la gestion des commandes.

api/models.py


from django.db import models
# Create your models here.
class Ordering(models.Model):
    Shop = models.CharField(max_length=100) #Nom pour la livraison
    Address = models.CharField(max_length=200) #Adresse de livraison
    TotoalNumber = models.IntegerField(default=0) #Nombre total d'articles
    TotalPrice = models.FloatField(default=0) #le montant

De plus, nous partirons du principe que les données de démonstration ont déjà inclus les éléments suivants.

id Shop Address TotoalNumber TotalPrice
1 Petit plat Hiro Ajimi Hakusancho 1-9-X 27 440
2 Restaurant Ando Shimencho Mitarai 51-X 49 1863.4
... ... ... ... ...

Définition du sérialiseur

Créez un nouveau fichier appelé serializer.py et définissez-le comme suit.

api/serializer.py


# coding: utf-8
from rest_framework import serializers
from .models import Ordering
class orderingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ordering
        fields = ('id', 'Shop', 'Address', 'TotoalNumber', 'TotalPrice')

Paramètres d'affichage

Dans View, définissez un ViewSet qui combine le modèle et le sérialiseur préparés précédemment.

api/views.py


# coding: utf-8
import django_filters
from rest_framework import viewsets, filters
from .models import Ordering
from .serializer import orderingSerializer
class orderingViewSet(viewsets.ModelViewSet):
    queryset = Ordering.objects.all()
    serializer_class = orderingSerializer

Paramètres d'URL

Définissez l'URL. Tout d'abord, créez un nouvel api / urls.py et écrivez comme suit.

api/urls.py


# coding: utf-8
from rest_framework import routers
from .views import orderingViewSet
router = routers.DefaultRouter()
router.register(r'order', orderingViewSet)

Définissez les paramètres de routage suivants dans la route urls.py.

urls.py


from django.contrib import admin
from django.conf.urls import url, include
from django.urls import include, path
from api.urls import router as api_router
urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^api/', include(api_router.urls)),
]

Vous pouvez désormais échanger des données à l'aide de l'API. Démarrez le serveur et essayez d'accéder à l'URL suivante. http://127.0.0.1:8000/api/order/ Image from Gyazo

Vous pouvez confirmer que vous pouvez obtenir toutes les données au format JSON. De la même manière, si vous accédez à l'URL avec l'ID spécifié comme suit, http://127.0.0.1:8000/api/order/1 Image from Gyazo

Seules les données pertinentes peuvent être affichées, et les informations peuvent être mises à jour par PUT et supprimées par DELETE sur cet écran, et il prend également en charge la liaison avec la base de données.

Maintenant que le côté Django est prêt, passons à l'implémentation d'igGrid.

Implémentation d'igGrid et coopération avec REST

Maintenant que nous sommes prêts à accepter le back-end, nous allons commencer à incorporer le front-end. Tout d'abord, ajoutez une nouvelle application pour igGrid.

Créer une application pour igGrid

$ python manage.py startapp grid

Créer un modèle pour igGrid

Créez un nouveau html pour le modèle dans le répertoire grid / templates / grid et modifiez-le. Cette fois, nous décrirons tout dans un index.html sans traitement tel que diviser la partie et le script en parties.

Tout d'abord, les bibliothèques nécessaires ont été chargées à partir du CDN comme suit.

grid/templates/grid/index.html


<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>ig-grid on Django</title>
    <link href="https://cdn-na.infragistics.com/igniteui/2020.1/latest/css/themes/infragistics/infragistics.theme.css" rel="stylesheet">
    <link href="https://cdn-na.infragistics.com/igniteui/2020.1/latest/css/structure/infragistics.css" rel="stylesheet">
    <link href="https://igniteui.github.io/help-samples/css/apiviewer.css" rel="stylesheet" type="text/css">
    <style type="text/css">
        input.button-style
        {
            margin-top: 10px;
        }
    </style>
  </head>
  <body>
  ...
    <script src="https://ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.8.3.js"></script>
    <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
    <script src="https://code.jquery.com/ui/1.10.3/jquery-ui.min.js"></script>
    <script src="https://cdn-na.infragistics.com/igniteui/2020.1/latest/js/i18n/infragistics-ja.js"></script>
    <script src="https://cdn-na.infragistics.com/igniteui/2020.1/latest/js/infragistics.core.js"></script>
    <script src="https://cdn-na.infragistics.com/igniteui/2020.1/latest/js/infragistics.lob.js"></script>
    <script src="https://igniteui.github.io/help-samples/js/apiviewer.js"></script>
    <script src="https://cdn-na.infragistics.com/igniteui/2020.1/latest/js/modules/i18n/regional/infragistics.ui.regional-ja.js"></script>
    <!-- Used to add modal loading indicator for igGrid -->
    <script src="https://www.igniteui.com/js/grid-modal-loading-inicator.js"></script>
  </body>
</html>

De plus, comme méthode de mise en œuvre cette fois, les modifications apportées à chaque ligne de la grille sont temporairement conservées et toutes les modifications sont collectivement validées dans la base de données en cliquant sur le bouton Enregistrer. Dans cet article, je vais omettre l'explication sur la validation par lots. Les détails sont décrits dans les documents suivants, veuillez donc vous y référer.

Grille-Modifier https://jp.igniteui.com/grid/basic-editing

Résumé de la mise à jour (igGrid) https://jp.igniteui.com/help/iggrid-updating

Liaison de données des données REST

Liaison de données à la grille avec RESTDataSource étendu à partir de DataSource pour prendre en charge REST.

ig.RESTDataSource https://jp.igniteui.com/help/api/2020.1/ig.restdatasource

grid/templates/grid/index.html


<script type="text/javascript">
    $(function () {
        var ds = new $.ig.RESTDataSource({
            dataSource : "/api/order/",
            restSettings: {
                create: {
                    url: "/api/order/", //Spécifier le point de terminaison de l'API
                },
            }
        });
        var grid = $("#grid").igGrid({
            dataSource: ds, //Lier RESTDataSource
            type: "json",
            columns: [
                ...
            ],
            primaryKey: "id",
            autoGenerateColumns: false,

Dans l'exemple ci-dessus, / api / order / est spécifié comme point de terminaison de create dans restSettings, donc lorsqu'une nouvelle ligne est créée dans la grille, le POST sera effectué vers / api / order /. De plus, même si vous ne spécifiez aucun autre point de terminaison, DELETE, PUT, etc. interprétera le point de terminaison comme / api / order / 1 comme il convient.

Ajustez le routage et testez une fois dans cet état. Image from Gyazo

J'ai pu afficher une liste de données sur la grille. Cela signifie que le processus GET a réussi avec REST.

Mais qu'en est-il du traitement POST? Testons le processus d'ajout d'une nouvelle ligne. Image from Gyazo

Le traitement POST entraînera une erreur. Il s'agit d'une erreur due au traitement de protection de sécurité effectué du côté Django lorsque le traitement POST est effectué via ajax. Lors de l'utilisation d'ajax pour des mesures de falsification de demandes intersites (CSRF), il est nécessaire de générer et d'accorder un jeton.

Cependant, ig.RESTDataSource n'a pas d'option intégrée pour spécifier un jeton, il doit donc être implémenté d'une autre manière.

Paramètres de jeton CSRF

En utilisant le paramètre beforeSend de la méthode ajaxSetup () de jQuery, il est possible de définir le traitement avant la communication ajax. Spécifiez le jeton pour X-CSRFToken dans l'en-tête de la demande comme indiqué ci-dessous.

Étant donné que Django est livré avec une balise de modèle dès le début qui facilite l'obtention de jetons pour les contre-mesures CSRF, ajoutez la description suivante au script.

grid/templates/grid/index.html


$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
    }
});

Testons-le à nouveau. Image from Gyazo

Les nouvelles données ont été POSTÉES avec succès. Vous pouvez également vérifier l'existence de nouvelles données dans la base de données.

% python manage.py shell
>>> from api.models import Ordering
>>> Ordering.objects.filter(id=21)
<QuerySet [<Ordering: Ordering object (21)>]>

Ensuite, testez le fonctionnement de PUT et DELETE. Supprimez les données nouvellement ajoutées et modifiez la quantité totale de données pour ID20. Image from Gyazo

Si vous cliquez sur le bouton Enregistrer et validez, vous pouvez voir qu'il y a une erreur dans le traitement PUT avec l'instruction d'erreur suivante.

You called this URL via PUT, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining PUT data. Change your form to point to 127.0.0.1:8000/api/order/20/ (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

Django renverra une erreur si l'URL du point de terminaison PUT ne se termine pas par une barre oblique. J'obtiens également cette erreur parce que le point de terminaison PUT par défaut pour ig.RESTDataSource a la forme / api / order / 20 sans barre oblique à la fin.

Il est possible de n'accepter aucune barre oblique en modifiant les paramètres du côté Django, mais ig.RESTDataSource peut également personnaliser le modèle de point de terminaison, nous allons donc modifier ig.RESTDataSource.

RestSettings modifié dans ig.RESTDataSource pour correspondre aux spécifications de Django

grid/templates/grid/index.html


var ds = new $.ig.RESTDataSource({
    dataSource : "/api/order/",
    type: "json",
    restSettings: {
        create: {
            url: "/api/order/",
            template: "/api/order/"
        },
        update: {
            template: "/api/order/${id}/" //Passer à un formulaire se terminant par une barre oblique
        },
        remove: {
            url: "/api/order/"
        }
    }
});

À ce stade, les paramètres de modèle définis pour la mise à jour s'étendent à la création, spécifiez donc la même URL que le point de terminaison initialement donné pour créer comme URL de modèle.

Enfin, ajoutez les deux lignes suivantes comme traitement lorsque vous appuyez sur le bouton Enregistrer.

grid/templates/grid/index.html


grid.igGrid("commit");
grid.igGrid("dataBind");

La colonne ID dans la grille correspond à l'ID qui est la clé primaire sur la table de base de données, mais l'ID attribué sur le serveur frontal ne correspond pas toujours à l'ID qui doit être attribué sur la base de données. Par conséquent, en s'engageant dans la base de données, puis en effectuant à nouveau la liaison de données, l'ID attribué à la base de données est reflété dans la grille.

Jetons un coup d'œil au comportement final de la démo que nous avons créée cette fois. Image from Gyazo

GET, POST, PUT et DELETE peuvent désormais être traités de manière fluide et collective avec REST et igGrid. De plus, je pense que la fonctionnalité est que les rôles du back-end et du front-end peuvent être divisés en utilisant le framework Django REST cette fois.

L'application de démonstration créée cette fois est téléchargée ci-dessous, donc si vous êtes intéressé, n'hésitez pas à la toucher. https://github.com/igjp-kb/Ignite-UI-for-JavaScript/tree/master/igGrid/rest_iggrid

Recommended Posts

Implémentation de CRUD à l'aide de l'API REST avec Python + Django Rest framework + igGrid
CRUD GET avec Nuxt & Django REST Framework ②
CRUD POST avec Nuxt & Django REST Framework
CRUD GET avec Nuxt & Django REST Framework ①
Implémentation de la fonction d'authentification JWT dans Django REST Framework à l'aide de djoser
CRUD PUT, DELETE avec Nuxt & Django REST Framework
Implémentation de la fonction d'authentification du modèle utilisateur personnalisé dans Django REST Framework à l'aide de djoser
Développement et déploiement de l'API REST en Python à l'aide de Falcon Web Framework
[S3] CRUD avec S3 utilisant Python [Python]
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
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 ~
Connectez-vous avec Django Rest Framework
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 5 ~
Comment réinitialiser le mot de passe via l'API à l'aide du framework Rest Django
Implémentation des notifications de bureau à l'aide de Python
Installer le framework Python django à l'aide de pip
Implémentation de la méthode Dyxtra par python
[Django] Utiliser MessagePack avec le framework Django REST
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Créer une API RESTful avec Django Rest Framework
API REST du modèle réalisé avec Python avec Watson Machine Learning (édition CP4D)
Comment gérer les caractères déformés dans json de Django REST Framework
CRUD avec Django
Implémentation de l'arbre TRIE avec Python et LOUDS
Création récente de classement à l'aide de l'API Qiita avec Python
Téléchargement anonyme d'images à l'aide de l'API Imgur (à l'aide de Python)
Implémentation de la fonction d'authentification dans Django REST Framework à l'aide de djoser
Comment générer automatiquement un document API avec le framework Django REST et POST à partir de l'écran de document
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
Django 1.11 a démarré avec Python3.6
Créer une application Todo avec Django REST Framework + Angular
Plus de nouvelles méthodes d'authentification des utilisateurs avec Django REST Framework
Construisez un serveur API pour vérifier le fonctionnement de l'implémentation frontale avec python3 et Flask
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Essayez de créer une application Todo avec le framework Django REST
Obtenez des données LEAD à l'aide de l'API REST de Marketo en Python
Créer une API autour de l'authentification des utilisateurs avec Django REST Framework
Capacité récente de reconnaissance d'image - Résultats de recherche de pointe de MS à l'aide de l'API de vision par ordinateur avec Python
[Question] À propos de la conversion API du chat bot à l'aide de Python
Lorsque vous souhaitez filtrer avec le framework Django REST
Implémentez l'API à une vitesse explosive en utilisant Django REST Framework
Enregistrez des tickets avec l'API de Redmine en utilisant des requêtes Python
[Python] Utilisation de l'API Line [1ère création de Beauty Bot]
Bases du framework Django REST
[Django Rest Framework] Personnalisez la fonction de filtre à l'aide de Django-Filter
Divers mémorandums lors de l'utilisation du sdk de l'API de messagerie LINE avec Python (2.7.9) + Google App Engine
Astuces Django Rest Framework
Implémenter des URL hiérarchiques avec des routeurs imbriqués drf dans le framework Django REST
Création d'une API qui renvoie des résultats d'inférence négatifs-positifs à l'aide de BERT dans le framework Django REST
Éliminez les erreurs qui se produisent lors de l'utilisation de Django REST Swagger avec Django 3.0
Implémentation facile de la fonction de paiement par carte de crédit avec PAY.JP [Django]
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
[Avec une explication simple] Implémentation Scratch d'une machine Boltsman profonde avec Python ②
[Avec une explication simple] Implémentation Scratch d'une machine Boltzmann profonde avec Python ①
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM