[PYTHON] Verstehen Sie den Komfort des Django Rest Framework

Einführung

Dieser Artikel ist eine Fortsetzung von Last. Im vorherigen Artikel wurde der konzeptionelle Teil der API beschrieben. Dieses Mal möchte ich tatsächlich eine API mit Python und Django erstellen. Die diesmal erstellte API ist so einfach wie das Senden von Daten (vom Browser) und das Speichern in der Datenbank sowie das Verschieben auf einen beliebigen Endpunkt, um die Daten in der Datenbank anzuzeigen. Es werden auch APIs ohne Verwendung von ** Django Rest Framework ** erstellt. Der Grund ist, dass ich dachte, ich könnte die Bequemlichkeit des Django Rest-Frameworks verstehen, indem ich mit ** Python-Code ** baue, ohne das von Django bereitgestellte Framework zu verwenden.

Zielperson

Diejenigen, die die grundlegende Grammatik von Python kennen und diejenigen, die den grundlegenden Mechanismus von Django kennen. (Django Installation und Installation werden erheblich weggelassen.)

Grundeinstellung

Der erste wichtige Teil beim tatsächlichen Erstellen einer API ist die ** welche Art von Daten zu verarbeiten sind **. Das Senden von Daten an die API bedeutet nicht, dass sie ohne Erlaubnis in der Datenbank gespeichert werden. Die API speichert die Daten jedoch basierend auf dem Modell der in ** models.py ** entworfenen Daten. Legen Sie also zunächst den Teil ** fest, welche Art von Daten ** im Modell verarbeitet werden sollen.

models.py


from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    timestamp = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.title

Dieses Mal habe ich ein Modell entworfen, das davon ausgeht, dass Blog-Daten von der API verarbeitet werden. Daten mit Titel, Inhalt des Artikels sowie Datum und Uhrzeit der Veröffentlichung. Wenn Sie ein Modell schreiben können, gehen wir zu ** migrieren **. Als nächstes registrieren Sie ** Post ** in ** admin.py ** und geben einige Testdaten von der Admin-Seite ein. Geben Sie für jedes Element einen geeigneten Wert ein und speichern Sie ihn wie in der folgenden Abbildung gezeigt. スクリーンショット 2020-02-06 13.08.20.png

Daten auf einem beliebigen Endpunkt anzeigen

Lassen Sie uns nun die von der Administrationsseite gespeicherten Daten auf einem beliebigen Endpunkt anzeigen. Das Erste, woran Sie denken sollten, ist, dass moderne APIs beim Senden einer Anfrage ** JSON-Daten ** zurückgeben. Daher ist der Rückgabewert der Posts-Funktion von ** views.py ** ** JsonResponse **. Davon abgesehen bringt der einfache Code ** QuerySet ** näher an JSON-Daten. Drehen Sie das QuerySet mit einer for-Anweisung, um es zu einem Wörterbuchtyp zu machen, und fügen Sie es in die Liste ein. Von hier an erledigt Django die Arbeit für Sie und die Daten vom Wörterbuchtyp in der Python-Liste werden automatisch in JSON-Daten ** serialisiert **.

views.py


from .models import Post

def posts(request):

    posts = Post.objects.all()
    post_list = []
    for post in posts:
        post_dict = {
            'pk': post.pk,
            'title': post.title,
            'description': post.description,
            'timestamp': post.timestamp,
        }
        post_list.append(post_dict)

    return JsonResponse(post_list, safe=False)

    # non-Konvertieren von Daten vom Typ dikt in json-Daten"safe=False"Beschreiben.

Erstellen Sie einen beliebigen Endpunkt.

urls.py


from application_name.views import posts #hinzufügen

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/post/', posts), #hinzufügen
]

An diesem Punkt richten wir einmal einen lokalen Server ein und wechseln zum erstellten Endpunkt. Diesmal musste ich den Primärschlüssel nicht eingeben, aber es ist praktisch, wenn Sie während eines solchen Tests nachsehen. Ich konnte die Daten korrekt bestätigen, es war also ein Erfolg! Als nächstes folgt die POST-Anfrage. スクリーンショット 2020-02-06 13.49.16.png

Schreibverarbeitung für POST-Anfrage

Die Rolle der API, die Django verwendet, besteht darin, neue Daten basierend auf models.py in der Datenbank zu speichern, wenn sie über eine ** POST-Anforderung ** gesendet werden. Es ist schwer zu verstehen, selbst wenn ich ein wenig schreibe. Um es kurz zu erklären, besteht die Rolle der API-Seite darin, die gesendeten Daten in einer Form zu verarbeiten und zu speichern, die einfach zu speichern ist. Als nächstes werde ich den Code schreiben, um ihn zu verarbeiten und zu speichern.

views.py


#Fügen Sie den folgenden Code hinzu. Die folgende if-Anweisung steht über der Verarbeitung der GET-Anforderung.
from django.http import HttpResponse
import json

def posts(request):

    if request.method == 'POST':
        data = json.loads(request.body)
        post = Post(
            title=data['title'],
            description=data['description'],
            )
        post.save()
        return HttpResponse(201)

    posts = Post.objects.all()
    # ~~Folgendes wird weggelassen~~

** Django ** verfügt nicht über eine Standardfunktion zum automatischen ** Deserialisieren ** (Zurückgeben von JSON-Daten in eine verwaltbare Form) für die gesendeten JSON-Daten, sodass der zu deserialisierende Code bereitgestellt wird. Sie müssen es aufschreiben. Diese Funktion ist erforderlich, da sie nur dann in der Datenbank gespeichert werden kann, wenn sie in einem Datenformat wiederhergestellt ist, das von Python verarbeitet werden kann. Fügen Sie die JSON-Daten in eine geeignete Variable ein und deserialisieren (verarbeiten) Sie sie mit dieser Variablen. Außerdem hat ** Django ** keine Funktion zum automatischen Speichern von Daten aus Ansichten. Schreiben Sie daher am Ende explizit ** post.save **.

Senden Sie tatsächlich eine POST-Anfrage

Dieses Mal möchte ich ** axios ** verwenden, um eine ** POST-Anfrage ** an die API zu senden. Wenn Sie ** ajax ** in Ihrer eigenen Anwendung implementieren möchten, wird empfohlen, die ** axios-Bibliothek ** von Javascript zu verwenden. Erstellen Sie zunächst eine Seite in Vorlagen, um eine POST-Anfrage zu senden. Fügen Sie dieser Seite Axios mit ** cdn ** hinzu.

main.html



    <body>
        <p>Test Page</p>   
    </body>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script> #Mit cdn hinzufügen
</html>

Erstellt mit ** funktionsbasiert ** in der Ansicht. Machen Sie auch das Routing.

views.py


def main_page(request):
    return render(request, 'main.html', context=None)

urls.py


from application_name.views import main_page #hinzufügen

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', main_page),    #Fügen Sie eine Route hinzu
    path('api/post/', posts),
]

Richten Sie einen lokalen Server ein und rufen Sie die URL auf, unter der ** main.html ** angezeigt wird. Überprüfen wir also, ob die API über die Entwicklertools ** Konsole ** ordnungsgemäß funktioniert. Da die von der POST-Anforderung gesendeten Daten ** JSON-Daten ** sein müssen, machen Sie sie zu einem Wörterbuchtyp. Machen Sie es einfach aus Gründen der Klarheit als Argument zu einer Variablen.

console


/* 
Erstellen Sie eine asynchrone Funktion
Anfrage senden und Antwort geben
Ich möchte warten, da das Senden einer Anfrage einige Zeit in Anspruch nimmt
Der API-Endpunkt kann ein relativer Pfad sein, da der Server bereits aktiv ist
*/

async function addPost(title, description) {
    const response = await axios.post('api/post/', {'title': title, 'description': description})
    console.log(response)
}

//Instanziierung
addPost('sending from axios', 'some test messages')

Wenn Sie dies tun, sollten Sie jedoch eine ** 403 Forbidden ** -Fehleranweisung erhalten. Wenn der 403 so zurückkommt, können Sie alle ** Anfragen ** sehen, die Sie in den Entwicklertools ** des Netzwerks ** des Browsers gesendet haben. Wie in der Abbildung unten gezeigt, können Sie den Teil (die Daten) der Nutzdaten sehen, die Sie senden wollten. スクリーンショット 2020-02-05 17.09.40.png Wenn Sie sich als nächstes den Teil ** Antwort ** ansehen, sehen Sie ** HTML-Anweisungen **, die Sie häufig sehen. Um das Anzeigen dieser Antwort in Ihrem Browser zu vereinfachen, kopieren Sie die HTML-Anweisung ** response ** und schreiben Sie sie mit ** innerHTML ** neu. Es ist etwas schwierig, es in Worten zu erklären. Schauen Sie sich also den folgenden Code an.

console


document.querySelector('body').innerHTML = `Antwort HTML-Anweisung`

Wenn Sie es damit ausführen, sollten Sie sehen, dass der Fehler von der Django-Seite kommt. Ich werde den Fehlerbildschirm unten setzen. Wenn Sie sich die Fehleranweisung ansehen, können Sie feststellen, dass die ** CSRF-Überprüfung ** fehlgeschlagen ist. Wenn Sie ein Formular mit Django verwenden, heißt es, dass Sie ** csrf_token ** verwenden können, aber dieses Mal sende ich Daten mit Ajax, sodass diese Methode es nicht lösen kann. Verwenden Sie eine Methode, die Sie normalerweise nicht verwenden, um Ajax in Django auszuführen. スクリーンショット 2020-02-05 17.56.22.png Um den Ablauf der ** CSRF-Überprüfung ** zu erklären, zeigt Django, dass die Vorderseite auf Daten von derselben Site zugreift, anstatt von einem anderen Ort aus darauf zuzugreifen, und Django empfängt sie. Verleiht der Vorderseite Datenberechtigungen. Wenn Sie in diesem Sinne erneut an ** 403 Verboten ** denken, können Sie sehen, dass dies bedeutet, dass Sie nicht über die Berechtigung (Berechtigung) verfügen, mit den Daten umzugehen. Wie bereits erwähnt, wird das Formular jedoch nicht verwendet, sodass ** csrf_token ** nicht verwendet werden kann. Fügen Sie dieses Mal also csrf_token in ** Cookie ** ein und fügen Sie es in eine Javascript-Datei ein.

sample.js


axios.defaults.xsrfCookieName = 'csrftoken'
axios.defaults.xsrfHeaderName = "X-CSRFTOKEN"

Ursprünglich können Sie durch Einfügen des obigen Codes oben in die ** js-Datei **, die die Ajax-Anfrage sendet, die Anfrage mit axios have ** Cookie ** standardmäßig mit csrf_token stellen. Ich werde. Dies sollte den vorherigen Fehler beheben. Da wir diesmal keine anderen Funktionen als die Ajax-Kommunikation mit Javascript haben, erstellen Sie eine js-Datei mit einem beliebigen Namen und schreiben Sie nur den obigen Code. Laden (verbinden) Sie diese Datei mit ** main.html ** wie unten gezeigt und lassen Sie sie auch auf der Konsole der Entwicklertools funktionieren.

main.html



    <body>
        <p>Test Page</p>   
    </body>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script type="text/javascript" src="{% static 'sample.js' %}"></script> #hinzufügen
</html>

Wenn ich dem Argument in der Konsole einen Wert hinzufüge und ihn wie zuvor instanziiere, wird der Statuscode 201 diesmal fehlerfrei zurückgegeben. Mit anderen Worten, es ist ein Erfolg! スクリーンショット 2020-02-05 21.49.44.png Gehen Sie vorerst zum Endpunkt ** 'api / post /' ** und prüfen Sie, ob die POST-Daten korrekt angezeigt werden. スクリーンショット 2020-02-05 23.22.02.pngプライマリーキーが3のデータが先ほど追加したデータなので、ちゃんとGET, POSTリクエストが動いていることが分かります。

Warum das Django Rest Framework verwenden?

Zunächst denke ich, dass der Hauptgrund darin besteht, dass das ** Django Rest Framework ** (DRF) den Code für die Datenverarbeitung und -authentifizierung, mit dem wir uns derzeit nicht befassen, erheblich reduziert. Ich denke jedoch, dass der nächste Grund darin besteht, dass HTTP-Verben wie PUT, PATCH und DELETE verfügbar sein werden. Normalerweise ignoriert ** Django ** diese, sodass Sie sie nicht verwenden können, wenn Sie möchten. ** DRF ** verarbeitet andere Anforderungen problemlos, sodass Sie die Funktionalität der API maximieren können. Ich denke, es gibt viele andere Gründe, aber im Moment denke ich, dass diese beiden die Hauptgründe sind.

Schließlich

Wie war der Inhalt des Artikels? Es dient auch als eigenes Memorandum und ist ziemlich lang geworden. Vielen Dank an diejenigen, die es bis zum Ende gelesen haben. Wenn Sie Fehler oder Tippfehler haben, können Sie diese gerne darauf hinweisen. Das nächste Mal möchte ich eine einfache Anwendung mit einer externen API erstellen.

Recommended Posts

Verstehen Sie den Komfort des Django Rest Framework
Verschiedene Hinweise zum Django REST-Framework
Grundlagen des Django REST-Frameworks
Tipps zum Django Rest Framework
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
[Django Rest Framework] Passen Sie die Filterfunktion mit Django-Filter an
Django REST Framework Stolperstein
Django REST Framework mit Vue.js
Melden Sie sich mit dem Django Rest Framework an
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Verstehen Sie den Inhalt der sklearn-Pipeline
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
Implementierung der JWT-Authentifizierungsfunktion in Django REST Framework mit djoser
Implementierung von CRUD mithilfe der REST-API mit Python + Django Rest Framework + igGrid
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Erstellen Sie eine RESTful-API mit dem Django Rest Framework
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Logisches Löschen in Django, DRF (Django REST Framework)
[Python3] Verstehe die Grundlagen von Beautiful Soup
Ein Verwaltungstool, das sofort mit dem REST-Framework ng-admin + Django erstellt werden kann
So überprüfen Sie die Version von Django
CRUD GET mit Nuxt & Django REST Framework ②
CRUD POST mit Nuxt & Django REST Framework
CRUD GET mit Nuxt & Django REST Framework ①
Verstehen Sie den "temporären" Teil von UNIX / Linux
Überlegungen zum Design von Django REST Framework + Clean Architecture
Betrachten Sie die Beschreibung von docker-compose.yml (Django + MySQL ③)
[Python3] Grundlegendes zu Dateivorgängen
Implementierung der benutzerdefinierten Authentifizierungsfunktion für Benutzermodelle in Django REST Framework mit djoser
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
CRUD PUT, DELETE mit Nuxt & Django REST Framework
Exklusive Veröffentlichung der Django App mit ngrok
Lösung, wenn nicht gefunden, wird angezeigt, wenn die API von Django REST Framework von außen aufgerufen wird
Ich habe die Sitzungsaufbewahrungsdauer von Django überprüft
Django REST Framework Ein wenig nützlich zu wissen.
Die Geschichte der Anzeige von Mediendateien in Django
Implementieren Sie die JWT-Anmeldefunktion im Django REST-Framework
Wissensnotizen erforderlich, um das Python-Framework zu verstehen
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Lernnotizen für die Migrationsfunktion im Django-Framework (2)
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
[Rezept des Trainers] Ich habe die Flasche des Python-Frameworks berührt.
Weitere neue Benutzerauthentifizierungsmethoden mit Django REST Framework
Rund um die Installation des Python-Projektmanagement-Frameworks Trac
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
[Statistik] Verstehen Sie den Mechanismus von Q-Q-Plots mit Animation.
Erstellen Sie eine API für die Benutzerauthentifizierung mit Django REST Framework
Wenn Sie mit dem Django REST-Framework filtern möchten
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Listenmethode für verschachtelte Ressourcen im Django REST-Framework
Implementieren Sie die API mit explosiver Geschwindigkeit mithilfe des Django REST Framework
Lernnotizen für die Migrationsfunktion im Django-Framework (3)
[Django] Ändern Sie die Standard-IP-Adresse des Befehls runserver
[Ev3dev] Lassen Sie uns den Mechanismus der LCD-Steuerung (Bildschirmsteuerung) verstehen
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
Lernnotizen für die Migrationsfunktion im Django-Framework (1)
14 Tests, um den überraschend verwirrenden Umfang von Python zu verstehen