[PYTHON] So erstellen Sie eine Rest-API in Django

Einführung

Nachdem Sie nun gelernt haben, wie Sie eine REST-API in Django erstellen, erhalten Sie ein tieferes Verständnis Weiteres Ausarbeiten und Ausgeben. __ Ich werde diesmal die Erklärung der Umgebungskonstruktion weglassen. __ __ __ Ich verwende die im folgenden Artikel erstellte Umgebung. Verweisen Sie daher unbedingt darauf. __ __ Erstellen Sie mit Anaconda eine virtuelle Umgebung und verknüpfen Sie sie mit PyCharm. Bitte beachten Sie auch, dass alle beliebigen Namen auf den im obigen Artikel verwendeten basieren.

Vorbereitungen & Umwelt

・ Chrome Mod Header · Postbote ・ Anaconda Navigator ・ PyCharm CE · Mac OS

Inhaltsverzeichnis

  1. Erstellen eines Modells
  2. Erstellen eines Serializers
  3. Ansicht erstellen
  4. Funktionsprüfung
  5. Bonus: Stellen Sie die API so ein, dass sie vom Frontend verfügbar ist

1. Erstellen eines Modells

Mit einem Modell können Sie eine Datenbank (sogenanntes ORM) in Python entwerfen, erstellen und betreiben. Der Tabellenname wird anhand der Felder definiert, die von Klassen- und Spaltenmodellen bereitgestellt werden. Sie können jeden Wert abrufen, indem Sie auto_now_add = True für die Datenerstellungszeit und auto_now = True für die Aktualisierungszeit angeben.

models.py


from django.db import models

# Create your models here.
#Datenbank Design
class Todo(models.Model):
    title = models.CharField(max_length=50)
    content = models.CharField(max_length=400)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

Führen Sie Migrationen durch und migrieren Sie das erstellte Modell. Natürlich werde ich es richtig erklären. -Makemigrationen: Erstellen Sie Migrationsdateien für die Verwaltung der Datenbankversion. -Migrieren: Ändern Sie die Datenbankkonfiguration oder machen Sie die Änderung rückgängig.

$ python manage.py makemigrations
$ python manage.py migrate

Damit ist die Modellerstellung und -migration abgeschlossen.

2. Erstellen eines Serializers

Ein Serializer ist ein Gerät, das Daten in geeignete Formen wie Validierung und Kennwort-Hashing umwandelt, um sie in das Modell einzugeben und auszugeben. Es fungiert als Brücke vom Eingabeformular zum Modell, das die Datenbank verwaltet. Erstellen Sie eine neue serializers.py direkt unter api. Token in diesem Kapitel sind Authentifizierungstoken. Sie können sich das Authentifizierungstoken als Information (Zeichenfolge) vorstellen, um den Benutzer eindeutig zu erkennen.

serializers.py


from rest_framework import serializers
from .models import Todo
#Importieren Sie das standardmäßig in Django bereitgestellte Benutzermodell
from django.contrib.auth.models import User
#Token für Benutzer importieren
from rest_framework.authtoken.models import Token

class UserSerializer(serializers.ModelSerializer):
    #Klasse für Grundeinstellungen
    class Meta:
        model = User
        fields = ('id', 'username', 'password')
        #Das Passwort kann von GET nicht aufgerufen werden und muss eingegeben werden
        extra_kwargs = {'password': {'write_only':True, 'required': True}}

    #Überschreiben Sie die Erstellungsmethode, mit der der Benutzer erstellt wurde.
    def create(self,validated_data):
        #Hash das Passwort
        user = User.objects.create_user(**validated_data)
        #Generieren Sie ein Token
        Token.objects.create(user=user)
        return user

class TodoSerializer(serializers.ModelSerializer):

    #Die Notation des Datetime-Felds von Django wurde geändert
    created_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M", read_only=True)
    updated_at = serializers.DateTimeField(format="%Y-%m-%d %H:%M", read_only=True)

    class Meta:
        model = Todo
        fields = ['id','title','content','created_at','updated_at']

Sie haben jetzt einen Serializer erstellt.

3. Ansicht erstellen

Ansichten steuern die Datenzugriffsrechte und die Authentifizierung. Es ist dafür verantwortlich, dass CRUD nur von ordnungsgemäß authentifizierten Benutzern verarbeitet werden kann. Erstellen Sie eine Berechtigungsdatei, bevor Sie Ansichten erstellen. Dies soll PUT und DELETE im Benutzermodell verhindern. Erstellen Sie eigene Berechtigungen direkt unter der API und geben Sie an, dass nur GET und POST akzeptiert werden sollen.

ownpermissions


from rest_framework import permissions

class OwnPermission(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):
        #SAFE_ERHALTEN SIE MIT METHODE,Nur POST erlaubt
        if request.method in permissions.SAFE_METHODS:
            return True
        return False

Erstellen Sie dann die Ansicht.

views.py


from django.shortcuts import render

#Für die Tokenauthentifizierung erforderliche Bibliothek
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated

#Zum Erstellen von Ansichten erforderliche Bibliotheken
from rest_framework import generics
from rest_framework import viewsets

#Importieren Sie das erstellte Modell und den Serializer
from django.contrib.auth.models import User
from .models import Todo
from .serializers import UserSerializer,TodoSerializer

#Importieren Sie die erstellte Berechtigung
from .ownpermissions import OwnPermission

class UserViewSet(viewsets.ModelViewSet):

    #Holen Sie sich alle Benutzerobjekte
    queryset = User.objects.all()

    #Geben Sie den zu verwendenden Serializer an
    serializer_class = UserSerializer

    #Geben Sie an, damit jeder es sehen kann
    permission_classes = (OwnPermission,)

class ManageUserView(generics.RetrieveUpdateAPIView):
    serializer_class = UserSerializer

    #Geben Sie an, dass nur authentifizierte Benutzer darauf zugreifen können
    authentication_classes = (TokenAuthentication,)

    #Geben Sie an, dass nur angemeldete Benutzer zugelassen werden sollen
    permission_classes = (IsAuthenticated,)

    #Eine Funktion, die angemeldete Benutzerinformationen zurückgibt
    def get_object(self):
        return self.request.user

class TodoViewSet(viewsets.ModelViewSet):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

Die Ansicht ist jetzt abgeschlossen.

Lassen Sie uns auch URLs erstellen. URLs sind für die Verknüpfung von Ansichten und Pfaden verantwortlich. Nehmen Sie die folgenden Änderungen sowohl am Projekt als auch an der App vor. (Neue App erstellen)

drfapi/urls


from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from rest_framework.authtoken.views import obtain_auth_token

urlpatterns = [
    path('admin/', admin.site.urls),
    #Gehen Sie zu API-URLs
    path('api/',include('api.urls')),
    #Wenn Sie einen Benutzernamen und ein Passwort veröffentlichen, wird ein Token zurückgegeben.
    path('auth/',obtain_auth_token ),
]

Von Generika geerbte Modelle verwenden as_view (), um die Ansicht dem Pfad zuzuordnen.

api/urls


from django.urls import path
from django.conf.urls import include
from rest_framework import routers
from api.views import UserViewSet, ManageUserView, TodoViewSet

router = routers.DefaultRouter()
router.register('users',UserViewSet)
router.register('todolist',TodoViewSet)

urlpatterns = [
    path('myself/',ManageUserView.as_view( ), name='myself'),
    #Wenn Sie einen Benutzernamen und ein Passwort veröffentlichen, wird ein Token zurückgegeben.
    path('',include(router.urls)),
]

6. Funktionsprüfung

Überprüfen Sie zunächst das Admin-Dashboard, um festzustellen, ob das Modell ordnungsgemäß funktioniert. Schreiben Sie eine Funktion, die den Titelnamen an models.py zurückgibt, und einen Code, mit dem Todo von admin in admin.py erkannt wird.

models.py


def __str__(self):
   return self.title

admin.py


from django.contrib import admin
from .models import Todo
#Registrieren Sie Todo als Administrator
admin.site.register(Todo)

Sie benötigen einen Superuser (autorisierten Benutzer), um sich beim Admin-Dashboard anzumelden. Der Superuser (autorisierter Benutzer) wird vom Terminal aus erstellt.

Wenn Sie den folgenden Befehl eingeben, wird eine Antwort zurückgegeben. Geben Sie also Name, E-Mail-Adresse und Passwort ein. Sie können die E-Mail leer lassen. Wenn es sich um ein einfaches Passwort handelt, werden Sie gewarnt. Wenn jedoch kein Problem vorliegt, geben Sie y ein.

$ python magange.py createsuperuser
Username (Lassen Sie das Feld leer, um den Hostnamen zu verwenden): admin
Email address: 
Password: 
Password (again): 
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

Verwenden wir nun das Admin-Dashboard. Führen Sie manage.py aus und fügen Sie der URL des lokalen Hosts "/ api / users" hinzu, um darauf zuzugreifen. Geben Sie Ihren Benutzernamen und Ihr Passwort ein, um sich anzumelden. スクリーンショット 2020-09-26 23.06.20.png Geben Sie nach dem Anmelden den Titel und den Inhalt von [ADD TO DO] von Todos ein. スクリーンショット 2020-09-26 23.15.44.png Wenn Sie es wie in der Abbildung unten gezeigt speichern können, funktioniert das Modell ordnungsgemäß. スクリーンショット 2020-09-26 23.16.02.png

Verwenden Sie als Nächstes Postman, um die Funktion von CRUD zu überprüfen. Fügen Sie während der Ausführung von manage.py wie zuvor "/ api / users" zur URL des lokalen Hosts hinzu und greifen Sie darauf zu. Geben Sie Ihren Benutzernamen und Ihr Passwort POST ein und rufen Sie es erneut ab. Wenn der Wert wie in der Abbildung unten gezeigt aktualisiert wird, ist die GET- und POST-Kommunikation des BENUTZERS erfolgreich. スクリーンショット 2020-09-26 23.22.40.png

Als nächstes greifen wir auf Todolist zu. Konvertieren Sie den Teil "Benutzer" der URL in "todolist" und greifen Sie darauf zu. スクリーンショット 2020-09-26 23.28.05.png Ich wurde gewarnt, dass ich keine CRUD-Berechtigungen habe, es sei denn, ich bin ein authentifizierter Benutzer. Dies liegt daran, dass ich in views.py geschrieben habe, dass eine Benutzerauthentifizierung erforderlich ist.

Zugriff mit einem Authentifizierungstoken. Das Authentifizierungstoken wird von Postman bezogen.

Starten Sie Postman. Wenn es startet, drücken Sie die weiße Taste "+". スクリーンショット 2020-09-27 9.20.07.png Geben Sie die URL mit "auth" ein. Wählen Sie POST für HTTP-Anforderung. Erstellen Sie unter Body> Formulardaten ein Feld für Benutzername und Passwort und geben Sie den vorhandenen Wert ein. Wenn Sie SENDEN drücken, wird das Token zurückgegeben und Sie können es kopieren. スクリーンショット 2020-09-27 9.32.41.png Starten Sie Chrome ModHeader über Ihren Browser. Drücken Sie die Taste "+" Wählen Sie Autorisierung und geben Sie Token "Kopiertes Token" ein. (Halbwertsbreite nach Token) スクリーンショット 2020-09-27 9.36.43.png Sie können jetzt auch auf die Todolist zugreifen.

5. Bonus: Stellen Sie die API so ein, dass sie vom Frontend verfügbar ist

Installieren Sie CORS. CORS ist ein System, das aus der Weiterleitung von HTTP-Headern besteht und bestimmt, ob der Browser den Front-End-JavaScript-Code daran hindert, auf die Antwort von Anforderungen über Ursprünge hinweg zuzugreifen. Der Ursprung ist übrigens eine Kombination aus "Schema (Protokoll)", "Host (Domäne)" und "Port" der eigenen URL der Ressource.

$ pip install django-cors-headers

Machen Sie Django auf CORS aufmerksam.

setting.py


INSTALLED_APPS = [
   #<Abkürzung> 
   'corsheaders',
]

MIDDLEWARE = [
   #<Abkürzung>
   'corsheaders.middleware.CorsMiddleware',
]

CORS_ORIGIN_WHITELIST = [
    'http://localhost:3000',
]

Sie können jetzt vom Frontend aus darauf zugreifen. Im nächsten Artikel möchte ich zusammenfassen, wie Sie von vorne auf die API zugreifen können.

Verweise

・ Übersicht über Django (https://docs.djangoproject.com/ja/3.1/intro/overview/) ・ Erstellen wir ein Geräteverwaltungstool mit der Django REST-API (https://www.udemy.com/course/django-rest-api/). ・ [Lernnotiz] Informationen zu Migrationen durchführen und migrieren (https://qiita.com/frosty/items/8c715a53d7920c9cd1eb) ・ Ich habe zusammengefasst, was ich mit dem Django REST-Framework gelernt habe (https://qiita.com/breakthrough/items/f845592961d8863a72c5). ・ MDN (https://developer.mozilla.org/ja/docs/Glossary/CORS)

Recommended Posts

So erstellen Sie eine Rest-API in Django
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
So erstellen Sie eine JSON-Datei in Python
So verweisen Sie auf statische Dateien in einem Django-Projekt
Schritte zum Erstellen eines Django-Projekts
So erstellen Sie ein Conda-Paket
So erstellen Sie eine virtuelle Brücke
Wie man CSS in Django reflektiert
Wie erstelle ich eine Docker-Datei?
So erstellen Sie eine Konfigurationsdatei
Erstellen Sie mit Django einen LINE-Bot
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Zurücksetzen des Passworts über die API mit dem Django Rest Framework
So generieren Sie eine Abfrage mit dem IN-Operator in Django
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
So erstellen Sie einen Git-Klonordner
So löschen Sie abgelaufene Sitzungen in Django
So erstellen Sie ein Repository aus Medien
So führen Sie vom Server gesendete Ereignisse in Django durch
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
So stellen Sie eine Django-App in nur 5 Minuten für Heroku bereit
Versuchen Sie, einen Artikel von Qiita mit der REST-API [Umweltvorbereitung] zu erstellen.
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Erstellen Sie einen Django-Zeitplan
So löschen Sie einen Taple in einer Liste (Python)
So implementieren Sie Rails-Helfer-ähnliche Funktionen in Django
Einbetten von Variablen in Python-Strings
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
So entwickeln Sie eine Cart-App mit Django
Ich möchte mit Python ein Fenster erstellen
So reflektieren Sie ImageField in Django + Docker (Kissen)
Erstellen wir eine REST-API mit SpringBoot + MongoDB
So implementieren Sie eine Verlaufsauswahl in Houdini
So erstellen Sie Daten für CNN (Chainer)
So finden Sie den Ansichtsnamen mit dem Namespace über die URL (path_info) in Django
So benachrichtigen Sie Discord-Kanäle in Python
Django REST Framework Ein wenig nützlich zu wissen.
So erstellen Sie ein 1-zeiliges Kivy-Eingabefeld
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Bis Sie eine neue App in Django erstellen
Wie schreibe ich ein benanntes Tupeldokument im Jahr 2020?
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
So zählen Sie Zahlen in einem bestimmten Bereich
So lesen Sie Dateien in verschiedenen Verzeichnissen
Wie man eine öffentliche Funktion in Pytest verspottet
[Hinweis] So erstellen Sie eine Mac-Entwicklungsumgebung
So können Sie die Funktionen des Django Rest Frameworks in einer Datei ausprobieren
Erstellen Sie eine REST-API mit dem in Lobe und TensorFlow Serving erlernten Modell.
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
So generieren Sie automatisch ein API-Dokument mit dem Django REST-Framework und POST vom Dokumentbildschirm
Erstellen Sie einen Filter, um ein Zugriffstoken mit der Graph-API (Flask) zu erhalten.
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser