python - tutorial - Modo corretto per consumare i dati dall'API RESTFUL in django




django rest framework tutorial (2)

Sto cercando di imparare Django così mentre ho una soluzione corrente non sono sicuro che segua le migliori pratiche in django. Mi piacerebbe visualizzare le informazioni da una web api sul mio sito web. Diciamo che l'URL api è il seguente:

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

Questo avrebbe restituito un elenco di libri di Edwards scritto nell'anno 2009. Restituito nel seguente formato:

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

Attualmente sto consumando l'API nel mio file delle viste come segue:

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)

Normalmente, prendiamo i dati dal database nel file models.py, ma non sono sicuro se dovrei prendere questi dati API in models.py o views.py. Se dovrebbe essere in models.py, qualcuno può fornire un esempio di come farlo? Ho scritto l'esempio di cui sopra in modo specifico per StackOverflow, quindi qualsiasi bug è puramente un risultato della sua scrittura qui.


Bene, ci sono molte cose da tenere a mente. Prima di tutto, in questo caso i tuoi dati non cambiano così spesso. Quindi è una buona pratica mettere in cache questo tipo di risposte. Ci sono molti strumenti di memorizzazione nella cache, ma i redis sono un'opzione popolare. In alternativa, puoi scegliere un database NoSQL aggiuntivo solo per la memorizzazione nella cache.

In secondo luogo, qual è lo scopo di visualizzare questi dati? Ti aspetti che i tuoi utenti interagiscano con libri o autori, ecc.? Se è solo un'informazione, non c'è bisogno di forme e modelli. In caso contrario, è necessario fornire viste, moduli e modelli adeguati per libri e autori, ecc.

E considerando il luogo in cui dovresti chiamare una richiesta API, direi che dipende in larga misura dalla seconda domanda. Le scelte sono:

  • views.py per la semplice visualizzazione dei dati.
  • forms.py o ancora views.py per inerritività.

Mi piace l'approccio di mettere quel tipo di logica in un livello di servizio separato (services.py); i dati che stai rendendo non sono un "modello" nel senso di ORG di Django, ed è più che semplice logica di "visione". Un incapsulamento pulito assicura che tu possa fare cose come controllare l'interfaccia per il servizio di supporto (cioè assomigliare a un'API Python e URL con parametri), aggiungere miglioramenti come la cache, come @sobolevn menzionato, testare l'API in isolamento, eccetera.

Quindi suggerirei un semplice services.py , che assomiglia a qualcosa del genere:

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

Nota come i parametri vengono passati (usando una capacità del pacchetto di requests ).

Quindi 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)

Guarda anche:





restful-architecture