From 9b8d6329959cda531338b99d4a364508f7f654e6 Mon Sep 17 00:00:00 2001 From: resonate <1650473152@qq.com> Date: Mon, 24 Jan 2022 12:52:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/extend/cache.py | 18 +++++- common/extend/{celery.py => celeryer.py} | 0 common/extend/migrate.py | 2 +- common/utils/uploads/__init__.py | 14 +++++ common/utils/uploads/base_uploader.py | 19 ++++++ common/utils/uploads/file_system_uploader.py | 62 ++++++++++++++++++++ common/utils/uploads/qiniu_uploader.py | 21 +++++++ common/utils/uploads/upyun_uploader.py | 21 +++++++ entrance/extensions.py | 2 +- modules/sys/models/file.py | 20 +++++++ 10 files changed, 176 insertions(+), 3 deletions(-) rename common/extend/{celery.py => celeryer.py} (100%) create mode 100644 common/utils/uploads/__init__.py create mode 100644 common/utils/uploads/base_uploader.py create mode 100644 common/utils/uploads/file_system_uploader.py create mode 100644 common/utils/uploads/qiniu_uploader.py create mode 100644 common/utils/uploads/upyun_uploader.py create mode 100644 modules/sys/models/file.py diff --git a/common/extend/cache.py b/common/extend/cache.py index 1a0febd..cc14867 100644 --- a/common/extend/cache.py +++ b/common/extend/cache.py @@ -1,3 +1,19 @@ -from cachelib import RedisCache +from flask import current_app +from cachelib.file import FileSystemCache +from cachelib.memcached import MemcachedCache +from cachelib.redis import RedisCache +from cachelib.simple import SimpleCache +from cachelib.uwsgi import UWSGICache +cacher: dict = { + 'filesystem': FileSystemCache, + 'memcached': MemcachedCache, + 'redis': RedisCache, + 'simple': SimpleCache, + 'uwsgi': UWSGICache +} cache = RedisCache() + + +def get_cache(): + return cache.get(current_app.config.get("CACHE_TYPE") or "filesystem")() diff --git a/common/extend/celery.py b/common/extend/celeryer.py similarity index 100% rename from common/extend/celery.py rename to common/extend/celeryer.py diff --git a/common/extend/migrate.py b/common/extend/migrate.py index d6a949d..8ffb565 100644 --- a/common/extend/migrate.py +++ b/common/extend/migrate.py @@ -1,7 +1,7 @@ from flask_migrate import Migrate from common.extend.orm import db -# from entrance.models import model_lists +from entrance.models import model_lists migrate = Migrate(db=db, directory='entrance/migrations') diff --git a/common/utils/uploads/__init__.py b/common/utils/uploads/__init__.py new file mode 100644 index 0000000..aaefc89 --- /dev/null +++ b/common/utils/uploads/__init__.py @@ -0,0 +1,14 @@ +from file_system_uploader import FilesystemUploader +from qiniu_uploader import QiniuUploader +from upyun_uploader import UpyunUploader +from flask import current_app + +uploader: dict = { + "filesystem": FilesystemUploader, + "qiniu": QiniuUploader, + 'upyun': UpyunUploader +} + + +def get_uploader(): + return uploader.get(current_app.config.get("UPLOAD_PROVIDER") or "filesystem")() diff --git a/common/utils/uploads/base_uploader.py b/common/utils/uploads/base_uploader.py new file mode 100644 index 0000000..0e004ad --- /dev/null +++ b/common/utils/uploads/base_uploader.py @@ -0,0 +1,19 @@ +class BaseUploader(object): + def __init__(self): + raise NotImplementedError + + def store(self, fileobj, filename): + raise NotImplementedError + + def upload(self, file_obj, filename): + raise NotImplementedError + + def download(self, filename): + raise NotImplementedError + + def delete(self, filename): + raise NotImplementedError + + def sync(self): + raise NotImplementedError + diff --git a/common/utils/uploads/file_system_uploader.py b/common/utils/uploads/file_system_uploader.py new file mode 100644 index 0000000..241b469 --- /dev/null +++ b/common/utils/uploads/file_system_uploader.py @@ -0,0 +1,62 @@ +import os +import posixpath +from pathlib import PurePath +from shutil import copyfileobj, rmtree + +from PIL.features import codecs +from flask import current_app, send_file +from werkzeug.utils import safe_join, secure_filename + +from common.utils.uploads.base_uploader import BaseUploader + + +def hexencode(s): + if isinstance(s, (str,)): + s = s.encode("utf-8") + encoded = codecs.encode(s, "hex") + try: + encoded = encoded.decode("utf-8") + except UnicodeDecodeError: + pass + return encoded + + +class FilesystemUploader(BaseUploader): + def __init__(self, base_path=None): + super(BaseUploader, self).__init__() + self.base_path = base_path or current_app.config.get("UPLOAD_FOLDER") + + def store(self, fileobj, filename): + location = os.path.join(self.base_path, filename) + directory = os.path.dirname(location) + + if not os.path.exists(directory): + os.makedirs(directory) + + with open(location, "wb") as dst: + copyfileobj(fileobj, dst, 16384) + + return filename + + def upload(self, file_obj, filename): + if len(filename) == 0: + raise Exception("Empty filenames cannot be used") + + filename = secure_filename(filename) + md5hash = hexencode(os.urandom(16)) + file_path = posixpath.join(md5hash, filename) + + return self.store(file_obj, file_path) + + def download(self, filename): + return send_file(safe_join(self.base_path, filename), as_attachment=True) + + def delete(self, filename): + if os.path.exists(os.path.join(self.base_path, filename)): + file_path = PurePath(filename).parts[0] + rmtree(os.path.join(self.base_path, file_path)) + return True + return False + + def sync(self): + pass diff --git a/common/utils/uploads/qiniu_uploader.py b/common/utils/uploads/qiniu_uploader.py new file mode 100644 index 0000000..00dfe85 --- /dev/null +++ b/common/utils/uploads/qiniu_uploader.py @@ -0,0 +1,21 @@ +from base_uploader import BaseUploader + + +class QiniuUploader(BaseUploader): + def __init__(self): + raise NotImplementedError + + def store(self, fileobj, filename): + raise NotImplementedError + + def upload(self, file_obj, filename): + raise NotImplementedError + + def download(self, filename): + raise NotImplementedError + + def delete(self, filename): + raise NotImplementedError + + def sync(self): + raise NotImplementedError diff --git a/common/utils/uploads/upyun_uploader.py b/common/utils/uploads/upyun_uploader.py new file mode 100644 index 0000000..809d5ad --- /dev/null +++ b/common/utils/uploads/upyun_uploader.py @@ -0,0 +1,21 @@ +from base_uploader import BaseUploader + + +class UpyunUploader(BaseUploader): + def __init__(self): + raise NotImplementedError + + def store(self, fileobj, filename): + raise NotImplementedError + + def upload(self, file_obj, filename): + raise NotImplementedError + + def download(self, filename): + raise NotImplementedError + + def delete(self, filename): + raise NotImplementedError + + def sync(self): + raise NotImplementedError diff --git a/entrance/extensions.py b/entrance/extensions.py index 4fe838b..5fc8a47 100644 --- a/entrance/extensions.py +++ b/entrance/extensions.py @@ -1,6 +1,6 @@ from flask import Flask -from common.extend.celery import register_celery +from common.extend.celeryer import register_celery from common.extend.limit import limiter from common.extend.orm import db from common.extend.migrate import migrate diff --git a/modules/sys/models/file.py b/modules/sys/models/file.py new file mode 100644 index 0000000..4c27ca7 --- /dev/null +++ b/modules/sys/models/file.py @@ -0,0 +1,20 @@ +import datetime + +from common.model import BaseModel, Integer, Column, String, CHAR, DateTime, SQLAlchemyAutoSchema + + +class File(BaseModel): + __tablename__ = 'sys_file' + id = Column(Integer, primary_key=True) + name = Column(String(255), nullable=False) + href = Column(String(255)) + mime = Column(CHAR(50), nullable=False) + size = Column(CHAR(30), nullable=False) + create_time = Column(DateTime, default=datetime.datetime.now) + + +class AdminLogSchema(SQLAlchemyAutoSchema): + class Meta: + model = False + include_fk = True + load_instance = True