Flask-Uploads结合应用工厂使用:跨模块无法访问UploadSet的技术问询
这个问题我之前也碰到过!应用工厂模式确实会让扩展实例的共享变得有点麻烦,不过很容易解决,核心思路就是把UploadSet实例从工厂函数里抽出来,变成全局可导入的对象,然后在工厂函数里完成配置就行。
解决方案步骤
1. 创建单独的uploads模块
在你的app目录下新建一个uploads.py文件,专门用来存放UploadSet实例,这样所有需要用到的地方都能轻松导入:
# app/uploads.py from flask_uploads import UploadSet, IMAGES # 在这里定义UploadSet实例,其他文件可以直接导入 images = UploadSet('images', IMAGES)
2. 在应用工厂中配置UploadSet
修改app/__init__.py,导入上面定义的images实例,然后在create_app函数里完成配置:
# app/__init__.py from flask_uploads import configure_uploads from .uploads import images # 导入我们的UploadSet实例 def create_app(object_name): app = Flask(__name__) # 加载配置、注册蓝图等其他操作... # 用导入的实例完成应用配置 configure_uploads(app, images) return app
3. 在路由文件中使用UploadSet实例
现在你就可以在app/controllers/editions.py里直接导入images实例,正常处理文件上传了:
# app/controllers/editions.py from flask_uploads import UploadNotAllowed from ..uploads import images # 导入UploadSet实例 # 示例路由:处理图片上传 @editions.route('/upload-image', methods=['POST']) def upload_image(): try: # 保存上传的文件 filename = images.save(request.files['image_file']) return f"图片上传成功!文件名:{filename}" except UploadNotAllowed: return "不允许的文件类型,请上传图片格式文件!", 400
额外注意事项
- 别忘了在你的Flask配置中设置文件存储路径,比如在配置类里添加:
UPLOADED_IMAGES_DEST = os.path.join(BASE_DIR, 'uploads/images')(这里的images要和UploadSet的名字对应) - 如果有多个不同类型的UploadSet,都可以统一放在
uploads.py里管理,既清晰又方便维护
内容的提问来源于stack exchange,提问作者Daniel da Rocha
相关产品推荐
相关产品推荐

