Python-requests + Django 更改 URL 中的参数结构

标签 python django python-requests

基本上,我已经通过 Google Books API 使用单个 q 参数完成了 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 提供的特殊关键字时,例如, 标题、作者、出版者、主题

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

http://127.0.0.1:8000/api?books=hobbit &intitle=&inauthor=&inpublisher=&isbn=&lccn< b>=&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< b>:something+oclc:something

我的问题是如何根据 Google 图书 API 的要求更改此结构以更正?

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

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

最佳答案

您必须手动构建查询字符串。假设您的请求看起来像 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()(创建一个可变的副本)。

关于Python-requests + Django 更改 URL 中的参数结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56096798/

相关文章:

PHP API 无法在 apache2 Ubuntu 服务器上使用 Django |谷歌云

python - 在指定位置添加字符到字符串 - Django

python - Google Scrape with Python 中的结果数量错误

python - 如何使用请求测量下载速度和进度?

python - AWS Elastic Beanstalk 容器命令失败

python - 如何在 Python 3 中使用 "isclose"比较而不是绝对相等 (==) 对带有 float 的元组进行排序?

python - 查找字符串中三个 ASCII 系列的重复出现

python - 如何在特定时间之前重试 Celery 任务?

python - 我正在尝试网络抓取 http ://angel. co/bloomfire

python - NumPy C-API : convert type object to type number