2015-05-15 12 views
26

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 è la seguente:Modo corretto di utilizzare i dati dall'API RESTFUL in django

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

Thsis restituirebbe una lista di libri da Edwards scritti nel 2009. Tornato 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 punto di vista file 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, afferrare i dati dal database nel file models.py, ma non sono sicuro se devo afferrando 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.

+1

Dai un'occhiata a Django Rest Framework. – alexhb

+14

Non è quello per la costruzione di web apis? Sto provando a leggere da uno esterno. – user2694306

risposta

60

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, ecc

quindi consiglio un semplice services.py, che sembra qualcosa di simile:

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 viene passato (con una capacità del pacchetto requests).

Poi nel 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) 

Consulta anche:

+0

Mi manca qualcosa qui? 'get_books()' non restituisce una variabile ... –

+0

Questa era un'omissione nella risposta. Corretto. – bimsapi

+0

@bimsapi - si può usare questo approccio per le operazioni CRUD - o - dovrebbe avvenire una sorta di serializzazione? Ho visto queste opzioni: http://www.django-rest-framework.org/api-guide/serializers/#modelserializer https://pypi.python.org/pypi/django-rest-models TIA –

1

Bene, ci sono diverse 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. Esistono molti strumenti di memorizzazione nella cache, ma l'opzione redis è molto 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 visualizzazioni, moduli e modelli appropriati per libri e autori, ecc.

E considerando il luogo in cui si dovrebbe chiamare una richiesta API, direi che dipende in gran parte dalla seconda domanda. Le scelte sono:

  • views.py per la semplice visualizzazione dei dati.
  • forms.py o ancora views.py per inerzia.
2

Utilizzare il serializzatore al posto di.json, in quanto offre flessibilità per il ritorno in una serie di formati. Mentre si utilizza il resto-api, l'uso del serializzatore fornito è preferito.

Mantenere anche la gestione dei dati e ottenere richieste di dati in view.py.I moduli vengono utilizzati per il modello non come logica aziendale.

Problemi correlati