Code
<aside>
import boto3
import os
from django.shortcuts import render, redirect
import DJANGO_S3_SDK.settings
from app.models import Picture
import DJANGO_S3_SDK
s3_client = boto3.client(
's3',
aws_access_key_id = os.getenv("AWS_ACCESS_KEY"),
aws_secret_access_key = os.getenv("AWS_SECRET_ACCESS_KEY")
)
def file_exists_in_s3(file_url):
"""
S3 파일 존재 확인
"""
bucket_name = "sdk-django-s3"
base_url = f"https://{DJANGO_S3_SDK.settings.AWS_S3_CUSTOM_DOMAIN}/"
key = file_url.replace(base_url, "")
try:
s3_client.head_object(Bucket = bucket_name, Key = key)
return True
except:
return False
def main(request):
pictures = Picture.objects.all()
valid_files = []
for pic in pictures:
if file_exists_in_s3(pic.img.url):
valid_files.append(pic)
return render(request, 'main.html', {'result': valid_files})
def register(request):
if request.method == 'GET':
return render(request, 'register.html')
elif request.method == 'POST':
images = request.FILES.getlist("image")
for image in images:
picture = Picture()
picture.img = image
picture.save()
return redirect('/')
</aside>
<aside>
def file_exists_in_s3(file_url):
"""
S3 파일 존재 확인
주어진 파일 URL이 S3 버킷 내에 존재하는지 확인하는 함수입니다.
- `file_url`: 확인할 파일의 URL (예: <https://sdk-django-s3.s3.amazonaws.com/path/to/file.jpg>)
- 반환값: 파일이 존재하면 `True`, 존재하지 않으면 `False`
동작 방식:
1. S3 버킷의 기본 URL(`AWS_S3_CUSTOM_DOMAIN`)을 사용하여 파일의 S3 키(Key)를 추출합니다.
2. `head_object` 요청을 보내 파일이 존재하는지 확인합니다.
3. 파일이 존재하면 `True`, 존재하지 않거나 오류가 발생하면 `False`를 반환합니다.
"""
bucket_name = "sdk-django-s3"
base_url = f"https://{DJANGO_S3_SDK.settings.AWS_S3_CUSTOM_DOMAIN}/"
key = file_url.replace(base_url, "") # 파일 URL에서 S3 키 추출
try:
s3_client.head_object(Bucket=bucket_name, Key=key) # S3에서 파일 존재 여부 확인
return True
except:
return False
def main(request):
"""
메인 페이지 렌더링
Picture 모델에 저장된 이미지 리스트 중 S3에 실제로 존재하는 파일만 필터링하여 템플릿에 전달합니다.
- `request`: Django의 HTTP 요청 객체
- 반환값: 유효한 이미지 파일 리스트(`valid_files`)를 포함한 `main.html` 템플릿 렌더링
동작 방식:
1. `Picture.objects.all()`을 사용하여 데이터베이스에서 모든 Picture 객체를 가져옵니다.
2. `file_exists_in_s3()` 함수를 이용해 S3에 존재하는 파일만 필터링합니다.
3. 필터링된 파일 리스트(`valid_files`)를 `main.html` 템플릿으로 전달하여 렌더링합니다.
"""
pictures = Picture.objects.all() # 모든 Picture 객체 조회
valid_files = []
for pic in pictures:
if file_exists_in_s3(pic.img.url):
valid_files.append(pic)
return render(request, 'main.html', {'result': valid_files}) # 필터링된 결과를 템플릿에 전달
</aside>