К основному содержанию
скилл CX Codex

django-storages-s3 — скилл для Claude Code: S3 для Django

Скилл настраивает хранение статики и медиафайлов Django в AWS S3 через django-storages и boto3: словарь STORAGES, presigned-ссылки, CloudFront, IAM.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a claude-code
Открыть на GitHub

Что делает django-storages-s3

Скилл включается, когда в settings.py появляется STORAGES, бакет S3, presigned-ссылки или CloudFront. Он проводит по шагам: установка django-storages[s3] и boto3, регистрация "storages" в INSTALLED_APPS, загрузка ключей из переменных окружения, сборка словаря STORAGES с раздельными префиксами location для медиа и статики.

Внутри — справочники по конфигурации, кастомным бэкендам, presigned-ссылкам и тестированию с IAM. Есть отдельный чек-лист для аудита уже работающего проекта: где искать захардкоженные ключи, почему default_acl на новых бакетах должен быть None, чем грозит querystring_auth=True вместе с custom_domain.

Скилл требует Django 4.2 или новее: DEFAULT_FILE_STORAGE и STATICFILES_STORAGE удалили в 5.1, поэтому на 5.1, 5.2 и 6.0 они молча игнорируются. Ещё нужен установленный boto3 и доступ к бакету. Тесты советует гонять через InMemoryStorage или moto, а не по реальному S3.

Какие задачи решает

  • перевести загрузку медиафайлов с локального диска на S3
  • разделить публичные и приватные файлы на разные бэкенды
  • выдавать presigned-ссылку на скачивание закрытого файла
  • подключить CloudFront перед бакетом и написать IAM-политику с минимальными правами
  • замокать S3 в тестах, чтобы не ходить в реальный бакет

Примеры запросов агенту

  • Настрой STORAGES для медиа и статики в S3, ключи возьми из переменных окружения
  • Сделай presigned-ссылку на скачивание приватного файла из бакета
  • Проверь мой settings.py: не осталось ли DEFAULT_FILE_STORAGE и хардкода ключей

Как установить django-storages-s3

1Через Skills CLI (Vercel)

npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a claude-code

2Вручную: положить файлы

~/.claude/skills/django-storages-s3/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/django-storages-s3/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора67

Весь набор →
django-expert Скилл помогает проектировать модели Django 5.0, настраивать сериализаторы DRF, оптимизировать ORM-запросы и конфигурировать аутентификацию по JWT. CX Codex +1 4 200установок feature-forge Скилл проводит интервью по требованиям и превращает идею фичи в спецификацию: EARS-требования, критерии приёмки, чек-лист реализации. CX Codex +1 4 200установок swift-expert Скилл для разработки на Swift: архитектура, SwiftUI, async/await, акторы и тесты. Пригодится, когда агент пишет или разбирает код приложения под iOS и macOS. CX Codex +1 4 100установок chaos-engineer Помогает спланировать chaos-эксперименты, внедрить инъекцию отказов и провести game day. Пригодится, когда нужно проверить, как распределённая система переживает падение пода или задержку сети. CX Codex +1 4 000установок graphql-architect Помогает проектировать схемы GraphQL, настраивать подграфы Apollo Federation 2.5+ и устранять проблему N+1 с помощью DataLoader. CX Codex +1 4 000установок vue-expert-js Создаёт Vue 3-код на JavaScript с JSDoc-аннотациями вместо TypeScript. Пригодится для компонентов, композаблов, роутинга и состояния в проектах без TS. CX Codex +1 4 100установок ml-pipeline Скилл проектирует пайплайны машинного обучения: настраивает трекинг экспериментов в MLflow, собирает DAG для Kubeflow или Airflow и валидирует данные перед обучением. CX Codex +1 3 900установок spark-engineer Пишет PySpark-джобы и разбирает их тормоза: DataFrame, Spark SQL, перекос ключей, стриминг. Пригодится, когда джоб упирается в шуфл или падает по памяти. CX Codex +1 3 800установок

Похожие

aws-sdk-python-usage aws Скилл задаёт правила кодинга на Python с библиотеками boto3 и botocore. Он подсказывает агенту, когда брать client или resource, как настраивать пагинацию и перехватывать ошибки AWS. CX Codex +1 7 800установок hf-cloud-python-env-setup huggingface Скилл разворачивает изолированное окружение Python для работы с AWS и SageMaker. Он помогает избежать сбоев из-за несовместимых версий Python и устаревшего SDK boto3. CX Codex +1 548установок routing-traffic-with-route53-and-cloudfront aws Настраивает Route 53 для направления пользовательского домена на CloudFront с HTTPS и IPv6. Нужен при создании alias-записей и подключении домена к дистрибутиву. CX Codex +1 6 200установок cdn-setup devops-skills Скилл помогает настроить CDN через CloudFront и Cloudflare: раздавать статику, защищать трафик по TLS и сбрасывать кеш. Пригодится при публикации сайтов и API. CX Codex +1 324установок aws-sdk-java-v2-s3 giuseppe-trisciuoglio Даёт агенту готовые примеры работы с Amazon S3 через AWS SDK for Java 2.x: бакеты, загрузка объектов, multipart, presigned URL. CX Codex +1 3 700установок iac-terraform-data-engineering reason-machines Скилл для Claude и других ИИ-агентов: помогает описывать инфраструктуру AWS под данные в Terraform — бакеты S3, инстансы EC2, роли IAM. CX Codex +1 1 800установок

Рядом в теме «Бэкенд и API»

Всё по теме «Бэкенд и API» →

Вопросы о django-storages-s3

Как установить django-storages-s3 в Claude?

Выполните npx skills add Jeffallan/claude-skills --skill django-storages-s3 -a claude-code. Файл скилла окажется в ~/.claude/skills/django-storages-s3/SKILL.md.

Что делает django-storages-s3?

Помогает настроить хранение статики и медиафайлов Django в AWS S3: словарь STORAGES, публичные и приватные бэкенды, presigned GET и POST ссылки, IAM-политику и моки S3 для тестов.

Почему на новых бакетах нужен default_acl=None?

У бакетов, созданных после апреля 2023, ACL отключены по умолчанию, и значение "public-read" или "private" вызовет AccessControlListNotSupported. Публичный доступ тогда задаётся политикой бакета.

Исходный текст

SKILL.md · MIT
---
name: django-storages-s3
description: "Use when configuring Django to store static and media files on AWS S3 with django-storages. Invoke when working with the STORAGES setting, S3 buckets, presigned URLs, CloudFront, or boto3-backed file storage in settings.py. Configures the Django 4.2+ STORAGES dict, public/private custom backends, presigned GET/POST URLs, IAM policies, and S3 mocking for tests. Trigger terms: django-storages, S3, boto3, S3Boto3Storage, STORAGES, presigned URL, CloudFront, media files, collectstatic, AWS_STORAGE_BUCKET_NAME."
license: MIT
metadata:
  author: https://github.com/awais786
  version: "1.0.0"
  domain: backend
  triggers: django-storages, S3, boto3, S3Boto3Storage, STORAGES, presigned URL, CloudFront, media files, collectstatic
  role: specialist
  scope: implementation
  output-format: code
  related-skills: django-expert
---

# Django Storages S3

Senior Django specialist for production-grade file storage on AWS S3 via `django-storages` and `boto3` — public and private media, static files, presigned URLs, and CloudFront.

## When to Use This Skill

- Serving static and/or media files from AWS S3 instead of the local filesystem
- Configuring the Django 4.2+ `STORAGES` dict or legacy `DEFAULT_FILE_STORAGE`
- Separating public (CDN-served) and private (presigned) file backends
- Generating presigned download or direct browser-to-S3 upload URLs
- Fronting S3 with CloudFront and writing a least-privilege IAM policy
- Migrating local `FileField`/`ImageField` storage to S3 without code changes
- Testing storage code without hitting S3

## Core Workflow

1. **Install & register** — `pip install django-storages[s3] boto3`; add `"storages"` to `INSTALLED_APPS`
2. **Configure credentials** — Load from env vars or rely on an attached IAM role; never hardcode
3. **Wire the `STORAGES` dict** — Set `default` (media) and `staticfiles` backends with separate `location` prefixes
4. **Add named backends** — Split public vs. private buckets/ACLs as additional `STORAGES` entries when needed
5. **Verify & test** — Run `collectstatic`, confirm uploads land in S3, and mock S3 in tests with `InMemoryStorage` or `moto`

## Reference Guide

Load detailed guidance based on context:

| Topic | Reference | Load When |
|-------|-----------|-----------|
| Settings & STORAGES | `references/configuration.md` | Core settings, 4.2+ vs legacy, CloudFront |
| Custom backends | `references/custom-backends.md` | Public vs. private buckets, per-field storage |
| Presigned URLs | `references/presigned-urls.md` | Download links, direct browser uploads |
| Testing & IAM | `references/testing-storages.md` | Mocking S3, IAM policy, common pitfalls |

## Minimal Working Example

The snippet below demonstrates the core MUST DO constraints: env-loaded credentials, `STORAGES` dict, separate media/static locations, and `default_acl=None` on the media backend.

```python
# settings.py
import os

AWS_STORAGE_BUCKET_NAME = os.environ["AWS_STORAGE_BUCKET_NAME"]
AWS_S3_REGION_NAME = os.environ.get("AWS_S3_REGION_NAME", "us-east-1")
AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com"
# On EC2/ECS/Lambda, omit keys entirely — boto3 uses the attached IAM role.

STORAGES = {
    "default": {  # media uploads
        "BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
        "OPTIONS": {
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "location": "media",
            "default_acl": None,        # rely on bucket policy, not per-object ACLs
            "file_overwrite": False,
            "querystring_auth": False,  # public objects → clean URLs
        },
    },
    "staticfiles": {
        "BACKEND": "storages.backends.s3boto3.S3StaticStorage",
        "OPTIONS": {
            "bucket_name": AWS_STORAGE_BUCKET_NAME,
            "location": "static",
        },
    },
}

MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/"
STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/"
```

```python
# models.py — uploads go straight to S3 on save()
from django.db import models

class Document(models.Model):
    file = models.FileField(upload_to="docs/")  # uses STORAGES["default"]
```

## Auditing an Existing Configuration

When reviewing a project that already uses S3 (not greenfield), walk this
checklist — each item is a constraint below rephrased as "find X, confirm Y":

1. **Credentials** — `grep -rn "AWS_SECRET_ACCESS_KEY\|aws_secret" settings/` → confirm values come from `os.environ`/`django-environ` or an IAM role, never literals committed to the repo.
2. **ACLs** — `grep -rn "default_acl\|AWS_DEFAULT_ACL" .` → on buckets created after April 2023, every value must be `None`. Any `"public-read"`/`"private"` will raise `AccessControlListNotSupported`; public access belongs in a bucket policy.
3. **Storage backend** — confirm Django 4.2+ uses the `STORAGES` dict, not `DEFAULT_FILE_STORAGE`/`STATICFILES_STORAGE` (removed in Django 5.1, so silently ignored on 5.1/5.2/6.0); confirm the static class is `S3StaticStorage`, not a fabricated name.
4. **Locations** — confirm `default` (media) and `staticfiles` have distinct `location` prefixes or buckets so `collectstatic` never collides with uploads.
5. **Region** — confirm `region_name` (or the global `AWS_S3_REGION_NAME`) matches the bucket's real region and that `AWS_S3_CUSTOM_DOMAIN` includes the region segment for non-`us-east-1` buckets.
6. **Presigning** — for private backends, confirm `querystring_auth=True` **and** `custom_domain=None`; confirm presigned `.url()` results aren't cached past `AWS_QUERYSTRING_EXPIRE`.
7. **Overwrite cleanup** — where `file_overwrite=False`, confirm replaced files are explicitly deleted (otherwise superseded objects leak).
8. **IAM** — confirm the policy grants only `Get/Put/Delete/ListBucket` on the bucket ARN, not broader S3 access.

## Constraints

### MUST DO
- Load AWS credentials from environment variables or an attached IAM role
- Set `default_acl=None` so bucket policies (not object ACLs) control access
- Give static and media files separate `location` prefixes or separate buckets
- Use the `STORAGES` dict on Django 4.2+ (same config through 5.2 LTS and 6.0); `DEFAULT_FILE_STORAGE`/`STATICFILES_STORAGE` were removed in 5.1, so reserve them for < 4.2 only
- Set `custom_domain=None` on any backend that issues presigned URLs
- Mock S3 (`InMemoryStorage` or `moto`) in tests instead of hitting real buckets

### MUST NOT DO
- Hardcode `AWS_SECRET_ACCESS_KEY` in `settings.py` or commit it
- Mix `querystring_auth=True` with a `custom_domain` (presigning breaks)
- Mix static and media files under the same prefix
- Grant the IAM user broader than `Get/Put/Delete/ListBucket` on the bucket ARN
- Rely on per-object ACLs on buckets created after April 2023 (ACLs disabled by default)

## Knowledge Reference

django-storages, S3Boto3Storage, S3StaticStorage, boto3, STORAGES dict, presigned URLs, generate_presigned_post, CloudFront, IAM policy, InMemoryStorage, moto

## Related Skills

- `django-expert` — core Django models, DRF, and ORM that produce the files this skill persists to S3
- `fullstack-guardian` — secure end-to-end upload flows and access control around stored files
- `devops-engineer` — provisioning the S3 buckets, IAM roles, and CloudFront distributions this skill targets

[Documentation](https://jeffallan.github.io/claude-skills/skills/backend/django-storages-s3/)

© https://github.com/awais786 · MIT · Jeffallan/claude-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой