Flask 中使用 Celery 上传、调整大小并将图片存储到 Amazon S3
在本文中,我们将介绍如何在 Flask 中使用 Celery 完成图片上传、调整大小并将其存储到 Amazon S3 的任务。
阅读更多:Flask 教程
1. 概述
当用户上传图片时,通常需要将其调整为适当的尺寸,并将其存储到云存储服务中。使用 Celery,我们可以将这些耗时的任务异步处理,以提高网站的响应速度。
2. 准备工作
在开始之前,我们需要做以下准备工作:
– 安装 Flask 和 Celery 模块
– 配置 Amazon S3 存储桶
– 设置 Flask 应用的配置文件
首先,我们使用以下命令安装 Flask 和 Celery 模块:
$ pip install flask celery
接下来,我们需要配置 Amazon S3 存储桶。在 Amazon S3 控制台创建一个存储桶,并获得访问密钥和秘密密钥。将这些凭据保存在项目的配置文件中。
然后,我们需要设置 Flask 应用的配置文件。在配置文件中,我们需要指定 Celery 的中间人和结果后端。另外,还需要配置 Amazon S3 的凭据和存储桶名称。
配置文件示例:
# config.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
AWS_ACCESS_KEY_ID = 'YOUR_AWS_ACCESS_KEY_ID'
AWS_SECRET_ACCESS_KEY = 'YOUR_AWS_SECRET_ACCESS_KEY'
AWS_S3_BUCKET_NAME = 'YOUR_S3_BUCKET_NAME'
3. 编写任务函数
在 Flask 中,我们可以通过定义 Celery 任务函数来处理上传和调整大小的任务。任务函数应该接收用户上传的图片文件,并将其调整为指定的尺寸。
# tasks.py
import os
from PIL import Image
from flask import current_app
from celery import Celery
app = current_app._get_current_object()
celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
@celery.task
def process_image(image_path, width, height):
image = Image.open(image_path)
resized_image = image.resize((width, height))
resized_path = f"resized_{os.path.basename(image_path)}"
resized_image.save(resized_path)
upload_to_s3(resized_path)
def upload_to_s3(file_path):
# Code to upload the file to Amazon S3
# ...
在上述代码中,我们首先导入了必要的模块。然后,我们创建了一个 Celery 实例,并使用 Flask 应用的配置信息进行配置。接下来,我们定义了一个任务函数 process_image
,它接收图片路径、宽度和高度作为参数。在任务函数中,我们使用 PIL 库打开图片,并将其调整为指定的尺寸。然后,我们保存调整后的图片,并调用 upload_to_s3
函数将其上传到 Amazon S3。
4. 在视图函数中调用任务
接下来,我们需要在 Flask 的视图函数中调用任务函数。
# views.py
from flask import Flask, request
from .tasks import process_image
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload():
image = request.files['image']
width = request.form.get('width', type=int)
height = request.form.get('height', type=int)
image_path = save_image(image)
process_image.delay(image_path, width, height)
return 'Image processing started'
def save_image(image):
# Code to save the uploaded image
# ...
在上述代码中,我们定义了一个上传视图函数 /upload
。该视图函数接收用户上传的图片文件,并从请求参数中获取调整后的宽度和高度。然后,我们调用 save_image
函数保存图片,并通过调用 process_image.delay
异步处理图片。最后,我们返回一个简单的消息,表示图片处理已经开始。
5. 配置并启动 Celery Worker
在完成任务函数和视图函数的编写后,我们还需要配置和启动 Celery Worker 来处理任务。
首先,我们创建一个 Celery Worker 配置文件 celeryconfig.py
。
# celeryconfig.py
from datetime import timedelta
CELERY_IMPORTS = ('yourapp.tasks',)
CELERY_TASK_RESULT_EXPIRES = timedelta(minutes=30)
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = 'UTC'
然后,我们使用以下命令启动 Celery Worker:
$ celery -A yourapp.celery worker --loglevel=INFO
6. 测试
我们可以使用 Postman 或其他工具发送包含图片和调整尺寸的请求来测试我们的应用。
发送 POST 请求到 /upload
路径,并在请求体中包含名为 image
的图片文件,同时在表单参数中指定调整后的宽度和高度。例如,发送以下请求:
POST /upload
Content-Type: multipart/form-data
image: <image file>
width: 500
height: 300
在请求成功后,我们可以观察到图片已被异步上传、调整大小并上传到 Amazon S3。
总结
本文介绍了在 Flask 中使用 Celery 完成图片上传、调整大小并存储到 Amazon S3 的任务。我们首先完成了准备工作,安装了必要的模块并配置了 Amazon S3 存储桶和 Flask 应用的配置文件。然后,我们编写了任务函数来处理图片上传和调整大小,并在 Flask 视图函数中调用任务函数。最后,我们配置并启动了 Celery Worker,并使用 Postman 进行了测试。
通过使用 Celery,我们能够异步处理耗时的任务,提高了网站的响应速度,并实现了高效的图片上传和处理。