[PYTHON] Créez une API Web capable de fournir des images avec Django

Aperçu

Cet article vous guide à travers les étapes d'un débutant développant un service de livraison de coupons pour l'iPhone avec une API RESTful et rapide. C'est une mise en œuvre très détour car elle a été mise en œuvre en examinant les éléments techniques un par un.

La fonction d'authentification a été implémentée dans la précédente Implémentation de la fonction d'authentification API par JWT dans Django Rest Framework, et elle est devenue une API qui peut résister à une utilisation pratique dans une certaine mesure. Cependant, la situation actuelle est que les coupons actuels ne sont que des informations textuelles et sont faibles en termes de visuels.

Par conséquent, cette fois, nous utiliserons un package appelé "Pillow" pour gérer les fichiers image dans Django afin que les images de coupon puissent également être distribuées par API.

Même lors de la création d'une nouvelle API qui gère les images avec Django, la partie liée à "Pillow" est la même, donc j'espère que cela vous sera utile.

Mécanisme d'affichage des images côté client via l'API Web

  1. Maintenez l'image sur le serveur du côté de l'API Web
  2. Répondez à la demande avec Json l'URL de l'image
  3. Le client accède à nouveau au serveur pour acquérir l'image et l'afficher à l'écran.

référence

environnement

procédure

installer l'oreiller

Étant donné que mon environnement est un environnement virtuel de python avec pipenv, après être entré dans le shell de pipenv, installez oreiller comme suit. Après l'installation, vérifiez le Pipfile pour confirmer que l'oreiller est installé.

$ pipenv install pillow
$ cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
django = "*"
djangorestframework = "*"
django-filter = "*"
djangorestframework-jwt = "*"
pillow = "*"← ajouté

[requires]
python_version = "3.7"

Si vous créez un environnement avec pip ou pip3,

$ sudo pip install pillow
Ou
$ sudo pip3 install pillow

Installez avec.

Définir un modèle

Ajoutez un champ de modèle pour stocker l'image dans la classe Coupon de models.py. Si vous installez oreiller, vous pouvez utiliser le type de champ ʻImageField` qui gère les fichiers image.

La définition est comme ça. ʻUpload_to = `part est le minimum requis.

[Nom de domaine] = models.ImageField(upload_to=‘[Chemin relatif du dossier contenant les fichiers image]’)

Le point de départ du "chemin relatif du dossier qui stocke le fichier image" est le chemin spécifié dans MEDIA_ROOT défini dans settings.py.

Comme indiqué ci-dessous, j'ai ajouté un ImageField avec l'image du nom de champ. Dans mon cas, j'ai eu une erreur lors de la création du fichier de migration sauf si j'ai autorisé null(null = True).

models.py



class Coupon(models.Model):
    code = models.CharField(max_length=20)
    benefit = models.CharField(max_length=1000)
    explanation = models.CharField(max_length=2000)
    image = models.ImageField(upload_to='images/', null=True) #ajouter à
    store = models.CharField(max_length=1000)
    start = models.DateField()
    deadline = models.DateField()
    status = models.BooleanField()

Définissez MEDIA_ROOT et MEDIA_URL dans settings.py

Comme mentionné ci-dessus, dans settings.py sous le dossier du nom du projet, spécifiez l'URL du point de départ lors du référencement du fichier image avec un chemin relatif dans MEDIA_ROOT. Dans mon cas, je voulais créer un dossier pour stocker les fichiers image sous le dossier de l'application, j'ai donc spécifié l'URL du dossier de l'application. Puisque le dossier du projet est défini par BASE_DIR, il est décrit comme suit.

Il semble que le dossier pour stocker le fichier image soit automatiquement généré lorsque l'image est téléchargée pour la première fois, mais je ne le savais pas, donc je l'ai fait moi-même avec mkdir images.

ami_coupon_api/settings.py


MEDIA_ROOT = os.path.join(BASE_DIR, 'coupon')

MEDIA_URL spécifie l'adresse de départ lors du référencement par URL. Dans mon cas, l'adresse lors de l'obtention des données du modèle de coupon est [ip (domaine)]: [port] / api / coupons /, donc en faisant référence à l'image, [ip (domaine)]: [port ] / api / coupons / images a été défini à partir de / api / coupons /.

Dossier de nom de projet/settings.py


MEDIA_URL = '/api/coupons/'

Ajouter des paramètres à urls.py

Il est nécessaire de définir dans urls.py pour faire référence à l'image par URL. Ouvrez urls.py sous le répertoire du nom du projet et ajoutez l'instruction d'importation et la déclaration urlpatterns suivantes. C'est un paramètre permettant de gérer des fichiers statiques tels que des images, et il semble qu'il puisse être géré presque comme une phrase fixe.

ami_coupon_api/urls.py


from django.conf import settings #Ajouté pour référence d'image
from django.contrib.staticfiles.urls import static #Ajouté pour référence d'image
from django.contrib.staticfiles.urls import staticfiles_urlpatterns #Ajouté pour référence d'image


urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Ajoutez des paramètres à psettings.py si nécessaire

Si vous utilisez Django Rest Framework et que vous avez défini un champ de modèle qui répond à serializer.py, modifiez le paramètre pour répondre à l'URL du fichier image.

La partie de fields = ci-dessous. Dans le cas de `` __ all __ '', il s'agit d'un paramètre qui répond aux valeurs de tous les champs de modèle, donc aucune modification n'est nécessaire.

serializer.py



from rest_framework import serializers
from .models import Coupon

class CouponSerializer(serializers.ModelSerializer):
    class Meta:
        model = Coupon
        fields = '__all__'

Émigrer

Depuis que j'ai changé la définition du modèle, je vais le migrer pour refléter le changement dans la DB.

Créez un fichier de migration → Migrer. (Si vous utilisez pipenv, exécutez-le dans le shell de l'environnement virtuel)

$ python manage.py makemigrations [nom de l'application]
$ python manage.py migrate

Contrôle de fonctionnement

Cela complète les paramètres de gestion des fichiers image, j'ai donc utilisé la page d'administration de django pour saisir directement l'image et vérifier si elle est réellement affichée.

Vous pouvez mettre à jour l'image en lançant le serveur django, en vous connectant à la page d'administration de django et en ouvrant la page du modèle de coupon. Mettez à jour directement l'image créée pour le coupon. edit_data.png

Utilisez ensuite la commande curl pour obtenir le json de la réponse à la requête GET.

$ curl -X GET http://127.0.0.1:8000/api/coupons/

Comme indiqué ci-dessous, l'URL du fichier image est incluse, alors copiez-la et accédez-y avec un navigateur.

[{"id": 1, "code": "0001", "bénéficier": "1 000 yens de remise sur le paiement", "explication": "Limité aux clients utilisant 5 000 yens ou plus. Ne peut être utilisé avec d'autres coupons. "," image ":" ** http://127.0.0.1:8000/api/coupons/images/coupon-image-001_GKrT1ju.png ** "," store ":" Tous les magasins "," start ":" 2019 -10-01 "," date limite ":" 2019-12-31 "," status ": true}

Si l'image du coupon défini dans le navigateur s'affiche, cela signifie que l'opération réussit. coupon_image.png

Recommended Posts

Créez une API Web capable de fournir des images avec Django
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez un programme qui peut générer votre image préférée avec Selenium
[Python / Django] Créer une API Web qui répond au format JSON
Créez un BOT qui peut appeler des images enregistrées avec Discord comme des pictogrammes
Créez une application Web qui peut être facilement visualisée avec Plotly Dash
Créer une API avec Django
Créer une page d'accueil avec django
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Développer une API Web qui renvoie les données stockées dans DB avec Django et SQLite
Créer une application Web avec Django
(Pour les débutants) Essayez de créer une API Web simple avec Django
Créez une API d'intégration sociale pour les applications smartphone avec Django
Créer un téléchargeur de fichiers avec Django
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Page de création de décalage)
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Créez une application Web simple avec Flask
Créer un service Web avec Docker + Flask
J'ai fait une application WEB avec Django
Le panneau Web LXC qui peut faire fonctionner LXC avec un navigateur était merveilleux
[Peut être fait en 10 minutes] Créez rapidement un site Web local avec Django
Créer une page qui se charge indéfiniment avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créez un tableau de bord pour les appareils réseau avec Django!
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
Essayez de créer une application Todo avec le framework Django REST
Créez un chatbot prenant en charge la saisie gratuite avec Word2Vec
Créer une application Todo avec Django ③ Créer une page de liste de tâches
Retour sur la création d'un service Web avec Django 2
Créez un lot d'images et gonflez avec ImageDataGenerator
Créez une carte thermique de tweet avec l'API Google Maps
Créer une application Todo avec Django ⑤ Créer une fonction d'édition de tâches
Créer un environnement django avec docker-compose (MariaDB + Nginx + uWSGI)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Ecrire un modèle de base)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Traitement d'authentification)
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Expérience sur la page d'administration)
Créez une PythonBox qui sort avec Random après l'entrée PEPPER
Créez une caméra de surveillance WEB avec Raspberry Pi et OpenCV
Enregistrez des images avec le web scraping
Créons un script qui s'enregistre avec Ideone.com en Python.
Lancez un serveur WEB simple qui peut vérifier l'en-tête
Créez un jeu de vie mis à jour manuellement avec tkinter
Configurer un serveur Web avec CentOS7 + Anaconda + Django + Apache
Un script qui facilite la création de menus riches avec l'API de messagerie LINE
Créer une application Web avec Django
API Web avec Python + Falcon
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Conception du modèle de base de données)
Créer un écran de connexion Django
Créer une application Todo avec Django ① Créer un environnement avec Docker
Combinez deux images avec Django
Web en temps réel avec les chaînes Django
Créer un répertoire avec python
J'ai créé un plug-in qui peut faire "Daruma-san tombé" avec Minecraft
Faisons un diagramme sur lequel on peut cliquer avec IPython