Saqlash va zaxira nusxalar

Django

2 daqiqa o'qish

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.

Maslahat

Shuningdek qarang: