[PYTHON] Entwickeln Sie eine Web-API, die in DB gespeicherte Daten mit Django und SQLite zurückgibt

Überblick

Dieser Artikel führt Sie durch die Schritte eines Anfängers, der einen Gutscheinverteilungsdienst für das iPhone mit RESTful API und Swift entwickelt hat. Da es implementiert wurde, während die technischen Elemente einzeln untersucht wurden, ist es eine sehr Umwegimplementierung.

Bis zu den vorherigen Anzeigen von Daten, die von der API in TableView of Swift erfasst wurden, der Web-API, die Couponinformationen liefert, und dem Coupon, der diese Web-API verwendet Die dem Benutzer zu liefernde iPhone-App wurde auf dem erforderlichen Mindestniveau "Super" fertiggestellt. Von hier aus werden wir die Implementierungsmethode, Funktionen und Benutzeroberfläche der Web-API und der Apps verbessern.

Dieses Mal werden wir die Hardcodierung der Coupondaten so ändern, dass sie in der Datenbank verwaltet werden. Die API-Anforderungs- und Antwortspezifikationen werden entsprechend neu angeordnet. Die Datenbank verwendet SQLite, das von Anfang an in Python integriert ist.

Referenz

Umgebung

Mac OS 10.15 VSCode 1.39.2 pipenv 2018.11.26 Python 3.7.4 Django 2.2.6

Verfahren

Organisieren Sie Web-API-Anforderungs- und Antwortspezifikationen

Da Sie entscheiden müssen, welche Daten in der Datenbank verwaltet werden sollen, berücksichtigen Sie die API-Anforderungs- und Antwortspezifikationen. Die Couponverteilungs-API für das Thema enthält die folgenden Spezifikationen.

** Parameter anfordern **

Antwort

Der Tabellenname sollte "Coupon" sein.

Wenn Sie ein verfügbares Geschäft mit dem Anforderungsparameter erhalten, wird nur der Gutschein zurückgegeben, der im angegebenen Geschäft verwendet werden kann. Wenn der Anforderungsparameter leer ist, werden alle derzeit verfügbaren Gutscheine zurückgegeben.

Die Definitionen der verfügbaren Gutscheine lauten wie folgt.

Richten Sie die Datenbank ein

Die Datenbankeinstellungen werden in settings.py im Verzeichnis des Projektnamens beschrieben ( / ami_coupon_api im Beispiel dieses Artikels).

Wie im Screenshot gezeigt, werden die Einstellungen grundsätzlich bei Verwendung von SQLite von Anfang an vorgenommen, sodass bei Verwendung von SQLite keine Bearbeitung erforderlich ist. Nur für den Fall, ich habe nur überprüft, ob es von der ursprünglichen Einstellung geändert wurde. check-settingpy-for-sqlite.png

Standardmäßig wird db.sqlite3 beim Erstellen des Projekts generiert. check-sqlite-explorer.png

Zusätzlich zu SQLite unterstützt Django MySQL und PostgreSQL.

Erstellen Sie ein Modell

Django erstellt die Datenbank und die Tabelle automatisch basierend auf dem Modell, sodass Sie die Tabelle nicht selbst erstellen müssen. Erstellen Sie das Originalmodell. Das Modell (Modellklasse) ist 1: 1 mit der Tabelle verknüpft, und das Modellfeld und die Tabellenelemente (Instanzen) sind ebenfalls 1: 1 verknüpft, sodass das Bild einfach ist.

Dieses Mal benötigen wir eine Coupon-Tabelle, um Coupon-Informationen zu speichern. Öffnen Sie also models.py im Anwendungsverzeichnis ( / coupon im Beispiel dieses Artikels) und erstellen Sie dort eine Coupon-Klasse.

Das Modell ist wie folgt definiert. [Modellfeldname] = Modelle. [Datentyp]

Hier ist das Modell, das ich erstellt habe.

models.py



from django.db mport models

class Coupon(models.Model):
    code = models.CharField(max_length=20) #Gutscheincode
    benefit = models.CharField(max_length=1000) #Coupon Vorteile
    explanation = models.CharField(max_length=2000) #Kommentar
    store = models.CharField(max_length=1000) #Verfügbare Geschäfte
    start = models.DateField() #Anfangsdatum
    deadline = models.DateField() #Haltbarkeitsdatum
    status = models.BooleanField() #Status (verfügbar)/Unmögliche Flagge)

    def __str__(self):
        return '<Coupon:id=' + str(self.id) + ',' + self.code + ',' + self.benefit + '>'

Der def __str__ (self): ~ Teil des obigen Codes ist die ** Definition der Anzeigeregeln **, wenn Sie mit einem Browser auf den Django-Server zugreifen und die gespeicherten Daten anzeigen. Es funktioniert als Modell, auch wenn es keine Beschreibung gibt, aber ich denke, es ist besser, es für eine einfache Verwaltung zu definieren.

Im Fall des folgenden Codes werden beim Zugriff auf den Verwaltungsbildschirm mit einem Browser die IDs, Codes und Vorteile der einzelnen Coupondaten angezeigt. id scheint automatisch generiert zu werden, wenn Sie den Primärschlüssel nicht festlegen.


    def __str__(self):
        return '<Coupon:id=' + str(self.id) + ',' + self.code + ',' + self.benefit + '>'

Migrieren Sie und generieren Sie automatisch eine Tabelle basierend auf dem Modell

Geben Sie im Terminal die pipenv-Shell ein und wechseln Sie in das Projektverzeichnis (das Verzeichnis, in dem sich manage.py befindet). Führen Sie dann den Befehl aus, um die Migrationsdatei zu erstellen.

$ python manage.py makemigrations [Anwendungsname (Gutschein im Beispiel dieses Artikels)]

Die Migrationsdatei wurde erstellt. make-migration-file-coupon.png

Führen Sie dann die Migration aus.

$ python manage.py migrate

Die Migration war erfolgreich und wahrscheinlich wurde eine Coupontabelle in SQLite erstellt. migrate-coupon-01.png

Füllen Sie die Tabelle

Verwenden Sie standardmäßig das von django bereitgestellte Datenbankverwaltungstool, überprüfen Sie die wahrscheinlich erstellte Coupontabelle und geben Sie die Demodaten des Coupons ein. Da das Verwaltungstool eine Webanwendung ist, die auf dem Django-Server ausgeführt wird, müssen Sie den Django-Server starten, wenn Sie das Tool verwenden.

Bevor Sie sich bei den Verwaltungstools anmelden können, müssen Sie den Administrator mithilfe von Befehlen registrieren. Die folgenden 4 Elemente müssen eingestellt werden. Wenn Sie einen Befehl eingeben, werden Sie nacheinander dazu aufgefordert.

$ python manage.py createsuperuser
make-superuser-of-django-mask.png

Registrieren Sie anschließend das Coupon-Modell, damit es vom Verwaltungstool verwaltet werden kann. Die Registrierung erfolgt in admin.py im Verzeichnis der Anwendung (Coupon im Beispiel dieses Artikels). Ändern Sie admin.py wie folgt.

admin.py



from django.contrib import admin
from .models import Coupon #hinzufügen

# Register your models here.
admin.site.register(Coupon) #hinzufügen

Starten Sie den Django-Server und greifen Sie auf "http: //10.0.0.127: 8000 / admin" zu, um den Anmeldebildschirm des Admin-Tools zu öffnen. django-webconsole-login-s.png

Wenn Sie sich als zuvor erstellter Administrator anmelden, werden die verfügbaren Tabellen (Modelle) angezeigt. (Die von der Coupon-Anwendung erstellte Coupon-Tabelle wird unten angezeigt. Sie wird als Coupons angezeigt, Sie müssen sich jedoch keine Sorgen machen, da das "s" vom Management-Tool ohne Erlaubnis angezeigt wird.) django-webconsole-home-s.png

Wenn Sie die Coupon-Tabelle auswählen, können Sie den Inhalt der Tabelle überprüfen. Da die Daten im Ausgangszustand leer sind, wird nichts angezeigt. django-webconsole-coupon-home-s.png

Drücken Sie die Taste ** "ADD COUPON +" ** oben rechts, um zur Dateneingabe zu gelangen. Hier werden alle im Modell definierten Modellfelder angezeigt, sodass Sie problemlos bestätigen können, dass die Tabelle erstellt wurde. django-webconsole-coupon-add-s.png

Geben Sie die Daten ein und drücken Sie die Taste ** "SAVE" ** unten rechts, um die Daten zu registrieren. django-webconsole-after-input-s.png

Ich denke, dass eine intuitive Bedienung möglich ist. Fügen Sie auf die gleiche Weise 5 Coupondaten ein. Die verfügbaren Geschäfte, das Startdatum, das Enddatum und der Status wurden mit Variationen hinzugefügt, damit sie später getestet werden können.

In der Listenanzeige werden die Daten in jeder Zeile in dem Format angezeigt, das durch "str (self)" der Couponklasse "models.py" definiert ist. django-webconsole-coupon-records-s.png

Geändert, um mit JSON auf die Informationen eines in SQLite registrierten Gutscheins zu antworten

Ändern Sie views.py, um die Informationen eines der in SQLite registrierten Coupons so zu ändern, dass er im JSON-Format antwortet.

Importieren Sie zunächst die Coupon-Klasse von models.py in views.py. Fügen Sie from .models import Coupon zu views.py hinzu.

Definieren Sie als Nächstes die Antwortverarbeitung für die Anforderung. Fügen Sie hier den Prozess hinzu, um alle Daten der Coupon-Tabelle abzurufen. data = Coupon.object.all()

Erstellen Sie als Nächstes Daten vom Typ Wörterbuch für Json.dump.

Die Daten, die mit'Coupon.object.all () 'abgerufen werden können, sind ein Array vom Datentyp, und jedes Array enthält einen Datensatz in einer Zeile der Tabelle. Geben Sie zum Abrufen einer einzelnen Datensatzzeile das [x] -te eines Arrays von Datentypvariablen an. Verwenden Sie zum Abrufen eines Elements in einem Datensatz "data [x] gefolgt von. [Spaltenname des Elements, das Sie abrufen möchten]".

Da json.dumps den Datentyp nicht so akzeptiert, wie er ist, wandeln Sie ihn in den String-Typ um.

Ich habe einen Prozess geschrieben, um die Couponinformationen des ersten Datensatzes in ein Wörterbuch zu formatieren, indem ich den 0. des Arrays angegeben habe.


params = {
            'coupon_code':str(data[0].code),
            'coupon_benefits':str(data[0].benefit),
            'coupon_explanation':str(data[0].explanation),
            'coupon_store':str(data[0].store),
            'coupon_start':str(data[0].start),
            'coupon_deadline':str(data[0].deadline),
            'coupon_status':str(data[0].status),
         }

Der Vorgang von json.dumps ist der gleiche wie vor der Änderung. Die modifizierte views.py lautet wie folgt.

views.py



from django.shortcuts import render
from django.http import HttpResponse
from .models import Coupon #Coupon-Klasse importieren
import json

def coupon(request):
    data = Coupon.objects.all() #Holen Sie sich alle Datensätze in die Tabelle
    params = {
            'coupon_code':str(data[0].code), #Da jeder Datensatz vom Typ Daten ist, wandeln Sie ihn in den Typ String um
            'coupon_benefits':str(data[0].benefit),
            'coupon_explanation':str(data[0].explanation),
            'coupon_store':str(data[0].store),
            'coupon_start':str(data[0].start),
            'coupon_deadline':str(data[0].deadline),
            'coupon_status':str(data[0].status),
        }
    json_str = json.dumps(params, ensure_ascii=False, indent=2)
    return HttpResponse(json_str)

Wenn Sie die Anforderungs-URL im Browser eingeben und prüfen, ob json geantwortet hat, werden die Informationen eines Gutscheins von json beantwortet. get-one-record-from-sqlite.png

Geändert, um auf mehrere Couponinformationen zu reagieren

Was wir mit der API realisieren möchten, ist ** eine Spezifikation, die auf alle Coupons reagiert, die die in den Anforderungsparametern empfangenen Bedingungen erfüllen **. Daher werden wir sie zuerst so ändern, dass mehrere Couponinformationen mit json beantwortet werden können.

Um mit json auf mehrere Datensätze zu antworten, speichern Sie die Informationen eines Datensatzes im Wörterbuchtyp in einem Array und übergeben Sie sie an "json.dumps".

Bereiten Sie zunächst ein Array vor, um mehrere Datensätze als Wörterbuchtyp zu speichern. Der Array-Name lautet "Coupons".

Fügen Sie als Nächstes eine for-Anweisung hinzu, damit der Vorgang zum Erstellen von Datensätzen zu einem Wörterbuchtyp für die Anzahl der Datensätze wiederholt wird.

Auf "für Datensatz in Daten" setzen, damit in jeder Runde eine Datensatzzeile in der Variablen (Datensatz) des Wörterbuchtyps gespeichert wird. Dieser Prozess ist ferner in einer for-Anweisung enthalten, sodass die in einen Wörterbuchtyp konvertierten Couponinformationen im Coupons-Array gespeichert werden, ein Datensatz pro Runde.

Ändern Sie abschließend den übergebenen Wörterbuchtyp in "json.dumps", um die Array-Coupons zu übergeben, die mehrere Wörterbuchtypen enthalten. Die modifizierte views.py ist hier.

views.py



from django.shortcuts import render
from django.http import HttpResponse
from .models import Coupon #Coupon-Klasse importieren
import json

def coupon(request):
    data = Coupon.objects.all() #Holen Sie sich alle Datensätze in die Tabelle

    coupons = [] #Bereiten Sie ein Array vor, um mehrere Datensätze als Wörterbuchtyp zu speichern
    for record in data: #Konvertieren Sie Datensatz für Datensatz mit for-Anweisung in Wörterbuchtyp
        params = {
            'coupon_code':str(record.code), #Da jeder Datensatz vom Typ Daten ist, wandeln Sie ihn in den Typ String um
            'coupon_benefits':str(record.benefit),
            'coupon_explanation':str(record.explanation),
            'coupon_store':str(record.store),
            'coupon_start':str(record.start),
            'coupon_deadline':str(record.deadline),
            'coupon_status':str(record.status),
            }
        coupons.append(params) #Speichern Sie Datensätze vom Typ Wörterbuch in einem Array

    json_str = json.dumps(coupons, ensure_ascii=False, indent=2) #Übergeben Sie ein Array mit mehreren lexikalischen Datensätzen
    return HttpResponse(json_str)

Wenn Sie eine Anfrage stellen, ohne den Anforderungsparameter im Browser anzugeben, werden alle Gutscheininformationen von Json beantwortet. get-all-couponData-from-sqlite-s.png

Geändert, um auf Gutscheine zu reagieren, die die Anforderungen der Anforderungsparameter erfüllen

Verwenden Sie "Coupon.object.filter ([bedingter Ausdruck])", um Datensätze abzurufen, die bestimmte Kriterien erfüllen.

Da der Anforderungsparameter ein verfügbares Geschäft ist (Artikel, der mit dem Geschäft in der Coupon-Tabelle verknüpft ist), verwenden Sie die Anweisung "if else". Wenn ein Parameter vorhanden ist, verwenden Sie "Coupon.objects.filter", um einen Gutschein zu erhalten, der im angegebenen Geschäft und in allen Geschäften verwendet werden kann. Wenn jedoch keine Parameter vorhanden sind, können Sie alle Gutscheine mit "Coupon.objects.all" abrufen.

Der bedingte Ausdruck ist ** Coupon-Tabelle verfügbare Geschäfte sind die gleichen wie das angeforderte Geschäft ODER alle verfügbaren Geschäfte ** Es wird sein.

Ausdrücke mit mehreren Bedingungen sind mit Q-Objekten einfacher zu schreiben. Importieren Sie das Q-Objekt daher in 'views.py'.


from django.db.models import Q

Als nächstes von den bisher erstellten Programmen


data = Coupon.objects.all() #Holen Sie sich alle Datensätze in die Tabelle`

Fügen Sie dem Teil von einen bedingten Zweig hinzu und gehen Sie wie folgt vor. Wie oben erwähnt, habe ich unter Verwendung des Q-Objekts den bedingten Ausdruck der ODER-Bedingung von ** demselben Coupon wie das anfordernde Geschäft ** und ** dem Gutschein für alle Geschäfte ** festgelegt.


if 'coupon_store' in request.GET: 
    coupon_store = request.GET['coupon_store'] 
    data = Coupon.objects.filter(Q(store=coupon_store) | Q(store='Alle Geschäfte'))
else:
    data = Coupon.objects.all()

Informationen zur Beschreibungsmethode für mehrere Bedingungen mit dem Q-Objekt

ODER suchen
Q(store=coupon_store) | Q(store='Alle Geschäfte')

UND suchen
Q(store=coupon_store) , Q(store='Alle Geschäfte')

Es wird sein.

Wenn Sie dies beantragen, indem Sie den Kanda-Store im Browser als Testversion angeben, werden die Gutscheininformationen des Kanda-Stores und aller Stores angezeigt. get-couponData-canuse-kanda-s.png

Ändern Sie dies so, dass nur Gutscheine beantwortet werden, die das Ablaufdatum und den Status erfüllen.

Fügen Sie basierend auf dem bisher implementierten Programm Suchbedingungen hinzu, damit nur Gutscheine beantwortet werden, die das Ablaufdatum nicht überschritten haben und den Status "verfügbar" ** haben.

In Bezug auf das Startdatum der Nutzung haben wir beschlossen, es nicht zu den Suchbedingungen hinzuzufügen, da Gutscheine als Benachrichtigung geliefert werden müssen.

Die Elemente in den Modellfeldern der Coupon-Tabelle, die mit dem Ablaufdatum und dem Status verknüpft sind, lauten wie folgt.

Ablaufdatum: Frist
Status: Status

Vergleichen Sie zunächst das Datum (Datum) der Anfrage mit dem Ablaufdatum des Gutscheins und ändern Sie es so, dass nur diejenigen aus der Gutscheintabelle abgerufen werden, die das Ablaufdatum nicht überschritten haben.

Importieren Sie datetime in views.py, damit Sie die Daten abrufen können.


import datetime #Importieren Sie Datum und Uhrzeit, damit Sie Datum und Uhrzeit abrufen können

Fügen Sie den Prozess hinzu, um das Datum in der Gutscheinfunktion abzurufen.


today = datetime.date.today()

** Fügen Sie die Abfrage "Q (Deadline__gte = heute)" zu "Coupon.object.filter" hinzu, um festzustellen, ob der Coupon nach dem oben angegebenen Datum abläuft **.


if 'coupon_store' in request.GET: #Verarbeitung, wenn im Anforderungsparameter ein Speicher angegeben ist
        coupon_store = request.GET['coupon_store']
        data = Coupon.objects.filter(Q(deadline__gte=today),Q(store=coupon_store) | Q(store='Alle Geschäfte')) # リクエストされた店舗とAlle Geschäfteで使えるクーポンを取得
    else: #Gibt alle Gutscheine zurück, wenn keine Anforderungsparameter vorhanden sind
        data = Coupon.objects.filter(Q(deadline__gte=today))

Damit haben wir den Prozess der Beantwortung von Elementen abgeschlossen, die nicht abgelaufen sind. Wenn Sie eine Anfrage ohne die Anforderungsparameter stellen, wird der abgelaufene Gutschein (0004) nicht beantwortet. get-all-couponData-with-deadline-filter-s.png

Fügen Sie dann eine "Q (status = True)" - Abfrage zu "Coupon.object.filter" hinzu, sodass nur Coupons mit dem verfügbaren Status (True) aus der Coupon-Tabelle abgerufen werden.


    if 'coupon_store' in request.GET: #Verarbeitung, wenn im Anforderungsparameter ein Speicher angegeben ist
        coupon_store = request.GET['coupon_store']

        data = Coupon.objects.filter(Q(deadline__gte=today),Q(status=True),Q(store=coupon_store) | Q(store='Alle Geschäfte')) # リクエストされた店舗とAlle Geschäfteで使えるクーポンを取得
    else: #Gibt alle Gutscheine zurück, wenn keine Anforderungsparameter vorhanden sind
        data = Coupon.objects.filter(Q(deadline__gte=today),Q(status=True))

Wenn ich eine Anfrage stelle, enthält die Antwort keine Gutscheine mit dem Status "Falsch" mehr. get-all-couponData-with-status-filter-s.png

das ist alles.

Führen Sie als Nächstes [Änderung auf der iOS-App-Seite, um diese API anzufordern] aus (https://qiita.com/Ajyarimochi/items/50cdc57f898b79cfb48e).

Recommended Posts

Entwickeln Sie eine Web-API, die in DB gespeicherte Daten mit Django und SQLite zurückgibt
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Erstellen Sie eine Datenanalyseumgebung, die die GitHub-Authentifizierung und Django mit JupyterHub verbindet
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Eine Klasse, die mit SQLite3 schnell eine Datenbank erstellt und Daten einfügt
(Für Anfänger) Versuchen Sie, mit Django eine einfache Web-API zu erstellen
Ein Server, der mit Flasche.py und OpenCV die Anzahl der Personen vor der Kamera zurückgibt
Erstellen Sie mit turicreate eine API, die Daten aus einem Modell zurückgibt
Erstellen Sie eine Webanwendung mit Django
Startete eine Webanwendung auf AWS mit Django und wechselte Jobs
GraphQL-API mit graphene_django in Django
Ich habe eine WEB-Bewerbung bei Django gemacht
Stellen Sie Docker in Windows Home und führen Sie einen einfachen Webserver mit Python aus
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Versuchen Sie, eine Webanwendung mit Vue.js und Django (Mac Edition) zu erstellen - (1) Umgebungskonstruktion, Anwendungserstellung
Erstellen Sie eine saubere Datenbank zum Testen mit FastAPI und führen Sie Unittest of API mit pytest aus
Generieren und veröffentlichen Sie Dummy-Bilddaten mit Django
Löschen Sie Daten in einem Muster mit Redis Cluster
So entwickeln Sie eine Cart-App mit Django
Starten Sie Django in einer virtuellen Umgebung mit Pipenv
Erstellen Sie mit Vagrant in 5 Minuten eine Django-Umgebung
Schritte zum Entwickeln einer Webanwendung in Python
Starten Sie einen Webserver mit Python und Flask
Konfigurieren Sie ein Modul mit mehreren Dateien in Django
So erstellen Sie eine Rest-API in Django
Extrahieren Sie mit Python Daten von einer Webseite
Automatisieren Sie das Entfernen des Hintergrunds für die neuesten Porträts in einem Verzeichnis mit Python und API
Verwendung von Fixture in Django zur Eingabe von Beispieldaten für das Benutzermodell
Ich habe ein gestapeltes Balkendiagramm mit matplotlib von Python erstellt und eine Datenbeschriftung hinzugefügt
Erstellt eine Web-App, die IT-Ereignisinformationen mit Vue und Flask abbildet
Erstellen Sie ein Flag in den Einstellungen, das nur beim Testen mit Django True ist
Ein Memo, das das Gesicht des mit Djangos OpenCV von der Webkamera aufgenommenen Bilds erkennt und zurückgibt.
Versuchen Sie, eine einfache Website mit Responder und sqlite3 zu erstellen
Trainieren Sie MNIST-Daten mit PyTorch mithilfe eines neuronalen Netzwerks
Rückblick auf die Erstellung eines Webdienstes mit Django 1
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Spielen mit der benutzerlokalen API für künstliche Intelligenz in Python
Verwenden Sie Cursur, das in Python automatisch mit sqlite3 geschlossen wird
Rückblick auf die Erstellung eines Webdienstes mit Django 2
Ein Server, der POST-Daten mit flask / python wiedergibt
Erhalten Sie Kommentare und Abonnenten mit der YouTube-Daten-API
Erstellen einer API, die mit BERT im Django REST-Framework negativ-positive Inferenzergebnisse zurückgibt
Lern-Roadmap, mit der Sie Services mit Python von Grund auf neu entwickeln und veröffentlichen können