[英]Storing response as json in Python requests-cache
你想做的事情是有道理的,但它比看起來要復雜一些。 您看到的響應文件是requests.Response
對象的表示。 Response._content
包含從服務器接收到的原始字節。 然后,諸如Response.json()
和Response.text
之類的包裝器方法和屬性將嘗試解碼該內容。 要使Response
object 正常工作,它需要具有原始二進制響應主體。
當請求緩存將該響應序列化為 JSON 時,二進制內容以 Base85 編碼。 這就是為什么您在那里看到編碼字節而不是 JSON 的原因。 要將包括響應主體在內的所有內容保存在 JSON 中,有幾個選項:
制作自定義序列化程序。 如果您希望能夠修改響應內容並將這些更改反映在請求緩存返回的響應中,這可能是最好的方法。
這可能會變得有點復雜,因為您必須:
Response
object不過,這是可行的。 如果需要,我可以稍后嘗試提出一個例子。
制作自定義后端。 它可以擴展FileCache
和FileDict
,並將有效的 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.