اتصال به فضای ذخیرهسازی ابری در برنامههای Django
پروژه و کدهای مورد استفاده در ویدیوی فوق در اینجا قابل مشاهده و دسترسی هستند.
برای استفاده از Object Storage در برنامههای Django، میتوانید از
پکیج boto3 استفاده کنید که بایستی با دستور زیر، آن را در پروژه خود، نصب کنید:
کپی
pip install boto3
پس از آن، کافیست تا طبق مستندات ایجاد کلید، یک کلید جدید برای باکت خود بسازید.
اطلاعات مربوط به ENDPOINT و نام باکت نیز در صفحه تنظیمات، در بخش دسترسی با SDK،
برای شما قرار گرفته است.
در نهایت نیز، بایستی
اطلاعات مربوط به Object Storage خود را
به متغیرهای محیطی برنامه خود، اضافه کنید؛ به عنوان مثال:
تمامی کارها انجام شده است و میتوانید از Object Storage در برنامه خود، استفاده کنید؛
در نظر داشته باشید که با انجام کار فوق،
فایل های آپلود شده به طور خودکار در ذخیرهسازی ابری لیارا قرار میگیرند.
در ادامه، مثالهایی برای استفاده از Object Storage در Django آورده شده است.
در ابتدا، با استفاده از دستور زیر، یک app جدید برای کار با Object Storage بسازید:
کپی
python manage.py startapp object_storage
سپس، بایستی در فایل views.py، قطعه کد زیر را، قرار دهید:
کپی
import boto3
from django.conf import settings
from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
# Initialize S3 Client
def get_s3_client():
return boto3.client(
's3',
endpoint_url=settings.AWS_S3_ENDPOINT_URL,
aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY
)
اکنون، میتوانید در فایل views.py، بنا به نیاز خود، قطعه کدهای زیر را، به قطعه کد فعلی، اضافه کنید.
def list_files(request):
s3_client = get_s3_client()
try:
response = s3_client.list_objects_v2(Bucket=settings.AWS_STORAGE_BUCKET_NAME)
files = [obj['Key'] for obj in response.get('Contents', [])]
return JsonResponse({'files': files})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
نمونه کد حذف فایل
کپی
@csrf_exempt
def delete_file(request):
if request.method == 'POST':
file_name = request.POST.get('file_name')
if not file_name:
return JsonResponse({'error': 'File name is required'}, status=400)
s3_client = get_s3_client()
try:
s3_client.delete_object(Bucket=settings.AWS_STORAGE_BUCKET_NAME, Key=file_name)
return JsonResponse({'message': f'{file_name} deleted successfully.'})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
نمونه کد ساخت لینک موقت دانلود فایل
کپی
def generate_presigned_url(request):
file_name = request.GET.get('file_name')
if not file_name:
return JsonResponse({'error': 'File name is required'}, status=400)
s3_client = get_s3_client()
try:
url = s3_client.generate_presigned_url(
'get_object',
Params={'Bucket': settings.AWS_STORAGE_BUCKET_NAME, 'Key': file_name},
ExpiresIn=3600 # URL valid for 1 hour
)
return JsonResponse({'url': url})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
نمونه کد دریافت لینک موقت دانلود فایل با دامنه اختصاصی
اگر طبق مستندات اتصال دامنه، یک دامنه اختصاصی به باکت خود متصل کردهاید، سادهترین روش برای دریافت لینک موقت (Presigned) با دامنه اختصاصی این است که لینک را با Endpoint اصلی لیارا تولید کنید و سپس مقدار Host آن را به دامنه اختصاصی تغییر دهید.
برای این کار، لینک باید بهصورت virtual-hosted ساخته شود؛ یعنی نام باکت در ابتدای Host قرار بگیرد (مانند bucket-name.storage.c2.liara.site) و نه در مسیر لینک. کلاینت boto3 هنگام استفاده از endpoint_url بهصورت پیشفرض لینک را بهصورت path-style میسازد؛ به همین دلیل، در قطعه کد زیر یک کلاینت با addressing_style برابر با virtual برای ساخت لینک ایجاد شده است:
کپی
import boto3
from botocore.config import Config
from urllib.parse import urlsplit, urlunsplit
CUSTOM_DOMAIN = "example.com" # change this to your custom domain
presign_client = boto3.client(
"s3",
endpoint_url=settings.AWS_S3_ENDPOINT_URL,
aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
config=Config(signature_version="s3v4", s3={"addressing_style": "virtual"}),
)
def generate_custom_domain_url(request):
file_name = request.GET.get('file_name')
if not file_name:
return JsonResponse({'error': 'File name is required'}, status=400)
try:
signed = presign_client.generate_presigned_url(
'get_object',
Params={'Bucket': settings.AWS_STORAGE_BUCKET_NAME, 'Key': file_name},
ExpiresIn=3600 # URL valid for 1 hour
)
parts = urlsplit(signed)
return JsonResponse({'url': urlunsplit(parts._replace(netloc=CUSTOM_DOMAIN))})
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
برای استفاده از این تابع، کافیست مانند تابع generate_presigned_url، یک مسیر برای آن در urls.py تعریف کنید.
فقط مقدار host را تغییر دهید و پارامترهای *-X-Amz موجود در لینک را دستکاری نکنید؛ در غیر این صورت امضای لینک نامعتبر میشود و دسترسی به فایل با خطا مواجه خواهد شد.
در ادامه، در app ساخته شده، یک دایرکتوری به نام templates بسازید و درون آن، یک فایل به نام manage_files.html ایجاد کنید و قطعه کد زیر را در آن قرار دهید: