Python请求+ Django更改了网址中的参数结构

时间:2019-05-12 06:41:07

标签: python django python-requests

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

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

提交表单后,我可以使用这个单个参数根据需要获取json中的字典列表,并且输入appers关键字“ Hobbit”和URL如下所示的json数据

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

但是当我尝试添加Google Books API提供的特殊关键字时, 标题,作者,发布者,主题

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

http://127.0.0.1:8000/api?books=hobbit 标题 =&作者 =&发布者 =& isbn =& lccn =& oclc =

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

https://www.googleapis.com/books/v1/volumes?q=flowers + 作者 + 主题 somesubject

因此,如您所见,正确的URL出现了符号

+ 针对针对 =

所以我想要的正确URL看起来像这样

http://127.0.0.1:8000/api?books=hobbit + 标题:something + 作者:something + 发布者: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})

1 个答案:

答案 0 :(得分: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.GETQueryDict对象,它是不可变的。要将其转换为可变对象,可以使用request.GET.copy()(它会创建可变的副本)。