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.
É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.
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()
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/'
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)
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__'
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
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.
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.
Recommended Posts