django-storages Django’ga yuklanadigan fayllarni (FileField, ImageField) va statik fayllarni obyektli xotirada saqlash imkonini beradi. Misollar Django 4.2 va undan yangi versiyalar uchun moʻljallangan.
Oʻrnatish
pip install "django-storages[s3]>=1.14" "boto3>=1.36"
Sozlash
Kalitlarni muhit oʻzgaruvchilari (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) orqali uzating va xotira sozlamalarini settings.py ga qoʻshing. Ushbu misolda foydalanuvchi fayllari yopiq, statik fayllar esa ommaviy kirishga ega static/ papkasida:
from botocore.config import Config
S3_OPTIONS = {
"bucket_name": "my-bucket",
"endpoint_url": "https://s3.uzcstorage.uz",
"region_name": "default",
"client_config": Config(
signature_version="s3v4",
s3={"addressing_style": "path"},
request_checksum_calculation="when_required",
response_checksum_validation="when_required",
),
}
STORAGES = {
# Uploaded files: private, accessed by temporary links
"default": {
"BACKEND": "storages.backends.s3.S3Storage",
"OPTIONS": {
**S3_OPTIONS,
"location": "media",
"default_acl": None,
"querystring_auth": True,
"querystring_expire": 3600,
"file_overwrite": False,
},
},
# Static files: public, permanent links
"staticfiles": {
"BACKEND": "storages.backends.s3.S3Storage",
"OPTIONS": {
**S3_OPTIONS,
"location": "static",
"default_acl": None,
"querystring_auth": False,
"custom_domain": "s3.uzcstorage.uz/my-bucket",
},
},
}
static/ papkasiga bucket siyosati yordamida oʻqish huquqini oching (misolda public/* ni static/* ga almashtiring) va statik fayllarni yuklang:
python manage.py collectstatic --noinput
Modellar va fayllar
Model maydonlari odatdagidek ishlaydi — fayllar bucketga saqlanadi:
from django.db import models
class Document(models.Model):
title = models.CharField(max_length=200)
file = models.FileField(upload_to="documents/%Y/%m/")
# In a view:
doc = Document.objects.create(title="Report", file=request.FILES["file"])
doc.file.url # temporary link, valid for querystring_expire seconds
Xotira bilan bevosita ishlash:
from django.core.files.base import ContentFile
from django.core.files.storage import default_storage
path = default_storage.save("exports/report.csv", ContentFile(b"id,name\n1,Demo\n"))
default_storage.exists(path)
with default_storage.open(path) as f:
data = f.read()
default_storage.delete(path)
Bir nechta xotira
Fayllarning bir qismini alohida bucketda saqlash uchun (masalan, ommaviy rasmlar) xotira sinfini yarating va uni maydonga uzating:
from storages.backends.s3 import S3Storage
class PublicMediaStorage(S3Storage):
bucket_name = "my-public-bucket"
querystring_auth = False
custom_domain = "s3.uzcstorage.uz/my-public-bucket"
class Product(models.Model):
image = models.ImageField(upload_to="products/", storage=PublicMediaStorage())
Bunday sinf uchun ulanish parametrlari (endpoint_url, region_name, client_config) settings.py dagi AWS_S3_ENDPOINT_URL, AWS_S3_REGION_NAME va AWS_S3_CLIENT_CONFIG oʻzgaruvchilaridan olinadi.
Maslahat
Python kodidan S3 bilan bevosita ishlash uchun (multipart yuklash, yuklash havolalari) Python (boto3) ga qarang.