【问题标题】:Python-requests + Django changing the parameters structure in URLPython-requests + Django 更改 URL 中的参数结构
【发布时间】:2019-05-12 06:41:07
【问题描述】:

基本上,我已经通过带有单个 q 参数的 Google Books API 完成了 Python 请求和 Django 搜索功能(如下面的链接所示)

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

在提交表单后,我使用这个单个参数得到了我想要的 json 中的字典列表,并且我得到了 json 数据,其中 appers 关键字“Hobbit”和 URL 看起来像这样

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

但是当我尝试添加由 Google Books API 提供的特殊关键字时,例如, intitle、inauthor、inpublisher、subject

并尝试搜索它,我得到了 URL

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

只返回单个 q 参数的数据,因为 Google Books API 中特殊关键字的正确 URL 如下所示

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

我的问题是如何更改此结构以按照 Google 图书 API 的要求进行更正?

试图在 python-requests 文档中找到这个,但没有关于这个

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

【问题讨论】:

    标签: python django python-requests


    【解决方案1】:

    您必须手动构建查询字符串。假设你的请求看起来像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 作为第一个参数。因此,我们需要从request.GET 中提取 books 值。现在,要获取所有其他值,我们需要删除 books 键。但是,request.GET 是一个 QueryDict 对象,它是不可变的。要将其转换为可变对象,可以使用request.GET.copy()(创建可变副本)。

    【讨论】:

    • 嘿@Keyur,我的请求实际上现在看起来像这样,但我想要的是将每个符号 & 更改为 + 并将每个 = 更改为:
    • 当您提交表单时,您将获得我在回答中提到的网址。无需更改 url 本身,使用 url 即可轻松构建所需的字符串。
    • 好的,你能解释一下copy的用法吗?没看懂
    • 在答案中添加了解释。
    • 其余代码将保持不变。你所做的应该有效。
    猜你喜欢
    • 2016-01-08
    • 2018-10-21
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多