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.
Diejenigen, die die grundlegende Grammatik von Python kennen und diejenigen, die den grundlegenden Mechanismus von Django kennen. (Django Installation und Installation werden erheblich weggelassen.)
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.
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.
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 **.
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. 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. 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! Gehen Sie vorerst zum Endpunkt ** 'api / post /' ** und prüfen Sie, ob die POST-Daten korrekt angezeigt werden. プライマリーキーが3のデータが先ほど追加したデータなので、ちゃんとGET, POSTリクエストが動いていることが分かります。
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.
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