
Django ã§ç»åããã¡ã€ã«ãå€éšã«çœ®ããAmazon S3 ãš Cloudinary ã®äœ¿ãåã
Webã·ã¹ãã ã§å©çšè ãäžããç»åã»åç»ã»PDFã»Excel ãªã©ã®ãã¡ã€ã«ã¯ãæ°ãå¢ããã«ã€ããŠãã¢ããªã®ãµãŒããŒã®äžã«çœ®ãç¶ããããšãé£ãããªããŸãããã®èšäºã§ã¯ãPython ã® Web ãã¬ãŒã ã¯ãŒã¯ã§ãã Django ãããå€éšã®ã¹ãã¬ãŒãžïŒAmazon S3ã»CloudinaryïŒãäœ¿ãæ¹æ³ãæŽçããŸãã
AI ã«æäŒã£ãŠããããªããã·ã¹ãã ãäœãå ŽåïŒãããããã€ãã³ãŒãã£ã³ã°ïŒã§ããä»çµã¿ãç¥ããªããŸãŸèšå®ãããšããã¡ã€ã«ãå€ããèŠããç¶æ ããéµãæŒããç¶æ ãäœãããããªããŸããããã§ãã³ãŒãã®çްéšããããä»çµã¿ãšæ³šæç¹ãäžå¿ã«èª¬æããŸããæ¬æã®ïŒ»1ã®ãããªçªå·ã¯ãæŒããšåºå žã®ããŒãžãéããŸãã
ååïŒå€éšã«çœ®ãçç±ãNginxã»Gunicornã»Django ãšã®é¢ä¿ãS3 ãš Cloudinary ã®ã€ãªãæ¹ãã©ã¡ããåãã
åŸåïŒç€Ÿå åãã®ã·ã¹ãã ã§å€ã«èŠããªãèšå®ãåé€ã®é£æºãã»ãã¥ãªãã£ã®æ³šæç¹ãDjango 以å€ã®å Žå
ã¢ããªã®ãµãŒããŒã«çœ®ãç¶ããããªãçç±
Django ã§ã¯ãå©çšè ãäžãããã¡ã€ã«ããåæèšå®ã§ã¯ã¢ããªã®ãµãŒããŒã®ãã£ã¹ã¯ã«ä¿åããŸããä¿åå ã®ãã©ã«ããŒã¯ãèšå®ã® MEDIA_ROOT ã§æ±ºããŸããããŒã¿ããŒã¹ã«ã¯ããã¡ã€ã«ãã®ãã®ã§ã¯ãªãããã¡ã€ã«ã®çœ®ãå Žæã衚ãæååã ããèšé²ããŸãã
Django ã®å ¬åŒææžããæ§èœã®ããã«ãã¡ã€ã«ãããŒã¿ããŒã¹ã«ã¯ä¿åããªããšèª¬æããŠããŸã1ã
ãã¡ã€ã«ãã¢ããªã®ãµãŒããŒã«çœ®ãç¶ãããšã次ã®ãããªåé¡ãèµ·ãããããªããŸãã
容éãäžè¶³ããïŒåç»ã倧ã㪠PDF ãå¢ãããšããã£ã¹ã¯ãåãŸããŸãã
ãµãŒããŒãäœãçŽããšæ¶ããïŒã³ã³ããïŒã¢ããªãå ¥ãç©ããšåããä»çµã¿ïŒã§åããå Žåãäžã«æžã蟌ãã ãã¡ã€ã«ã¯ãäœãçŽãããšãã«æ®ããŸããã
è€æ°å°ã§å ±æã§ããªãïŒå©çšè ãå¢ããŠãµãŒããŒãïŒå°ã«ãããšãçæ¹ã«ä¿åãããã¡ã€ã«ã¯ãããçæ¹ããèŠããŸããã
é ä¿¡ã®è² è·ãã¢ããªã«ãããïŒå€§ããªãã¡ã€ã«ãé ãã»ã©ãç»é¢ã®è¡šç€ºã«äœ¿ãã¯ãã®åãé ä¿¡ã«åãããŸãã
ããã§ããã¡ã€ã«ã¯å€éšã®ã¹ãã¬ãŒãžã«çœ®ããããŒã¿ããŒã¹ã«ã¯çœ®ãå Žæã®ååã ããèšé²ãã圢ã«ããŸããã¹ãã¬ãŒãžã¯ãããŒã¿ãä¿ç®¡ããå Žæãè£ çœ®ã®ããšã§ãã

å€éšã®ã¹ãã¬ãŒãžãšããŠãã䜿ãããã®ãããªããžã§ã¯ãã¹ãã¬ãŒãžã§ãããã¡ã€ã«ãããã©ã«ããŒã®éå±€ã§ã¯ãªããïŒã€ãã€ååãä»ãããç©ïŒãªããžã§ã¯ãïŒããšããŠä¿ç®¡ããä»çµã¿ã§ãã
ãã±ããïŒãã¡ã€ã«ãå ¥ãã倧ããªå ¥ãç©ã§ããã·ã¹ãã ããšã«ïŒã€äœãã®ãäžè¬çã§ãã
ãã¹ïŒãã±ããã®äžã§ããã¡ã€ã«ãæãååã§ããdocuments/2026/report.pdf ã®ããã«æžããŸãã
CDNïŒäžçåå°ã«çœ®ãããµãŒããŒã«ãã¡ã€ã«ã®åããäžæçã«ä¿åããå©çšè ã«è¿ãå Žæããé ãä»çµã¿ã§ãã
Nginxã»Gunicornã»Django ãšãã¡ã€ã«ã®é¢ä¿
æ¬çªã®ç°å¢ã§ Django ãåãããšãã¯ãäžè¬ã«ã圹å²ã®ç°ãªãïŒã€ã®ãœãããŠã§ã¢ãçµã¿åãããŸãã
NginxïŒãšã³ãžã³ãšãã¯ã¹ïŒïŒã€ã³ã¿ãŒãããããã®éä¿¡ãæåã«åãåãå ¥å£ã§ããCSS ãç»åã®ãããªããã®ãŸãŸè¿ãããã¡ã€ã«ã¯ãèªåã§é ããŸãã
GunicornïŒã°ãã³ãŒã³ïŒïŒDjango ã®ããã°ã©ã ãåããä¿ã§ããNginx ããåãåã£ãèŠæ±ã Django ã«æž¡ããçµæãè¿ããŸãã
DjangoïŒã¢ããªã®æ¬äœã§ãããã°ã€ã³ã®ç¢ºèªãããŒã¿ããŒã¹ã®èªã¿æžããè¡ããŸãã

ïŒã€ã®é¢ä¿ããããããã®çšèªã¯ãèšäºãNginxã»Gunicornã»Djangoã®é¢ä¿ãæŽçãããã§è©³ãã説æããŠããŸããããã§ã¯ããã¡ã€ã«ã®æ±ãã«é¢ããç¹ã«çµããŸãã
Django ãæ±ããã¡ã€ã«ã«ã¯ãïŒã€ã®çš®é¡ããããŸãã
staticïŒäœãåŽãçšæãã CSSã»JavaScriptã»ããŽãªã©ã®ãã¡ã€ã«ã§ãã
mediaïŒå©çšè ãäžããç»åã»åç»ã»PDF ãªã©ã®ãã¡ã€ã«ã§ãã
å€éšã®ã¹ãã¬ãŒãžã䜿ãå Žåã䞻㫠media ãå€ã«ç§»ããŸãããããšããã¡ã€ã«ã¯ Nginx ãéãããã¹ãã¬ãŒãžããå©çšè ã«çŽæ¥å±ããŸãã
倧ããªãã¡ã€ã«ã®ã¢ããããŒãã«ã泚æãå¿ èŠã§ããã¢ããããŒãã¯ãå©çšè ã®æå ãããµãŒããŒãžãã¡ã€ã«ãéãããšã§ããéä¿¡ãçµãããŸã§ã®éãGunicorn ã®åŠçã®æ ãïŒã€äœ¿ããç¶ããããã倧ããªåç»ãç¶ããšãã»ãã®å©çšè ã®ç»é¢ã®è¡šç€ºãé ããªãããšããããŸãã
ãŸããNginx ã«ã¯åãä»ãã倧ããã®äžéïŒclient_max_body_sizeïŒãããã倧ããªãã¡ã€ã«ãæ±ããšãã¯èŠçŽããŸããåç»ã®ãããªå€§ããªãã¡ã€ã«ã¯ããã©ãŠã¶ããå€éšã®ã¹ãã¬ãŒãžãžçŽæ¥éãæ¹æ³ãæ€èšããŸãã

Django ãã Amazon S3 ã䜿ã
Amazon S3 ã¯ãAmazon Web ServicesïŒAWSïŒã®ãªããžã§ã¯ãã¹ãã¬ãŒãžã§ããDjango ãã䜿ãã«ã¯ãdjango-storages ãšããã©ã€ãã©ãªãšãAWS ãæäœããããã® boto3 ãå ¥ããŸãã
pip install django-storages boto3èšå®ãã¡ã€ã« settings.py ã® STORAGES ã§ããã¡ã€ã«ã®ä¿åå ã S3 ã«åãæ¿ããŸã2ãã¢ãã«ã® FileField ã ImageField ã¯ããã®ãŸãŸäœ¿ããŸãã
import os
STORAGES = {
"default": {
"BACKEND": "storages.backends.s3.S3Storage",
"OPTIONS": {
"bucket_name": os.environ["AWS_STORAGE_BUCKET_NAME"],
"region_name": "ap-northeast-1",
"querystring_expire": 300,
"file_overwrite": False,
"signature_version": "s3v4",
},
},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}region_name ã® ãªãŒãžã§ã³ã¯ãããŒã¿ã眮ãå°åã®ããšã§ãap-northeast-1 ã¯æ±äº¬ã§ããsignature_version ã¯ãURL ã«ä»ãã眲åã®æ¹åŒã§ããæå®ããªããšãå€ãæ¹åŒïŒããŒãžã§ã³ïŒïŒã®çœ²åãä»ãããšããããããçŸåšã®æ¹åŒã§ãã s3v4 ãæå®ããŠãããŸãã
éµïŒã¢ã¯ã»ã¹ããŒïŒã¯èšå®ãã¡ã€ã«ã«æžãããåŸã§èª¬æããç°å¢å€æ°ã® AWS_ACCESS_KEY_ID ãš AWS_SECRET_ACCESS_KEY ããèªã¿èŸŒãŸããŸã2ã
django-storages ã«ã¯ãç¥ã£ãŠããããåæèšå®ãïŒã€ãããŸã2ã
URL ã«ã¯æéä»ãã®çœ²åãä»ãïŒãã¡ã€ã«ã® URL ãäœããšãæ¢å®ã§ã¯ãæéä»ãã®éµãä»ãã URL ã«ãªããŸããæéã®æ¢å®ã¯ 3,600 ç§ïŒïŒæéïŒã§ãäžã®äŸã§ã¯ querystring_expire ã§ 300 ç§ïŒïŒåïŒã«çãããŠããŸãã
åãååã®ãã¡ã€ã«ã¯äžæžããããïŒæ¢å®ã§ã¯ãåãååã®ãã¡ã€ã«ãäžãããšãåã®ãã¡ã€ã«ã眮ãæãããŸããå¥ã®å©çšè ãåãååã®ãã¡ã€ã«ãäžããå¯èœæ§ããããšãã¯ãfile_overwrite ã False ã«ããŸãã

Django ãã Cloudinary ã䜿ã
Cloudinary ã¯ãç»åãšåç»ã®ä¿åã»å€æã»é ä¿¡ããŸãšããŠæ±ããµãŒãã¹ã§ããããã§ã®å€æã¯ãå ã®ç»åããã倧ããã圢åŒãå€ããç»åãäœãããšã§ããããšãã°ãURL ã«ãå¹ 400ãã¯ã»ã«ããWebP 圢åŒãã®ãããªæå®ãä»ããã ãã§ããã®åœ¢ã®ç»åãé ãããŸãã
Django ãã䜿ãã«ã¯ãCloudinary ãæäŸãã Python ã®ã©ã€ãã©ãªãå ¥ããæ¥ç¶ã®æ å ±ãç°å¢å€æ° CLOUDINARY_URL ã§æž¡ããŸãã
pip install cloudinary# models.py
from django.db import models
from cloudinary.models import CloudinaryField
class Photo(models.Model):
title = models.CharField(max_length=100)
image = CloudinaryField("image")CLOUDINARY_URL ã«ã¯ãã¢ã«ãŠã³ãã®ååïŒcloud nameïŒã»API ããŒã»API ã·ãŒã¯ã¬ãããå ¥ããŸãããã®ãã¡ API ã·ãŒã¯ã¬ããã¯ãå€ã«åºããŠã¯ãããªãéµã§ãã

S3 ãš Cloudinaryãã©ã¡ããåãã
ãã¡ã€ã«ã®çš®é¡ã§èãã
ç»åãåç»ããç»é¢ã«åãããŠå€§ãããå€ããŠè¡šç€ºãããå Žåã¯ãCloudinary ãåããŸããS3 ã¯ã眮ãããã¡ã€ã«ããã®ãŸãŸè¿ãä»çµã¿ã®ãããçž®å°ã圢åŒã®å€æã¯ãå¥ã®ä»çµã¿ãçµã¿åãããå¿ èŠããããŸãã
PDFã»ZIPã»Excel ã®ããã«ããã®ãŸãŸä¿ç®¡ããŠæž¡ããã¡ã€ã«ã¯ãS3 ãåããŠããŸããCloudinary ã«ããç»åã»åç»ä»¥å€ã®ãã¡ã€ã«ã rawïŒæªå å·¥ïŒãšããçš®é¡ã§çœ®ãããšã¯ã§ããŸããã忬ã®åãã®ãŸãŸé ãã ãã§ã3ã
ããã«ãç¡æãã©ã³ã§ã¯ãraw ã®ãã¡ã€ã«ã¯ïŒã€ 10MB ãŸã§ãåç»ã¯ 100MB ãŸã§ã§ã4ãPDF ãš ZIP ã®é ä¿¡ã¯ãç¡æã®ã¢ã«ãŠã³ãã§ã¯åæèšå®ã§ç¡å¹ã«ãªã£ãŠããŸã3ãPDF ã ZIP ã«ã¯æªæã®ããäžèº«ãå«ãŸãåŸãããã§ã3ã
ãã®ãããäžè¬è«ãšããŠã¯æ¬¡ã®ããã«äœ¿ãåããããŸãã
ç»åã»åç»ãäžå¿ã§ã衚瀺ã®å€§ãããå€ãããïŒCloudinary
æžé¡ïŒPDFã»Excelã»ZIPïŒãäžå¿ã§ããã®ãŸãŸä¿ç®¡ããŠæž¡ãïŒS3
äž¡æ¹ãæ±ãïŒç»å㯠Cloudinaryãæžé¡ã¯ S3 ãšã䜿ãåãã圢ããããŸãã

æé
Cloudinary ã®ç¡æãã©ã³ã¯ã25 ã¯ã¬ãžããã§ã5ãïŒã¯ã¬ãžããã§ãä¿å 1GBãé ä¿¡ 1GBã倿 1,000 åã®ããããã«çžåœããŸã3ã
倿ãšé ä¿¡ã®éã¯ãæŠã®æã§ã¯ãªããçŽè¿ 30 æ¥ã§æ°ããŸã3ãä¿åã®éã¯ããã®æç¹ã§çœ®ããŠãããã¡ã€ã«ã®åèšã§ã3ã
倿ã¯ãæ°ããç»åãäœã£ããšãã«æ°ããåãç»åãäœåºŠé ã£ãŠãå¢ããŸãã3ãç¡æãã©ã³ã®æ¬¡ã¯ Plus ãã©ã³ã§ãææãã§æ 99 ãã«ã225 ã¯ã¬ãžããã§ã5ã
S3 ã¯ã䜿ã£ãåã ãã®æéã§ããæ±äº¬ãªãŒãžã§ã³ã®æšæºã®ä¿åã¯ã1GB ãããæ 0.025 ãã«ã§ã6ã
ã€ã³ã¿ãŒããããžã®è»¢éã¯ãAWS ã®ãã¹ãŠã®ãµãŒãã¹ãšãªãŒãžã§ã³ã®åèšã§ãæ 100GB ãŸã§ç¡æã§ã6ããã®å 㯠1GB ããã 0.114 ãã«ã§ã6ã
ã»ãã«ããã¡ã€ã«ã®èªã¿æžãã®åæ°ã«ããå°é¡ã®æéãããããŸãã
ïŒã€ã®äŸã§ã2026幎11æ1æ¥æç¹ã®éåžžã®æéã«ãããæã®ç®å®ãæ¯ã¹ãŸããAWS ã®ã¯ã¬ãžããã¯äœ¿ããªãå Žåã§ãçºæ¿ãšçšãS3 ã®èªã¿æžãã®åæ°ã®æéã¯å«ãããS3 ã®è»¢éã®ç¡æã®ç¯å²ã¯ãAWS ã®ã»ãã®ãµãŒãã¹ã䜿ã£ãŠããªãå Žåã§èšç®ããŠããŸãã
å°ããªç€Ÿå ããŒã«ïŒä¿å 5GBãé ä¿¡ 10GBãæ°ããäœã倿åŸã®ç»å 2,000 æïŒïŒCloudinary 㯠17 ã¯ã¬ãžããã§ãç¡æãã©ã³ã®ç¯å²ã«åãŸããŸããS3 ã¯ä¿åãçŽ 0.13 ãã«ã§ã転éã¯ç¡æã®ç¯å²ã§ãã
æžé¡ãå¢ããã·ã¹ãã ïŒä¿å 100GBãé ä¿¡ 50GBïŒïŒCloudinary 㯠150 ã¯ã¬ãžããã«ãªããç¡æãã©ã³ã® 25 ãè¶ ãããããPlus ãã©ã³ïŒæ 99 ãã«ïŒãå¿ èŠã§ããS3 ã¯ä¿åãçŽ 2.5 ãã«ã§ã転éã¯ç¡æã®ç¯å²ã§ãã
Cloudinary ã¯ãå°éãªãç¡æã§å§ãããããç»åã®å€æãŸã§ä»»ããããŸããäžæ¹ã§ãç¡æã®æ ãè¶ ãããšæ 99 ãã«ã®ãã©ã³ãžã®æ®µå·®ããããŸããS3 ã¯ãå°éãã䜿ã£ãåã ãæéãå¢ãããããä¿ç®¡ããéãå€ãã·ã¹ãã ã«åããŠããŸãã

äžã® S3 ã®æéã¯ãAWS ã®ã¯ã¬ãžããã䜿ããªãå Žåã®é¡ã§ããAWS ã®ç¡ææ ã¯ã2025幎7æ15æ¥ä»¥éã«äœã£ãã¢ã«ãŠã³ãã§ã¯ãã¯ã¬ãžããå¶ã«å€ãããŸãã6ïŒœãæ°ããã¢ã«ãŠã³ãã«ã¯æå€§ 200 ãã«ã®ã¯ã¬ãžãããä»ããS3 ã«ã䜿ããŸã6ã
ã¢ã«ãŠã³ããäœããšãã«ãç¡æãã©ã³ãšææãã©ã³ã®ã©ã¡ãããéžã³ãŸã6ãç¡æãã©ã³ã䜿ããæéã¯ãã¢ã«ãŠã³ãã®äœæããïŒãæã§ã6ãæéãçµãã£ãããšãææãã©ã³ã«åãæ¿ããªããšãã¢ã«ãŠã³ãã¯åæ¢ãããŸã7ã
ææãã©ã³ã«åãæ¿ããå Žåãæ®ã£ãã¯ã¬ãžããã¯èªåã§è«æ±ã«å ãŠãã6ãã¢ã«ãŠã³ãã®äœæãã 12 ãæä»¥å ã«äœ¿ãåãå¿ èŠããããŸã6ããã®ãããäžã® S3 ã®æéããã®ãŸãŸãããã®ã¯ãã¯ã¬ãžããã䜿ãåã£ãããšããã¢ã«ãŠã³ãã®äœæãã 12 ãæãéããããšã§ãã
äžæ¹ãCloudinary ã®ç¡æãã©ã³ã«ã¯ã䜿ããæéã®å®ãããããŸãã5ã25 ã¯ã¬ãžããã®ç¯å²ã«åãŸãéããæéãæ°ã«ãã䜿ããŸãã

瀟å åãã®ã·ã¹ãã ã§ãURL ãç¥ã£ãŠããŠãèŠãããªãããã«ãã
äžè¬ã® Web ãµã€ãã®ç»åã¯ã誰ã«èŠãããŠãå°ããŸãããäžæ¹ã§ã瀟å ã§äœ¿ãã·ã¹ãã ã®æžé¡ãåçããURL ãç¥ã£ãŠããã°èª°ã§ãèŠãããç¶æ ã§ã¯å°ããŸããURL ãã¡ãŒã«ããã£ããã§è»¢éãããã°ã瀟å€ã®äººãéããŠããŸãããã§ãã

åºæ¬ã®èãæ¹ã¯ã次ã®ïŒç¹ã§ãã
ãã¡ã€ã«ã¯ãéå ¬éã®èšå®ã§çœ®ããŸãã
ãã°ã€ã³ã確ããã Django ãããã®ã€ã©ãæéä»ãã®éµãä»ãã URLïŒçœ²åä»ã URLïŒãçºè¡ããŸãã
眲åä»ã URL ã¯ãURL ã®åŸãã«ãæå¹æéãšãæ£ããçºè¡è ãäœã£ãããšã瀺ãæååïŒçœ²åïŒãä»ãããã®ã§ããæéãéãããšéããªããªããæååãæžãæããŠãéããŸããã

S3 ã®å Žå
S3 ã§ã¯ãæ°ããäœã£ããã±ãããšãã¡ã€ã«ã¯ãåæèšå®ã§ã¯å ¬éãããŸãã8ãå ¬éãé²ãèšå®ïŒãããªãã¯ã¢ã¯ã»ã¹ã®ãããã¯ïŒã¯ãïŒã€ãšãæå¹ã®ãŸãŸã«ããŠãããŸã8ã
S3 ã®çœ²åä»ã URL ã¯ãæéä»ãã§ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãèš±ã URL ã§ã9ãAWS ã®å©çšè ã®éµã§äœãå Žåãæéã¯æé·ã§ïŒæ¥ã§ã9ãdjango-storages ã¯æ¢å®ã§çœ²åä»ã URL ãäœãããããã°ã€ã³ã確ãããŠãã URL ãæž¡ã圢ã«ããã°è¶³ããŸãã
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect
from .models import Document
@login_required
def download(request, pk):
doc = get_object_or_404(Document, pk=pk, owner=request.user)
return redirect(doc.file.url) # ãã®ãšãã«æéä»ãã® URL ãäœãããããã«çµãèŸŒãæ¹æ³ãšããŠãS3 ã®ãã±ããããªã·ãŒïŒãã±ããããšã®èš±å¯ã®èŠåïŒã§ãæ¥ç¶å ãéãããšãã§ããŸããã€ã³ã¿ãŒãããçµç±ãªã瀟å ã® IP ã¢ãã¬ã¹ïŒaws:SourceIpïŒãAWS ã®äžã®æ±ºãŸã£ããããã¯ãŒã¯ãããªã VPC ãšã³ããã€ã³ãïŒaws:SourceVpceïŒãæ¡ä»¶ã«ããŸã9ã
ãã±ããã«ä»ããå¶éã¯ããã®ãã±ãããžã®ãã¹ãŠã®èŠæ±ã«åã³ãŸã9ããã®ããããã¡ã€ã«ãäžãã Django ã®ãµãŒããŒã®æ¥ç¶å ããèš±å¯ã«å«ããå¿ èŠããããŸãã

Cloudinary ã®å Žå
Cloudinary ã§ã¯ããã¡ã€ã«ãäžãããšãã«ãé ä¿¡ã®çš®é¡ïŒdelivery typeïŒãéžã³ãŸãã
uploadïŒæ¢å®ã®çš®é¡ã§ããäžãããã¡ã€ã«ã¯ãå ¬éã® CDN ãã誰ã§ãèŠãããŸã10ã
privateïŒåæ¬ã¯çœ²åä»ã URL ã§ã ãèŠãããŸãããã ãã倿ããããšã®ç»åã¯ãæ¢å®ã§ã¯å ¬éãããŸã10ã
authenticatedïŒåæ¬ãã倿ããããšã®ç»åãã眲åä»ã URL ã§ã ãèŠãããŸã10ã
瀟å åãã§ã倿ããç»åãå€ã«èŠããããªãå Žåã¯ãauthenticated ãéžã³ãŸããDjango ã§ã¯ãã¢ãã«ã®æ¬ã«çš®é¡ãæå®ãã衚瀺ã®ãšãã«çœ²åä»ãã® URL ãäœããŸãã
image = CloudinaryField("image", type="authenticated")
# 衚瀺ã®ãšã
from cloudinary.utils import cloudinary_url
url, _ = cloudinary_url(photo.image.public_id,
type="authenticated", sign_url=True)泚æãããã®ã¯ãCloudinary ã®çœ²åä»ã URL ã¯ãããã ãã§ã¯ URL ã®å ±æãé²ããªãç¹ã§ããCloudinary ã®ææžããURL ãäžåºŠå€ã«åºãã°ããã® URL ãæã€èª°ãããã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ãããšèª¬æããŠããŸã10ã
æéä»ãã®ããŒã¯ã³ïŒäžæçãªåèšèïŒãã¯ãããŒã«ããå¶åŸ¡ã¯ãAdvanced ãã©ã³ä»¥äžã§äœ¿ããŸã10ãå©çšããã«ã¯ãCloudinary ã®ãµããŒãã«é£çµ¡ããŠæå¹ã«ããŠãããå¿ èŠããããŸãã

ã©ã¡ãã«ãå ±éããéç
S3 ã®çœ²åä»ã URL ã¯ãæã£ãŠããäººã«æš©éãäžããæã®ãããªãã®ã§ïŒ»9ãæéå ã§ããã°ãURL ãæž¡ããã人ãéããŸããæéã¯ã§ããã ãçãããããŒãžã« URL ãåã蟌ãã ãŸãŸã«ããã衚瀺ãåãåºãã®ãã³ã«çºè¡ããŸãã
管çç»é¢ã§æ¶ããããã¹ãã¬ãŒãžãããæ¶ã
管çç»é¢ã§ããŒã¿ãåé€ããŠããã¹ãã¬ãŒãžã®ãã¡ã€ã«ãæ®ã£ããŸãŸã§ã¯å°ããŸãã瀟å ã®æžé¡ãªããæ¶ããã¯ãã®ãã¡ã€ã«ãå€éšã«æ®ãç¶ããããšã«ãªãããã§ãã
Django ã§ã¯ãã¢ãã«ïŒããŒã¿ããŒã¹ã®è¡ïŒãåé€ããŠããé¢é£ãããã¡ã€ã«ã¯åé€ãããŸãããå ¬åŒææžã«ãæèšãããŠããŸã1ããã®ãããåé€ã®ãšãã«ãã¡ã€ã«ãæ¶ãåŠçããèªåã§è¿œå ããŸãã

Django ã®ã·ã°ãã«ã䜿ããšããè¡ãåé€ãããããšãã«åŠçã远å ã§ããŸããã·ã°ãã«ã¯ãä¿åãåé€ãªã©ã®ãã£ããã«åãããŠã決ããåŠçãåŒã³åºãä»çµã¿ã§ãã
from django.db import transaction
from django.db.models.signals import post_delete
from django.dispatch import receiver
import cloudinary.uploader
@receiver(post_delete, sender=Document)
def delete_s3_file(sender, instance, **kwargs):
# ããŒã¿ããŒã¹ã®åé€ã確å®ããŠãããS3 ã®ãã¡ã€ã«ãæ¶ã
transaction.on_commit(lambda: instance.file.delete(save=False))
@receiver(post_delete, sender=Photo)
def delete_cloudinary_file(sender, instance, **kwargs):
public_id = instance.image.public_id
transaction.on_commit(lambda: cloudinary.uploader.destroy(
public_id, type="authenticated", invalidate=True))S3 ã¯ãdjango-storages ãéã㊠delete ãåŒã¶ãšããã±ããã®ãã¡ã€ã«ãåé€ãããŸããCloudinary 㯠destroy ãåŒãã§åé€ããinvalidate=True ã§ CDN ã«æ®ã£ãåããæ¶ãããæå®ããŸãã
transaction.on_commit ã¯ãããŒã¿ããŒã¹ã®åé€ã確å®ããŠãããã¡ã€ã«ãæ¶ãããã®æå®ã§ããããŒã¿ããŒã¹ã®åé€ãéäžã§åãæ¶ãããã®ã«ããã¡ã€ã«ã ããæ¶ããç¶æ ãé²ããŸãã

ããããŠã次ã®ç¹ã確èªããŸãã
æ¶ããã¯ãã®ãã¡ã€ã«ãèŠããïŒCDN ã«äžæä¿åãããåãïŒãã£ãã·ã¥ïŒãããã°ããæ®ãããšããããŸãã
å€ãçãæ®ãïŒS3 ã§ãäžæžããåé€ã®åã®çãæ®ãæ©èœïŒããŒãžã§ãã³ã°ïŒãæå¹ã«ããŠããå Žåãåé€ããŠãå€ãçãæ®ããŸããå®å šã«æ¶ãå¿ èŠããããšãã¯ãå€ãçã®æ±ããæ±ºããŠãããŸãã
æ¶ããªãã£ãå ŽåïŒéä¿¡ã®å€±æãªã©ã§ãã¡ã€ã«ãæ®ãããšããããŸããæ¶ããªãã£ããã®ãèšé²ããåŸã§ãŸãšããŠæ¶ãä»çµã¿ãçšæããŠãããšå®å¿ã§ãã

ã»ãã¥ãªãã£ã®æ³šæç¹
å€éšã®ã¹ãã¬ãŒãžã䜿ããšãã«ãç¹ã«æ³šæãããç¹ããŸãšããŸãã
éµãã³ãŒãã«æžããªãïŒã¢ã¯ã»ã¹ããŒã API ã·ãŒã¯ã¬ããã¯ãç°å¢å€æ°ã§æž¡ããŸããç°å¢å€æ°ã¯ãããã°ã©ã ã®å€ããèšå®å€ãæž¡ãä»çµã¿ã§ããéçºã§ã¯ .env ãšãããã¡ã€ã«ã«æžãããšãå€ãããã®ãã¡ã€ã«ã¯ .gitignore ã«å ¥ããŠãGitHub ãªã©ã«äžããªãããã«ããŸãã
éµã AI ãšã®ãããšãã«è²ŒããªãïŒãšã©ãŒã®çžè«ããããšãã«ãèšå®ãã¡ã€ã«ããšè²Œãä»ãããšãéµãäžç·ã«æž¡ã£ãŠããŸããŸããæŒããå¯èœæ§ããããšãã¯ããã®éµãç¡å¹ã«ããŠäœãçŽããŸãã
éµã®æš©éãæå°éã«ããïŒS3 ã§ã¯ãAWS ã®æš©éã®ä»çµã¿ïŒIAMïŒã§ããã®ãã±ããã®èªã¿æžããšåé€ã ããèš±ããå©çšè ãäœãããã®éµã Django ã«æž¡ããŸãã管çè ã®éµã¯äœ¿ããŸããã
å ¬éã®èšå®ã誀ããªãïŒãã±ãããå ¬éã«ããèšå®ãããã¡ã€ã«ã誰ã§ãèªããç¶æ ã«ããèšå®ïŒpublic-readïŒããçç±ãªãä»ããªãããã«ããŸãã
äžãããããã¡ã€ã«ãæ€èšŒããïŒDjango ã®å ¬åŒææžã¯ãäžãããããã¡ã€ã«ã¯ãã¹ãŠæ€èšŒããæã£ãŠãããšããã®ãã¡ã€ã«ãã確ãããããæ±ããŠããŸã1ãHTML ã®ãã¡ã€ã«ãããã©ãŠã¶ã§åããããå±éºã«ãªãåŸãŸã1ããã¡ã€ã«ã®çš®é¡ãšå€§ããã確ãããåãä»ãããã®ã決ããŠãããŸãã

Next.jsã»Prisma ã Supabase ã§ãèããããšã¯åã
ãã®èšäºã§ã¯ Django ãäŸã«ããŸããããJavaScript ã® Next.js ãšããŒã¿ããŒã¹ã®éå · Prisma ã®çµã¿åããããSupabase ã®ãããªãµãŒãã¹ã䜿ãå Žåã§ããèããããšã¯åãã§ãã
ãã¡ã€ã«ã¯å€éšã®ã¹ãã¬ãŒãžã«çœ®ããããŒã¿ããŒã¹ã«ã¯çœ®ãå Žæã®ååãèšé²ããŸããPrisma ã¯ããŒã¿ããŒã¹ãæ±ãéå ·ã§ããã¡ã€ã«ãã®ãã®ã¯æ±ããŸããã
éµã¯ãµãŒããŒåŽã ãã§äœ¿ããŸããNext.js ã§ã¯ãååã®é ã« NEXT_PUBLIC_ ãä»ããç°å¢å€æ°ã¯ãã©ãŠã¶ã«éããããããç§å¯ã®éµã«ã¯ä»ããŸããã
瀟å åããªããéå ¬éã§çœ®ããæéä»ãã® URL ãçºè¡ããŸããSupabase ã® Storage ã«ããå ¬éãšéå ¬éã®å ¥ãç©ããããéå ¬éã®ãã®ã«ã¯æéä»ãã® URL ã䜿ããŸãã
åé€ã®ãšãã«ãã¹ãã¬ãŒãžã®ãã¡ã€ã«ãæ¶ãåŠçãå ¥ããŸãã
éå ·ãå€ãããšæžãæ¹ã¯å€ãããŸãããã©ãã«çœ®ãã誰ã«èŠãããã€æ¶ãããæ±ºããããšã¯å ±éã§ãã

調ã¹ãŠåãã£ãããš
å€éšã®ã¹ãã¬ãŒãžã¯ããã¡ã€ã«ã®çœ®ãå Žæãç§»ãã ãã®èšå®ã«èŠããŸããå®éã«ã¯ãå ¬éã®ç¯å²ãéµã®æ±ããåé€ã®é£æºãŸã§æ±ºããŠãåããŠå®å¿ããŠäœ¿ããç¶æ ã«ãªããŸãã
ç»åãåç»ã®è¡šç€ºãæŽããããªã Cloudinaryãæžé¡ãå€ãä¿ç®¡ãããªã S3 ãåããŠããŸããã©ã¡ããéžãã§ãã瀟å åãã®ãã¡ã€ã«ã¯éå ¬éã§çœ®ããæéã®çã URL ã§æž¡ãããšãåºæ¬ã«ãªããŸãã

å 責äºé
ãã®èšäºã¯ãçè ãå人ãšããŠèª¿ã¹ãããšãçµéšãããšã«ãå·çæç¹ã®å 容ããŸãšãããã®ã§ããæ³åŸã»çšåã»äŒèšã»æè³ãªã©ã®å°éå®¶ã«ããå©èšã§ã¯ãããŸãããåããããããåªå ãã现ããæ¡ä»¶ãäŸå€ãçããŠããå ŽåããããŸãã
å¶åºŠã補åã®ä»æ§ãæéãæœèšã®å¶æ¥æéãªã©ã¯å€ããããšããããŸããå®éã®å€æãæç¶ãã«ããã£ãŠã¯ãåºå žãå ¬åŒã®æ å ±ã§ææ°ã®å 容ã確èªããå¿ èŠã«å¿ããŠå°éå®¶ãçªå£ã«ãçžè«ãã ããããã®èšäºã®å 容ãå©çšããŠçããæå®³ã«ã€ããŠã¯ã責任ãè² ããããŸãã
NDã·ã¹ãã ãºã«ã€ããŠ
NDã·ã¹ãã ãºã¯ãçŠå²¡çä¹ çç±³åžãæ ç¹ã«ãããŒã ããŒãžã®å¶äœãæ¥åã«åãããäºåã®ã·ã¹ãã ã®éçºãAIã»DXæ¯æŽãè¡ã£ãŠããŸãããŸãã¯ãæ°è»œã«ç¡æçžè«ã§ãçžè«ãã ããã
åèæç®
Model field referenceïŒDjango documentationãDjango 6.1ïŒïŒè±èªïŒ
Developer onboarding FAQïŒCloudinary DocumentationïŒïŒè±èªïŒ
Blocking public access to your Amazon S3 storageïŒAmazon S3 User GuideïŒïŒè±èªïŒ
Download and upload objects with presigned URLsïŒAmazon S3 User GuideïŒïŒè±èªïŒ
Media Access Control and AuthenticationïŒCloudinary DocumentationïŒïŒè±èªïŒ
- #ããã°ã©ãã³ã°
- #python
- #ç»å
- #ã»ãã¥ãªãã£
- #AWS
- #æ å ±ã»ãã¥ãªãã£
- #ãã€ãã³ãŒãã£ã³ã°
- #ãã¡ã€ã«
- #çŠå²¡ç
- #webã¢ããªéçº
- #nextjs
- #django
- #ä¹ çç±³åž
- #ã¯ã©ãŠãã¹ãã¬ãŒãž
- #æ¥åã·ã¹ãã
- #supabase
- #ãã¡ã€ã«ç®¡ç
- #S3
- #nginx
- #ç°å¢å€æ°
- #瀟å ã·ã¹ãã
- #CDN
- #ã¢ã¯ã»ã¹å¶åŸ¡
- #prisma
- #NDã·ã¹ãã ãº
- #AmazonS3
- #å€éšã¹ãã¬ãŒãž
- #ãªããžã§ã¯ãã¹ãã¬ãŒãž
- #gunicorn
- #cloudinary
- #ç»åé ä¿¡
- #眲åä»ãURL
- #ã¯ã©ãŠãã£ããªãŒ
- #djangostorages