2 votes

Python-requests + Django : changement de la structure des paramètres dans l'URL

Pour l'essentiel, j'ai utilisé Python-requests et la fonction de recherche de Django via l'API de Google Books avec un seul q paramètre (comme indiqué dans le lien ci-dessous)

https://developers.google.com/books/docs/v1/using#WorkingVolumes

et après avoir soumis le formulaire, j'obtiens la liste des dicts en json comme je le veux avec ce seul paramètre, et j'obtiens dans les données json où apparaît le mot clé "Hobbit" et l'URL ressemble à ceci

http://127.0.0.1:8000/api?books=hobbit

mais lorsque j'essaie d'ajouter des mots-clés spéciaux fournis par l'API de Google Livres, comme.., intitle, inauthor, inpublisher, subject etc.

et en essayant de le rechercher, j'obtiens une URL

http://127.0.0.1:8000/api?books=hobbit & Intitulé \=& dans l'auteur \=& en éditeur \=& isbn \=& lccn \=& oclc \=

qui ne renvoie que les données d'un seul q car l'URL correcte pour les mots-clés spéciaux dans l'API de Google Livres ressemble à ceci

https://www.googleapis.com/books/v1/volumes?q=flowers + dans l'auteur : keyes + sujet : un sujet

Donc, comme vous le voyez, l'URL correct a obtenu des signes

+ contre & et : contre \=

donc l'URL correcte que je veux obtenir ressemblerait à ceci

http://127.0.0.1:8000/api?books=hobbit + Intitulé :quelque chose+ dans l'auteur :quelque chose+ en éditeur :quelque chose+ isbn :quelque chose+ lccn :quelque chose+ oclc :quelque chose

Ma question est la suivante : comment modifier cette structure pour qu'elle soit correcte, comme l'exige l'API de Google Books ?

J'ai essayé de trouver cela dans la documentation de python-requests mais il n'y a rien à ce sujet.

vues.py

def api(request):
    books = {
        'intitle': 'intitle',
        'inauthor': 'inauthor',
        'inpublisher': 'inpublisher',
        'subject': 'subject',
        'isbn': 'isbn',
        'lccn': 'lccn',
        'oclc': 'oclc'
    }
    if 'books' in request.GET:
        books = request.GET['books']
        url = 'https://www.googleapis.com/books/v1/volumes?q=%s' % books
        response = requests.get(url)
        books = response.json()
        print(type(books))
        with open("data_file.json", "w") as write_file:
            json.dump(books, write_file)

    return render(request, 'books/api.html', {'books': books})

1voto

Keyur Potdar Points 5978

Vous devrez construire la chaîne de requête manuellement. En supposant que votre requête ressemblera à http://127.0.0.1:8000/api?books=hobbit&intitle=a&inauthor=b&inpublisher=c vous pouvez construire la chaîne de requête comme ceci :

def api(request):
    # ...
    if 'books' in request.GET:
        books = request.GET['books']
        query_dict = request.GET.copy()
        del query_dict['books']
        query = '+'.join([books, *['{}:{}'.format(k, v) for k, v in query_dict.items()]])
        url = 'https://www.googleapis.com/books/v1/volumes?q=' + query
        # ...

La requête finale de google nécessite livres comme premier paramètre. Donc, nous devons extraire le livres valeur de request.GET . Maintenant, pour obtenir toutes les autres valeurs, nous devons supprimer l'élément livres clé. Mais, request.GET es un QueryDict qui est immuable. Pour le convertir en un objet mutable, request.GET.copy() peut être utilisé (ce qui crée un fichier mutable copie ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X