Jusqu'à présent, nous avons vu un exemple d'application Web qui renvoie une réponse HTML.
Ensuite, créons un exemple qui renvoie JSON en tant que backend d'une application iOS / Android. Vous pouvez introduire un module qui crée une API REST, tel que Django REST framework, mais je vais d'abord l'écrire moi-même.
Créez une application appelée api sous le projet mybook.
$ python manage.py startapp api
Les fichiers suivants ont été créés dans le répertoire du projet mybook.
mybook/
api/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
Fondamentalement, il utilise le module json pour convertir un objet de dictionnaire Python en JSON.
import json
data = {'id': 1, 'name': 'hoge'}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
Cependant, comme le dictionnaire Python n'est pas dans un ordre particulier, le contenu du JSON ne sera pas non plus dans un ordre particulier.
Nous utilisons donc le dictionnaire ordonné collections.OrderedDict.
Notez que OrderedDict peut être utilisé à partir de Python 2.7, donc si l'environnement du serveur est Python 2.6 ou inférieur, utilisez ordersdict.
ʻApi / views.py` ressemble à ceci:
import json
from collections import OrderedDict
from django.http import HttpResponse
from cms.models import Book
def render_json_response(request, data, status=None):
"""Renvoyer la réponse en JSON"""
json_str = json.dumps(data, ensure_ascii=False, indent=2)
callback = request.GET.get('callback')
if not callback:
callback = request.POST.get('callback') #Pour JSONP avec POST
if callback:
json_str = "%s(%s)" % (callback, json_str)
response = HttpResponse(json_str, content_type='application/javascript; charset=UTF-8', status=status)
else:
response = HttpResponse(json_str, content_type='application/json; charset=UTF-8', status=status)
return response
def book_list(request):
"""Renvoie un JSON de livres et d'impressions"""
books = []
for book in Book.objects.all().order_by('id'):
impressions = []
for impression in book.impressions.order_by('id'):
impression_dict = OrderedDict([
('id', impression.id),
('comment', impression.comment),
])
impressions.append(impression_dict)
book_dict = OrderedDict([
('id', book.id),
('name', book.name),
('publisher', book.publisher),
('page', book.page),
('impressions', impressions)
])
books.append(book_dict)
data = OrderedDict([ ('books', books) ])
return render_json_response(request, data)
render_json_response () prend également en charge JSONP. Il peut être appliqué non seulement à l'API des smartphones mais aussi pour acquérir JSON avec Ajax de Javascript.
Créez un nouveau fichier appelé ʻapi / urls.py` et écrivez comme suit.
from django.urls import path
from api import views
app_name = 'api'
urlpatterns = [
#Livres
path('v1/books/', views.book_list, name='book_list'), #liste
]
Incluez cet ʻapi / urls.py dans le
mybook / urls.py` de votre projet.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('cms/', include('cms.urls')),
path('api/', include('api.urls')), #Ajouter ici
path('admin/', admin.site.urls),
]
Vous devez indiquer au projet que vous avez installé l'application api.
Il n'y a ni modèle ni modèle, donc cela fonctionne sans lui, mais faisons-le pour le moment.
Lorsque j'ouvre ʻapi / apps.py, une classe appelée ApiConfig est définie. Ajoutez ceci à la fin de ʻINSTALLED_APPS
dans mybook / settings.py
avec la chaîne 'api.apps.ApiConfig',
.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cms.apps.CmsConfig', #application cms
'api.apps.ApiConfig', #application API
'bootstrap4', # django-bootstrap4
]
Ensuite, ouvrez l'URL suivante dans votre navigateur.
http://127.0.0.1:8000/api/v1/books/
Le résultat est le suivant.
{
"books": [
{
"id": 1,
"name": "Premiers pas avec Django",
"publisher": "GeekLab.Nagano",
"page": 100,
"impressions": [
{
"id": 1,
"comment": "Ah ah\r\n bon"
},
{
"id": 2,
"comment": "Uuu\r\n ouais"
},
{
"id": 4,
"comment": "commentaire\r\n."
}
]
},
{
"id": 2,
"name": "Livre 2",
"publisher": "GeekLab.Nagano",
"page": 200,
"impressions": []
}
]
}
JSON convient lors de l'envoi de données vers des applications iOS / Android, mais que faire si vous souhaitez recevoir des données?
Lors de la réception en JSON, vous pouvez extraire la chaîne JSON de raw_post_data dans la requête.
import json
def xxxx_post(request):
python_obj = json.loads(request.raw_post_data) #Avoir le corps de la requête POST directement dans la chaîne JSON
:
Si vous souhaitez créer uniquement l'API smartphone, vous pouvez utiliser la fonction du site de gestion de Django pour saisir les données et n'écrire que la partie API. Vous pouvez facilement créer un backend pour votre smartphone.
Si vous voulez vraiment créer une API, pensez à introduire Django REST framework.
C'est la fin de ce cours.
Après ce cours, vous pourrez approfondir votre compréhension en essayant les tutoriels officiels 1 à 7.
Recommended Posts