Задать вопрос
@G_tost
Fullstack developer

Django как настроить отдачу картинок с локального хранилища?

Как сделать что бы при запросе на роут /static/file.png сервер отдавал картинку ?
  • Вопрос задан
  • 472 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
@metajiji
Остается только привести дефолтный конфиг nginx для Django:
server {
	listen 80;
	server_name domain.ltd;
	root /srv/app/public;

	# Logs.
	access_log /var/log/nginx/domain.ltd_access.log;
	error_log /var/log/nginx/domain.ltd_error.log;

	# Options.
	client_max_body_size 0;
	keepalive_timeout 5;

	# Locations.
	location / {
		try_files $uri @proxy_to_app;
	}

	location @proxy_to_app {
		proxy_pass http://127.0.0.1:8001;  # See guniconf.py file.
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_redirect off;
	}
}


В таком случае, удобно будет организовать проект следующим образом:
/srv/app/
├── example
│   ├── forms.py
│   ├── __init__.py
│   ├── migrations
│   ├── models.py
│   ├── settings.py
│   ├── static
│   ├── templates
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
├── logs
├── manage.py
├── public
│   └── static
├── README.md
├── requirements.txt
└── venv


Для работы этой схемы проекта нужно добавить в settings.py:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'public', 'static')


При такой конфигурации веб сервер смотрит в каталог /srv/app/public/ и попытается сперва отдать с диска то, что запросил пользователь, если не найдет, то отправит запрос в Django.
А еще появляется возможность складывать свои собственные статические файлы в этот каталог (например zip архив или pdf документ), кроме того, нет необходимости что-то менять в конфигурации nginx, что очень удобно.

Для media можно поступить аналогично, если для скачивания media не предусмотрена авторизация, для этого нужно добавить в settings.py:
STATIC_URL = '/media/'
STATIC_ROOT = os.path.join(BASE_DIR, 'public', 'media')

/srv/app/
├── example
├── logs
├── public
│   ├── media
│   └── static
└── manage.py


Если все-таки авторизация нужна, то не стоит складывать каталог media в public, в таком случае лучше придерживаться стандартной конфигурации:
STATIC_URL = '/media/'
STATIC_ROOT = os.path.join(BASE_DIR, 'media')

/srv/app/
├── example
├── logs
├── media
├── public
│   └── static
└── manage.py

Еще порекомендовал бы настроить X-Accel-Redirect для отдачи media через nginx, но об этом я в этом посте уже не буду писать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы