webentwicklung-frage-antwort-db.com.de

Richtige Möglichkeit, Daten aus der RESTFUL-API in django zu konsumieren

Ich versuche zu lernen, Django======================================================================================= Ich Ich Ich ich ich ich ich ich ich ich ich ich ich ich ich ich ich ich ich ich ich ich ich zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu zu von zu zu zu zu Angenommen, die API-URL lautet wie folgt:

http://api.example.com/books?author=edwards&year=2009

Dies würde eine Liste der Bücher von Edwards aus dem Jahr 2009 zurückgeben. Zurückgegeben in folgendem Format:

{'results':
             [
                {
                   'title':'Book 1',
                   'Author':'Edwards Man',
                   'Year':2009
                },
                {
                   'title':'Book 2',
                   'Author':'Edwards Man',
                   'Year':2009}
           ]
}

Derzeit verwende ich die API in meiner Ansichtsdatei wie folgt:

class BooksPage(generic.TemplateView):
    def get(self,request):
        r = requests.get('http://api.example.com/books?author=edwards&year=2009')
        books = r.json()
        books_list = {'books':books['results']}
        return render(request,'books.html',books_list)

Normalerweise greifen wir Daten aus der Datenbank in der Datei models.py ab, aber ich bin nicht sicher, ob ich diese API-Daten in models.py oder views.py abrufen soll. Wenn es in models.py sein sollte, kann jemand ein Beispiel dafür liefern, wie das gemacht wird? Ich habe das obige Beispiel speziell für den Stackoverflow geschrieben, daher sind alle Fehler nur das Ergebnis des Schreibens hier.

47
user2694306

Mir gefällt der Ansatz, diese Art von Logik in eine separate Service-Ebene (services.py) zu stellen. Die Daten, die Sie rendern, sind kein "Modell" im Sinne von Django ORM, und es ist mehr als eine einfache "Ansicht" -Logik. Eine saubere Kapselung stellt sicher, dass Sie Dinge wie die Steuerung der Schnittstelle zu tun haben Der Backing-Service (dh, er sieht aus wie eine Python API vs. URL mit Parametern)), fügt Verbesserungen wie Caching hinzu, wie @sobolevn erwähnt, testet die API isoliert usw.

Ich würde also ein einfaches services.py Vorschlagen, das ungefähr so ​​aussieht:

def get_books(year, author):
    url = 'http://api.example.com/books' 
    params = {'year': year, 'author': author}
    r = requests.get(url, params=params)
    books = r.json()
    books_list = {'books':books['results']}
    return books_list

Beachten Sie, wie die Parameter übergeben werden (mithilfe einer Funktion des Pakets requests).

Dann in views.py:

import services
class BooksPage(generic.TemplateView):
    def get(self,request):
        books_list = services.get_books('2009', 'edwards')
        return render(request,'books.html',books_list)

Siehe auch:

102
bimsapi

Verwenden Sie den Serializer anstelle von .json, da er die Flexibilität bietet, in einer Reihe von Formaten zurückzukehren. Wie bei der Verwendung von rest-api wird die Verwendung des bereitgestellten Serializers bevorzugt.

Behalten Sie auch die Datenverarbeitung bei und erhalten Sie Datenanfragen in view.py. Die Formulare dienen nicht als Vorlage für die Geschäftslogik.

3
Prateek099

Nun, es gibt mehrere Dinge zu beachten. In diesem Fall ändern sich Ihre Daten nicht so oft. Es ist daher eine gute Praxis, diese Art von Antworten zwischenzuspeichern. Es gibt viele Caching-Tools, aber redis ist eine beliebte Option. Alternativ können Sie eine zusätzliche NoSQL-Datenbank nur zum Cachen auswählen.

Was ist zweitens der Zweck der Anzeige dieser Daten? Erwarten Sie, dass Ihre Benutzer mit Büchern, Autoren usw. interagieren? Wenn es sich nur um eine Information handelt, besteht keine Notwendigkeit für Formulare und Modelle. Andernfalls müssen Sie korrekte Ansichten, Formulare und Modelle für Bücher und Autoren usw. bereitstellen.

Und in Anbetracht der Stelle, an der Sie eine API-Anfrage aufrufen sollten, würde ich sagen, dass dies stark von der zweiten Frage abhängt. Zur Auswahl stehen:

  • views.py zum einfachen Anzeigen von Daten.
  • forms.py oder noch views.py für Inaktivität.
1
sobolevn