AXV

Statik va Media Fayllar

Fayllarni yuklash (Multipart upload), saqlash va FileResponse orqali ko'chirib olish

10-sinfAdvanced Python Back-end3-hafta · 8-dars

Dars rejasi

Static vs Media

Dasturchi fayllari va foydalanuvchi fayllari farqi, STATIC_ROOT va MEDIA_ROOT sozlamalari.

Multipart Upload

MultiPartParser, Pillow kutubxonasi, rasm formati va hajmini tekshirish.

FileResponse

Oqimli (streaming) fayl uzatish, xavfsiz download actionlari.

01

Static va Media fayllar

Fayllarning turlari va saqlanish o'rni

Fayllar qayerda saqlanadi?

Dasturchi kodi bilan keladigan va foydalanuvchi yuklagan fayllar

Statik fayllar (Static) Dasturchi yozgan fayllar style.css, app.js, logo.png STATIC_ROOT: collectstatic orqali Nginx orqali tarqatiladi Media fayllar (Media) Foydalanuvchilar yuklagan fayllar Post muqovasi, avatar, PDF hujjat MEDIA_ROOT: media/ papkasida Bazada faqat yo'li saqlanadi!

settings/base.py sozlamalari

# Statik fayllar (CSS, JS)
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR.parent / "staticfiles"

# Media fayllar (Uploads)
MEDIA_URL = "media/"
MEDIA_ROOT = BASE_DIR.parent / "media"

# src/config/urls.py (Development muhitda serve qilish)
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, 
                          document_root=settings.MEDIA_ROOT)
02

Fayl yuklash (Upload)

Multipart/form-data va Pillow tekshiruvi

Fayl yuklash oqimi

Mijozdan to server diskigacha bo'lgan yo'l

1. Frontend multipart/form-data photo.jpg POST /upload-cover/ 2. DRF Parser MultiPartParser Hajm: ≤ 5 MB MIME: JPEG/PNG/WEBP 3. Fayl Diski media/covers/ Fayl saqlanadi Diskka yozildi 4. Baza URL satri "covers/..." 50 bayt

PostViewSet da upload_cover actioni

@action(
    methods=["post"],
    detail=True,
    url_path="upload-cover",
    parser_classes=[MultiPartParser, FormParser],
)
def upload_cover(self, request, slug=None):
    post = self.get_object()
    serializer = PostCoverUploadSerializer(post, data=request.data, partial=True)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data, status=status.HTTP_200_OK)
03

Faylni yuklab olish (Download)

FileResponse va oqimli uzatish

download_cover actioni

@action(methods=["get"], detail=True, url_path="download-cover")
def download_cover(self, request, slug=None):
    post = self.get_object()
    if not post.cover_image:
        raise Http404("Muqova rasmi topilmadi")

    return FileResponse(
        post.cover_image.open("rb"),
        as_attachment=True,
        filename=post.cover_image.name.split("/")[-1]
    )
as_attachment=True parametri brauzerda rasmni shunchaki ko'rsatmasdan, kompyuterga yuklab olishni boshlaydi.

Atamalarni eslab qolamiz

Static vs Media

Bosing va tekshiring

Fayl turlari

Statik — dasturchi fayllari; Media — foydalanuvchi yuklagan fayllar.

Multipart

Bosing va tekshiring

Fayl uzatish

Rasmlar va hujjatlarni HTTP orqali uzatuvchi ikkilik kontent formati.

FileResponse

Bosing va tekshiring

Oqimli uzatuvchi

Fayllarni server xotirasini band qilmasdan oqim shaklida yetkazadi.

Tezkor bilim tekshiruvi

Nima uchun rasmlarning o'zi ma'lumotlar bazasida emas, server diskida saqlanadi?

To'g'ri! Katta hajmdagi fayllarni diskda yoki bulutli xotirada saqlash va bazada faqat uning yo'lini (path) yozib qo'yish jahon standartidir.

Dasturchilar ko'p yo'l qo'yadigan xatolar

Xato: Fayl yuklashda uning hajmi va formatini tekshirmaslik (foydalanuvchi virusli yoki 500 MB li fayl yuklashi mumkin).
To'g'ri: Har doim serializerda validate_cover_image orqali MIME turi va maksimal hajmni qat'iy tekshiring.

Amaliy topshiriq 15 daqiqa

Oson settings/base.py ga STATIC_ROOT va MEDIA_ROOT sozlamalarini kiriting.
O'rta PostCoverUploadSerializer klassini 5 MB va JPEG/PNG tekshiruvi bilan yozing.
Qiyin upload_cover va download_cover actionlarini sinovdan o'tkazing.
AXV

Darsni yakunlaymiz

Keyingi darsda: APIni avtomatlashtirilgan testlash va Swagger / ReDoc hujjatlashtirish!

STATIC_ROOT & MEDIA_ROOT MultiPartParser Pillow validatsiyasi FileResponse Download