""".. image:: ../_static/mongodb.png`GridFS <https://docs.mongodb.com/manual/core/gridfs/>`_ is a specification for storing large files(>16 MB) in MongoDB. See :py:mod:`~requests_cache.backends.mongodb` for more general info on MongoDB.API Reference^^^^^^^^^^^^^.. automodsumm:: requests_cache.backends.gridfs :classes-only: :nosignatures:"""fromgridfsimportGridFSfrompymongoimportMongoClientfrom.importget_valid_kwargsfrom.baseimportBaseCache,BaseStoragefrom.mongodbimportMongoDict
[docs]classGridFSCache(BaseCache):"""GridFS cache backend. Example: >>> session = CachedSession('http_cache', backend='gridfs') Args: db_name: Database name connection: :py:class:`pymongo.MongoClient` object to reuse instead of creating a new one kwargs: Additional keyword arguments for :py:class:`pymongo.MongoClient` """def__init__(self,db_name:str,**kwargs):super().__init__(**kwargs)self.responses=GridFSPickleDict(db_name,**kwargs)self.redirects=MongoDict(db_name,collection_name='redirects',connection=self.responses.connection,**kwargs)
[docs]classGridFSPickleDict(BaseStorage):"""A dictionary-like interface for a GridFS database Args: db_name: Database name collection_name: Ignored; GridFS internally uses collections 'fs.files' and 'fs.chunks' connection: :py:class:`pymongo.MongoClient` object to reuse instead of creating a new one kwargs: Additional keyword arguments for :py:class:`pymongo.MongoClient` """def__init__(self,db_name,collection_name=None,connection=None,**kwargs):super().__init__(**kwargs)connection_kwargs=get_valid_kwargs(MongoClient,kwargs)self.connection=connectionorMongoClient(**connection_kwargs)self.db=self.connection[db_name]self.fs=GridFS(self.db)def__getitem__(self,key):result=self.fs.find_one({'_id':key})ifresultisNone:raiseKeyErrorreturnself.serializer.loads(result.read())def__setitem__(self,key,item):try:self.__delitem__(key)exceptKeyError:passvalue=self.serializer.dumps(item)encoding=Noneifisinstance(value,bytes)else'utf-8'self.fs.put(value,encoding=encoding,**{'_id':key})def__delitem__(self,key):res=self.fs.find_one({'_id':key})ifresisNone:raiseKeyErrorself.fs.delete(res._id)def__len__(self):returnself.db['fs.files'].estimated_document_count()def__iter__(self):fordinself.fs.find():yieldd._id