Что пишется в поле с изображением: url или base64 кодировка
Что проверяют
Понимаете ли вы, где на самом деле живут двоичные данные и что кладётся в поле модели. Вопрос простой, но по нему видно, работали ли вы с загрузками и хранилищем или только с учебными примерами.
Как отвечать
В поле пишется ссылка: путь или ключ объекта в хранилище, а сам файл лежит в объектном хранилище либо на диске за раздающим сервером. В Django это ровно то, что делает ImageField, без него это колонка со строкой ключа плюс метаданные: тип содержимого, размер, ширина и высота, контрольная сумма.
Почему не base64:
- текстовое представление крупнее двоичного примерно на треть, и этот рост оплачивается в базе, в резервных копиях, в трафике и в памяти процесса;
- поле тянется в выборку вместе с остальными колонками, и обычный список записей начинает возить мегабайты;
- картинка перестаёт кэшироваться отдельно: теряются раздача сетью доставки, частичные запросы и параллельная загрузка.
Base64 оправдан узко: крошечная иконка внутри вёрстки, встраивание в письмо, разовая передача в теле запроса там, где второй поход к хранилищу дороже накладных расходов.
Про загрузку и выдачу: приём файла отдельным запросом или по заранее подписанной ссылке прямо в хранилище, мимо приложения; выдача публичным адресом для открытых картинок и подписанным с ограниченным сроком для приватных. Уменьшенные копии делает фоновая задача, а не обработчик запроса.
Где спотыкаются
Кладут base64 в текстовую колонку, потому что так проще на старте. Дальше растут таблица, резервные копии и время выборки, а переезд в хранилище превращается в отдельный проект с миграцией данных.
Второе: путают тип содержимого с расширением. Проверять надо по самому файлу, отдавать с корректным заголовком типа и не раздавать пользовательский SVG с основного домена: внутри него исполняемый код.
Третье: подписывают ссылки коротким сроком на каждый элемент длинного списка. Кэш перестаёт работать, потому что адрес меняется при каждом открытии, а сервис получает лишнюю нагрузку на подпись и на выдачу.