اتصال به فضای ذخیره‌سازی ابری در برنامه‌های Flask


پروژه و کدهای مورد استفاده در ویدیوی فوق در اینجا قابل مشاهده و دسترسی هستند.

برای استفاده از Object Storage در برنامه‌های Flask، می‌توانید از پکیج boto3 استفاده کنید که بایستی با دستور زیر، آن را در پروژه خود، نصب کنید:

کپی
pip install boto3

پس از آن، کافیست تا طبق مستندات ایجاد کلید، یک کلید جدید برای باکت خود بسازید. اطلاعات مربوط به ENDPOINT و نام باکت نیز در صفحه تنظیمات، در بخش دسترسی با SDK، برای شما قرار گرفته است. در نهایت نیز، بایستی اطلاعات مربوط به Object Storage خود را به متغیرهای محیطی برنامه خود، اضافه کنید؛ به عنوان مثال:

کپی
LIARA_ENDPOINT=https://<Liara Bucket Endpoint>
LIARA_BUCKET_NAME=<Bucket Name>
LIARA_ACCESS_KEY=<Access Key>
LIARA_SECRET_KEY=<Secret Key>

تمامی کارها انجام شده است و می‌توانید از Object Storage در برنامه خود، استفاده کنید؛ در ادامه، مثالی از نحوه استفاده برای‌تان آورده شده است:

پیکربندی اولیه و اتصال به باکت در برنامه

کپی
from dotenv import load_dotenv
import boto3
from botocore.exceptions import NoCredentialsError
from urllib.parse import quote

load_dotenv()

LIARA_ENDPOINT = os.getenv("LIARA_ENDPOINT")
LIARA_ACCESS_KEY = os.getenv("LIARA_ACCESS_KEY")
LIARA_SECRET_KEY = os.getenv("LIARA_SECRET_KEY")
LIARA_BUCKET_NAME = os.getenv("LIARA_BUCKET_NAME")

s3 = boto3.client(
    "s3",
    endpoint_url=LIARA_ENDPOINT,
    aws_access_key_id=LIARA_ACCESS_KEY,
    aws_secret_access_key=LIARA_SECRET_KEY,
)

آپلود فایل

کپی
s3.upload_fileobj(file, LIARA_BUCKET_NAME, file.filename)

دانلود فایل

کپی
s3.download_file(LIARA_BUCKET_NAME, filename_in_bucket, filename_in_system)

دریافت لیست فایل‌های یک باکت

کپی
files = s3.list_objects(Bucket=LIARA_BUCKET_NAME)
for file in files["Contents"]:
    print(file["Key"])

دریافت لینک موقت دانلود فایل‌ها

کپی
pre_signed_url = s3.generate_presigned_url(
    "get_object",
    Params={"Bucket": LIARA_BUCKET_NAME, "Key": filename},
    ExpiresIn=12 * 60 * 60,  # 12 hours
)

دریافت لینک دائمی دانلود فایل‌ها

کپی
filename_encoded = quote(filename)
permanent_url = f"https://{LIARA_BUCKET_NAME}.{LIARA_ENDPOINT.replace('https://', '')}/{filename_encoded}"