簡體   English   中英

在 Python 請求緩存中將響應存儲為 json

[英]Storing response as json in Python requests-cache

我正在使用請求緩存以人類可讀的格式緩存 http 響應。 我已經使用filesystem后端修補了requests ,並將序列化器修補為json ,如下所示:

import requests_cache
requests_cache.install_cache('example_cache', backend='filesystem', serializer='json')

響應確實緩存為 json,但響應的正文已編碼(我猜使用cattrs庫,如此所述)。

有沒有辦法讓requests-cache按原樣保存響應?

你想做的事情是有道理的,但它比看起來要復雜一些。 您看到的響應文件是requests.Response對象的表示。 Response._content包含從服務器接收到的原始字節。 然后,諸如Response.json()Response.text之類的包裝器方法和屬性將嘗試解碼該內容。 要使Response object 正常工作,它需要具有原始二進制響應主體。

當請求緩存將該響應序列化為 JSON 時,二進制內容以 Base85 編碼。 這就是為什么您在那里看到編碼字節而不是 JSON 的原因。 要將包括響應主體在內的所有內容保存在 JSON 中,有幾個選項:

選項1

制作自定義序列化程序 如果您希望能夠修改響應內容並將這些更改反映在請求緩存返回的響應中,這可能是最好的方法。

這可能會變得有點復雜,因為您必須:

  1. 處理無效的響應內容 JSON,並另存為編碼字節
  2. 在反序列化過程中,如果內容保存為 JSON,將其轉換回字節以重新創建原始Response object

不過,這是可行的。 如果需要,我可以稍后嘗試提出一個例子。

選項 2

制作自定義后端 它可以擴展FileCacheFileDict ,並將有效的 JSON 內容復制到一個單獨的文件中。 這是一個工作示例:

import json
from os.path import splitext

from requests import Response
from requests_cache import CachedSession, FileCache, FileDict


class JSONFileCache(FileCache):
    """Filesystem backend that copies JSON-formatted response content into a separate file
    alongside the main response file
    """
    def __init__(self, cache_name, **kwargs):
        super().__init__(cache_name, **kwargs)
        self.responses = JSONFileDict(cache_name, **kwargs)



class JSONFileDict(FileDict):
    def __setitem__(self, key: str, value: Response):
        super().__setitem__(key, value)
        response_path = splitext(self._path(key))[0]
        json_path = f'{response_path}_content.json'

        # Will handle errors and skip writing if content can't be decoded as JSON
        with self._try_io(ignore_errors=True):
            content = json.dumps(value.json(), indent=2)
            with open(json_path, mode='w') as f:
                f.write(content)

使用示例:

custom_backend = JSONFileCache('example_cache', serializer='json')
session = CachedSession(backend=custom_backend)
session.get('https://httpbin.org/get')

發出請求后,您將看到一對文件,例如:

example_cache/680f2a52944ee079.json
example_cache/680f2a52944ee079_content.json

這可能不是你想要的,但如果你只需要閱讀響應內容而不需要修改它,這是最簡單的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM