[docs]classStaticFile:""" This class describes a static file. """
[docs]def__init__(self,settings:Settings,filename:str,update_timeout:Optional[int]=3600,precache:Optional[bool]=False,):"""Constructs a Static File Args: settings (Settings): settings of webapp. filename (str, optional): static filename without static dir. update_timeout (int, optional): timeout to update inmemory-cache file content. Defaults to 3600. precache (bool, optional): preload a file content flag. Defaults to False. Raises: StaticFileNotFoundError: static file at static dir not found """self.settings:Settings=settingsself.filename:str=f"/{settings.STATIC_DIR}/{filename}".replace("//","/")self.abs_filename:Path=Path(os.path.join(self.settings.BASE_DIR,self.settings.STATIC_DIR,filename))ifnotself.abs_filename.exists():raiseStaticFileNotFoundError(f'Static file "{self.abs_filename}" not found.')self.content_cache:InMemoryCache=InMemoryCache(timeout=update_timeout)self.precache:bool=precacheself.preloaded_value:Optional[str]=Noneifself.precache:self.preloaded_value=self.caching_static_file()
[docs]defcaching_static_file(self):"""Set and save static file to cache"""content=self._load_content()item=self.content_cache.get(self.filename)ifitemisNone:logger.debug(f"Caching static file: {self.filename}")self.content_cache.set(self.filename,content)item=contentelse:logger.debug(f"Load static file from cache: {self.filename}")returnitem
def_load_content(self)->str:"""Load content of static file Returns: str: content """withopen(self.abs_filename,"r")asfile:returnfile.read().strip()
[docs]defget_content_type(self)->str:"""Get content type Returns: str: get mimetype """content_type,_=mimetypes.guess_type(str(self.abs_filename))returncontent_typeor"application/octet-stream"
[docs]defget_file_size(self)->int:"""Get file size Returns: int: file st size """returnself.abs_filename.stat().st_size
[docs]classStaticFilesManager:""" This class describes a static files manager. """
[docs]def__init__(self,static_files:List[StaticFile]):"""Initialize manager Args: static_files (List[StaticFile]): list of static files. """self.static_files=static_files
[docs]defget_file_type(self,url:str)->str|None:"""Get file content type Args: url (str): static file url Returns: str | None: content type """forstatic_fileinself.static_files:ifstatic_file.filename==url:returnstatic_file.get_content_type()
[docs]defget_file_size(self,url:str)->int|None:"""Get file size Args: url (str): url of static page Returns: int | None: file size """forstatic_fileinself.static_files:ifstatic_file.filename==url:returnstatic_file.get_file_size()
[docs]defserve_static_file(self,url:str)->str|bool:"""Serve static files Args: url (str): URL for serving Returns: str | bool: static file content or False if static file not found """url=prepare_url(url)forstatic_fileinself.static_files:ifstatic_file.filename==url:logger.info(f"Found static file: {static_file.filename}")ifstatic_file.precache:logger.debug(f"Use preloaded value of static file {static_file}")returnstatic_file.preloaded_valueelse:returnstatic_file.caching_static_file()returnFalse