Bisher haben wir ein Beispiel für eine Webanwendung gesehen, die eine HTML-Antwort zurückgibt.
Als Nächstes erstellen wir ein Beispiel, das JSON als Backend einer iOS / Android-App zurückgibt. Sie können ein Modul einführen, das eine REST-API erstellt, z. B. Django REST Framework, aber ich werde es zuerst selbst schreiben.
Erstellen Sie eine Anwendung namens api unter dem mybook-Projekt.
$ python manage.py startapp api
Die folgenden Dateien wurden im Verzeichnis des mybook-Projekts erstellt.
mybook/
api/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
Grundsätzlich wird das json-Modul verwendet, um ein Python-Wörterbuchobjekt in JSON zu konvertieren.
import json
data = {'id': 1, 'name': 'hoge'}
json_str = json.dumps(data, ensure_ascii=False, indent=2)
Da sich das Python-Wörterbuch jedoch in keiner bestimmten Reihenfolge befindet, befindet sich auch der Inhalt des JSON in keiner bestimmten Reihenfolge.
Also verwenden wir Sammlungen. OrderedDict bestellte Wörterbuch.
Beachten Sie, dass OrderedDict von Python 2.7 aus verwendet werden kann. Wenn die Serverumgebung Python 2.6 oder niedriger ist, verwenden Sie orderdict.
api / views.py
sieht folgendermaßen aus:
import json
from collections import OrderedDict
from django.http import HttpResponse
from cms.models import Book
def render_json_response(request, data, status=None):
"""Antwort in JSON zurückgeben"""
json_str = json.dumps(data, ensure_ascii=False, indent=2)
callback = request.GET.get('callback')
if not callback:
callback = request.POST.get('callback') #Für JSONP mit 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):
"""Gibt einen JSON mit Büchern und Impressionen zurück"""
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 () unterstützt auch JSONP. Es kann nicht nur auf die API von Smartphones angewendet werden, sondern auch, um JSON mit Ajax von Javascript zu erwerben.
Erstellen Sie eine neue Datei mit dem Namen "api / urls.py" und schreiben Sie wie folgt.
from django.urls import path
from api import views
app_name = 'api'
urlpatterns = [
#Bücher
path('v1/books/', views.book_list, name='book_list'), #Aufführen
]
Fügen Sie diese api / urls.py
in das mybook / urls.py
Ihres Projekts ein.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('cms/', include('cms.urls')),
path('api/', include('api.urls')), #Hier hinzufügen
path('admin/', admin.site.urls),
]
Sie müssen dem Projekt mitteilen, dass Sie die API-Anwendung installiert haben.
Es gibt weder ein Modell noch eine Vorlage, daher funktioniert es ohne sie, aber machen wir es vorerst.
Wenn ich api / apps.py
öffne, wird eine Klasse namens ApiConfig definiert.
Fügen Sie dies am Ende von "INSTALLED_APPS" in "mybook / settings.py" mit der Zeichenfolge "api.apps.ApiConfig", "hinzu.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cms.apps.CmsConfig', #CMS-Anwendung
'api.apps.ApiConfig', #API-Anwendung
'bootstrap4', # django-bootstrap4
]
Öffnen Sie dann die folgende URL in Ihrem Browser.
http://127.0.0.1:8000/api/v1/books/
Das Ergebnis ist wie folgt.
{
"books": [
{
"id": 1,
"name": "Erste Schritte mit Django",
"publisher": "GeekLab.Nagano",
"page": 100,
"impressions": [
{
"id": 1,
"comment": "ah ah\r\n gut"
},
{
"id": 2,
"comment": "Uuu\r\n ja"
},
{
"id": 4,
"comment": "Kommentar\r\n."
}
]
},
{
"id": 2,
"name": "Buch 2",
"publisher": "GeekLab.Nagano",
"page": 200,
"impressions": []
}
]
}
JSON ist in Ordnung, wenn Sie Daten an iOS / Android-Apps senden. Was ist jedoch, wenn Sie Daten empfangen möchten?
Beim Empfang in JSON können Sie die JSON-Zeichenfolge aus raw_post_data in der Anforderung extrahieren.
import json
def xxxx_post(request):
python_obj = json.loads(request.raw_post_data) #Lassen Sie den Hauptteil der Anforderung direkt an die JSON-Zeichenfolge POSTEN
:
Wenn Sie nur die Smartphone-API erstellen möchten, können Sie die Funktion der Django-Verwaltungssite verwenden, um Daten einzugeben und nur den API-Teil zu schreiben. Sie können ganz einfach ein Backend für Ihr Smartphone erstellen.
Wenn Sie ernsthaft eine API erstellen möchten, sollten Sie Django REST Framework einführen.
Dies ist das Ende dieses Kurses.
Nach diesem Kurs können Sie die offiziellen Tutorials 1 bis 7 ausprobieren, um Ihr Verständnis zu vertiefen.
Recommended Posts