Python-запросы + Django изменяют структуру параметров в URL - PullRequest
1 голос
/ 12 мая 2019

В основном я сделал с Python-запросами и функцией поиска Django через API Google Книг с одним параметром q (как показано в ссылке ниже)

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

и после отправки формы я получаю список диктов в json, как я хочу с этим единственным параметром, и я получаю в данных json, где ключевое слово appers "Hobbit" и URL выглядят так

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

но когда я пытаюсь добавить специальные ключевые слова, предоставляемые API Google Книг, например, intitle, inauthor, inpublisher, предмет и т. Д.

и пытаясь найти его, я получаю URL

http://127.0.0.1:8000/api?books=hobbit&intitle=&inauthor=&inpublisher=&isbn=&lccn=&oclc=

, который возвращает данные только одного параметра q , поскольку правильный URL-адрес для специальных ключевых слов в API Книг Google выглядит следующим образом

https://www.googleapis.com/books/v1/volumes?q=flowers+inauthor:keyes+subject:somesubject

Итак, как вы видите, правильный URL получил знаки

+ против & и : против =

поэтому правильный URL-адрес, который я хочу получить, будет выглядеть так

http://127.0.0.1:8000/api?books=hobbit+intitle:something+inauthor:something+inpublisher:something+isbn:something+lccn:something+oclc:something

Мой вопрос: как изменить эту структуру, чтобы она соответствовала требованиям API книг Google?

Пытался найти это в документации по python-запросам, но в этом нет ничего

* * Views.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})

1 Ответ

1 голос
/ 12 мая 2019

Вам нужно будет создать строку запроса вручную.Предполагая, что ваш запрос будет выглядеть как http://127.0.0.1:8000/api?books=hobbit&intitle=a&inauthor=b&inpublisher=c,, вы можете построить строку запроса следующим образом:

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
        # ...

Для окончательного запроса Google в качестве первого параметра требуется books .Итак, нам нужно извлечь значение books из request.GET.Теперь, чтобы получить все остальные значения, нам нужно удалить ключ books .Но request.GET является QueryDict объектом, который является неизменным.Чтобы преобразовать его в изменяемый объект, можно использовать request.GET.copy() (что создает изменчивую копию ).

...