Bonne façon de consommer les données de RESTFUL API à django

j'essaie d'apprendre le django, alors tant que j'ai une solution actuelle, je ne suis pas sûr qu'elle suive les meilleures pratiques en django. Je voudrais afficher des informations à partir d'une api web sur mon site. Disons que l'url de l'api est la suivante:

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

Thsis retournerait une liste de livres D'Edwards écrits en 2009. Retourné dans le format suivant:

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

actuellement, je consomme L'API dans mon fichier views comme suit:

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)

Normalement, nous prenons les données de la base de données dans le models.py fichier, mais je ne suis pas sûr si je devrais saisir ces données API dans models.py ou views.py. Si elle doit être en models.py, quelqu'un peut-il donner un exemple de la façon de procéder? J'ai écrit l'exemple ci-dessus de façon spécifique pour stackoverflow, de sorte que tous les bogues sont purement un résultat de l'écriture ici.

36
demandé sur bagrat 2015-05-15 15:22:29

3 réponses

I like the approach of putting that kind of logic in a separate service layer (services.py); les données que vous produisez ne sont pas un "modèle" au sens Django ORM, et c'est plus qu'une simple logique de "vue". Une encapsulation propre garantit que vous pouvez faire des choses comme contrôler l'interface vers le service de support (i.e., le faire ressembler à une API Python vs. URL avec des paramètres), ajouter des améliorations telles que la mise en cache, comme @sobolevn mentionné, tester l'API en isolation, etc.

donc je suggère un simple services.py , qui ressemble à quelque chose comme ceci:

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

notez comment les paramètres sont passés (en utilisant une capacité du paquet requests ).

puis dans 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)

voir aussi:

81
répondu bimsapi 2017-10-05 17:45:24

utilisez le sérialiseur à la place de .json, comme il donne la flexibilité de retourner dans un certain nombre de formats.Comme pour l'utilisation de l'api rest, l'utilisation du sérialiseur fourni est préférée.

également garder le traitement des données et obtenir des demandes de données en vue.py.Les formulaires sont utilisés pour templating pas comme la logique d'affaires.

3
répondu prateek 2015-05-21 07:41:39

eh Bien, il ya plusieurs choses à garder à l'esprit. Tout d'abord, dans ce cas, vos données ne change pas si souvent. C'est donc une bonne pratique de cacher ce genre de responsabilités. Il ya beaucoup d'outils de mise en cache autour, mais redis est une option populaire. Alternatevly, vous pouvez choisir la base de données NoSQL supplémentaire juste pour la mise en cache.

Deuxièmement, Quel est le but de l'affichage de ces données? Attendez-vous vos utilisateurs d'interagir avec des livres ou des les auteurs, etc? Si ce n'est qu'une information, il n'y a pas besoin de formulaires et de modèles. Si non, vous devez fournir des vues, des formulaires et des modèles appropriés pour les livres et les auteurs, etc.

et compte tenu de l'endroit où vous devez appeler une requête API, je dirais que cela dépend fortement de la deuxième question. Les choix sont:

  • views.py pour l'affichage des données.
  • forms.py ou encore views.py pour ineractivity.
1
répondu sobolevn 2015-05-18 18:12:06