huawei_storage.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from collections.abc import Generator
  2. from flask import Flask
  3. from obs import ObsClient
  4. from extensions.storage.base_storage import BaseStorage
  5. class HuaweiStorage(BaseStorage):
  6. """Implementation for huawei obs storage."""
  7. def __init__(self, app: Flask):
  8. super().__init__(app)
  9. app_config = self.app.config
  10. self.bucket_name = app_config.get("HUAWEI_OBS_BUCKET_NAME")
  11. self.client = ObsClient(
  12. access_key_id=app_config.get("HUAWEI_OBS_ACCESS_KEY"),
  13. secret_access_key=app_config.get("HUAWEI_OBS_SECRET_KEY"),
  14. server=app_config.get("HUAWEI_OBS_SERVER"),
  15. )
  16. def save(self, filename, data):
  17. self.client.putObject(bucketName=self.bucket_name, objectKey=filename, content=data)
  18. def load_once(self, filename: str) -> bytes:
  19. data = self.client.getObject(bucketName=self.bucket_name, objectKey=filename)["body"].response.read()
  20. return data
  21. def load_stream(self, filename: str) -> Generator:
  22. def generate(filename: str = filename) -> Generator:
  23. response = self.client.getObject(bucketName=self.bucket_name, objectKey=filename)["body"].response
  24. yield from response.read(4096)
  25. return generate()
  26. def download(self, filename, target_filepath):
  27. self.client.getObject(bucketName=self.bucket_name, objectKey=filename, downloadPath=target_filepath)
  28. def exists(self, filename):
  29. res = self._get_meta(filename)
  30. if res is None:
  31. return False
  32. return True
  33. def delete(self, filename):
  34. self.client.deleteObject(bucketName=self.bucket_name, objectKey=filename)
  35. def _get_meta(self, filename):
  36. res = self.client.getObjectMetadata(bucketName=self.bucket_name, objectKey=filename)
  37. if res.status < 300:
  38. return res
  39. else:
  40. return None