Django’da Amazon S3 Üzerinde Tutulan Private Dosyaların Sunulması

Herkesten sakladığınız ve sadece erişim isteği isteyen kullanıcıların dosyalara erişmesini sağlamak istiyorsanız ve bu isteğinizi Amazon üzerinde bulunan S3 bucketınızda yapacaksanız derdinizin çözümü burada,

  • AWS S3 de tutulan dosyalar private olarak geçmelidir.
  • Amazon S3 API anahtarınızda s3:GetObject yetkisi mutlaka bulunmalıdır.
  • django-storages Kullanılıyorsa ve dosyalar onun üzerinden sisteme yükleniyorsa, imza hatası alınmaması için mutlaka AWS_S3_SIGNATURE_VERSION = 's3v4' ve AWS_S3_ADDRESSING_STYLE = 'path' parametreleri settings.py dosyasına eklenmelidir.
import boto3
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View
from django.http import HttpResponseRedirect

class AwsS3UrlGenerator(LoginRequiredMixin, View):
    def get(self, *args, **kwargs):
        s3_client = boto3.client(
            "s3",
            aws_access_key_id="",
            aws_secret_access_key="",
            region_name="eu-west-1",
            config=Config(
                s3={"addressing_style": "path"}, signature_version="s3v4"
            ),
        )
        try:
            presigned_url = s3_client.generate_presigned_url(
                "get_object",
                Params={
                    "Bucket": "bucket-name",
                    "Key": str(self.request.GET["p"]),
                },
                ExpiresIn=300,
                HttpMethod="GET",
            )
        except ClientError as e:
            return None

        return HttpResponseRedirect(presigned_url)

Sistem Uzmanı, Linux Hacısı, El-Kernel

Yorum yapın