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>