Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28

Как передать BLOB поле во вьюшку с конвертированием в base64?

12.05.2019, 16:32. Показов 4571. Ответов 18

Студворк — интернет-сервис помощи студентам
Добрый день, начинаю изучать Django.
У меня в уже существующей базе есть поле в BLOB формате, в модели оно описано как BinaryField. В этом поле у меня хранятся картинки. У меня получается просто передать в HTML страницу код без конвертирования, но как мне его конвертировать в base64?

models.py
Python
1
2
class BlobImg(models.Model):
    photo = models.BinaryField(blank=True, null=True, db_column="photo")
views.py
Python
1
2
3
4
5
6
7
8
def home(request):
 
    data = {
        'news': News.objects.all(),
        'title': 'Главная страница',
        'imgs' : BlobImg.objects.all()
    }
    return render(request, 'app/home.html', data)
home.html
HTML5
1
2
3
{% for img in imgs %}
    <p>{{ img.photo }}</p>
{% endfor %}
Я видел подобного рода код, но не имею понятия как его применить, чтобы при получении данных мне приходили данные уже в декодированном виде:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import base64
 
from django.db import models
 
class Foo(models.Model):
 
    _data = models.TextField(
            db_column='data',
            blank=True)
 
    def set_data(self, data):
        self._data = base64.encodestring(data)
 
    def get_data(self):
        return base64.decodestring(self._data)
 
    data = property(get_data, set_data)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2019, 16:32
Ответы с готовыми решениями:

Base64-код картинки в BLOB-поле
Здравствуйте! Создал редактор фотографий (для обрезки, изменения размера). Редактированная фотография кодируется в base64. Я этот код...

Как скопировать содержимое BLOB поля одной записи в BLOB поле другой?
Как скопировать содержимое BLOB поля одной записи в BLOB поле другой?

Как правильно передать изображение с контроллера во вьюшку?
Помогите пожалуйста новичку: делаю приложение для просмотра погоды , беру ее с сайта openweathermap.org. Оттуда можно вывести иконки для...

18
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
12.05.2019, 16:41
Если вы храните base64 в бд, то декодировать из base64 нужно ДО отправки данных в шаблон. Либо писать фильтр для шаблона который будет что то делать с кодированной картинкой.
Цитата Сообщение от prostospirit Посмотреть сообщение
Я видел подобного рода код, но не имею понятия как его применить, чтобы при получении данных мне приходили данные уже в декодированном виде:
Python
1
2
3
obj = Foo.objects.get({FILTER})
image_data = obj.data() # будет вызван метод Foo.get_data() т.к. get_data() это геттер для поля _data. 
# подробнее в документации пайтон getter and setter
Рекомендация. Не нужно хранить картинки в БД. БД это не файло-хранилище. Использование БД для хранения картинок повысит нагрузку на СУБД. В джанго есть поля ImageField и FileField предназначенные для хранения картинок и файлов соответственно.
1
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
12.05.2019, 23:22  [ТС]
Wi0M, я получаю ошибку:
image_data = obj.data()
TypeError: 'bytes' object is not callable

В браузере выводит
Python
1
2
3
4
image_data = obj.data()
Local vars
obj <BlobImg: BlobImg object (1)>
request <WSGIRequest: GET '/'>
Что именно я должен передать в шаблон?

По поводу рекомендации: да, я знаю, что это не самый лучший вариант, но у меня более 30м картинок и не совсем вариант хранить их в одной папке
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
12.05.2019, 23:24
потому что надо не image_data = obj.data() а image_data = obj.data. У меня ошибка в предыдущем посте
1
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
13.05.2019, 01:00  [ТС]
Wi0M, оно по идее должно вернуть уже конвертированную строку, но возвращает мне: "b"$R\x05\x0b\xbd5\xe3\x8e=\xf3m\xf8\xd8 \xb6\xdbm\xb6\xdbm\xb6\xdbm\xb6\xdbm\xb6 \xdbm\xb6\xdbm\xb6\xdbm\xb6\xdbm\...."
Но это всё равно не преобразованная строка, хотя я всё по идее сделал правильно:
models.py
Python
1
2
3
4
5
6
7
8
9
10
class BlobImg(models.Model):
    _data = models.BinaryField(blank=True, null=True, db_column="photo")
 
    def set_data(self, data):
        self.photo = base64.encodebytes(data)
 
    def get_data(self):
        return base64.decodebytes(self._data)
 
    data = property(get_data, set_data)
views.py
Python
1
2
obj = BlobImg.objects.get(id=1)
    image_data = obj.data
Уже дня 2 мучаюсь с этой проблемой)
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
13.05.2019, 01:02
так ты все верно получил. картинка это набор байтов так то) их ты и кодируешь в base64 и обратно)
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
13.05.2019, 02:05  [ТС]
Wi0M, так не, если я беру полученную строку закидываю в:
HTML5
1
<img src="data:image/png;base64,{{ img }}" class="img-thumbnail">
то у меня ничего толкового не выводит
А когда я беру вот эту полученную выше строку, создаю отдельный файл в питоне, беру base64.decodebytes и закидываю туда эту строку, то он мне возвращает уже именно строку в байтах(она тоже состоит из букв, но выглядит немного иначе, без слешей, просто буквами) и когда я закидываю возвращённый мне код вместо {{ img }}, то он мне возвращает именно картинку, как мне и нужно.
Я надеюсь, что понятно описал? Или более развёрнуто нужно?)
Т.е. формат возвращаемой строки точно такой же, если бы я запрашивал данные из поля напрямую)
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
13.05.2019, 12:35  [ТС]
Wi0M, а что я конкретно должен прописать вместо {FILTER}? "id=1" подойдёт например? Оно то пишет, что возвращает 1 объект, но я не уверен, что я передаю функцию именно данные этого объекта
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
13.05.2019, 17:10
смотри. если ты пытаешься подставить данные картинки в
HTML5
1
<img src="data:image/png;base64,{{ img }}" class="img-thumbnail">
то тебе не нужно ничего декодировать из base64.
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
14.05.2019, 00:01  [ТС]
Wi0M, просто я пытаюсь сделать аналог имеющегося кода в PHP, там дата запихивается в декодер и всё это записывается в <img src="data:image/png;base64, #декодер(дата)#" class="img-thumbnail">
я пытаюсь сделать по аналогии, и я предположил, что мне опять же нужно декодировать свои данные и передать в такого же типа тег.
Спасибо за ответы)

Добавлено через 59 минут
Wi0M, ещё я перебирал без функций декодирования и заметил, что формат TextField возвращает строку:
Кликните здесь для просмотра всего текста
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x 01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x 00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\ x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\ x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\ x1d\x1a\x1c\x1c $.\' ",#\x1c\x1c(7),01444\x1f\'9=82<.342\xff\ xdb\x00C\x01\t\t\t\x0c\x0b\x0c\x18\r\r\x 182!\x1c!2222222222222222222222222222222 2222222222222222222\xff\xc0\x00\x11\x08\ x01a\x01\x13\x03\x01"\x00\x02\x11\x01\x0 3\x11\x01\xff\xc4\x00\x1f\x00\x00\x01\x0 5\x01\x01\x01\x01\x01\x01\x00\x00\x00\x0 0\x00\x00\x00\x00\x01\x02\x03\x04\x05\x0 6\x07\x08\t\n\x0b\xff\xc4\x00\xb5\x10\x0 0\x02\x01\x03\x03\x02\x04\x03\x05\x05\x0 4\x04\x00\x00\x01}\x01\x02\x03\x00\x04\x 11\x05\x12!1A\x06\x13Qa\x07"q\x142\x81\x 91\xa1\x08#B\xb1\xc1\x15R\xd1\xf0$3br\x8 2\t\n\x16\x17\x18\x19\x1a%&\'()*456789:C DEFGHIJSTUVWXYZcdefghijstuvwxyz\x83\x84\ x85\x86\x87\x88\x89\x8a\x92\x93\x94\x95\ x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa6\ xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb7\ xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc8\ xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\ xda\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\ xea\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\ xfa\xff\xc4\x00\x1f\x01\x00\x03\x01\x01\ x01\x01\x01\x01\x01\x01\x01\x00\x00\x00\ x00\x00\x00\x01\x02\x03\x04\x05\x06\x07\ x08\t\n\x0b\xff\xc4\x00\xb5\x11\x00\x02\ x01\x02\x04\x04\x03\x04\x07\x05\x04\x04\ x00\x01\x02w\x00\x01\x02\x03\x11\x04\x05 !1\x06\x12AQ\x07aq\x13"2\x81\x08\x14B\x9 1\xa1\xb1\xc1\t#3R\xf0\x15br\xd1\n\x16$4 \xe1%\xf1\x17\x18\x19\x1a&\'()*56789:CDE FGHIJSTUVWXYZcdefghijstuvwxyz\x82\x83\x8 4\x85\x86\x87\x88\x89\x8a\x92\x93\x94\x9 5\x96\x97\x98\x99\x9a\xa2\xa3\xa4\xa5\xa 6\xa7\xa8\xa9\xaa\xb2\xb3\xb4\xb5\xb6\xb 7\xb8\xb9\xba\xc2\xc3\xc4\xc5\xc6\xc7\xc 8\xc9\xca\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd 9\xda\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xe a\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xf f\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x1 1\x00?\x00\xf5\x90*U\x1d\xe9\x8bR\x0e\x9 5\x05\x0e\xe2\x8a9\xa3\xd0P\x02\xf6\xa34 \xbcRP\x02v\xe9KA\xa3?\x95\x00&}))MF\xd3 F\xbc3\x81\xf54\x00\xf3\xdf\x9aB\xc0Vf\x a3\xad\xdai\xb1\x17\x9aA\xd38\x1dk\xcd|M \xf1@<F\x1d8`\xf6\x93$\x11\xef\x8a\x97.\ xc3\xb1\xeb\x13\xdd\xc3o\x1bI4\xa8\x88\x bc\x96c\x80+\x91\xd7>$h\xfaR\xe27\xfbL\x 9d\x84}\x07\xe3^3\xaax\xbbS\xd4\xf7- и т.д.(всё не вмещается в сообщение)

И заметил, что формат BinaryField не возвращает ничего, только объект айдишником записи
Формат в базе по прежнему BLOB
Совершенно потерялся и не понимаю уже, что можно делать с полученной строкой, чтобы получить изображение.
Перелопатил все форумы, не могу найти конкретного решения.
В самой базе картинка открывается корректно.
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
14.05.2019, 00:07
то что ты пишешь в классе модели FileField еще на значит что у тебя в БД будет тот же тип) Такого типа нет вовсе в базах данных) А джанго использует свои внутренние механизмы определения типо под класс поля модели. Тебе туда бы не лезть вообще) Ты сохраняешь картинку в base64 в модель? а получая, НЕ декодируй из base64. Вот и все.
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
14.05.2019, 01:37  [ТС]
Wi0M, я работаю просто по уже существующей базе, закидывали туда фотки ещё до меня. До этого, чтобы доставать такие фотки и записывать на диск мне требовался тоже конвертер такого формата
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
    class NumpyMySQLConverter(connector.conversion.MySQLConverter):
      """ A mysql.connector Converter that handles Numpy types """
      def _float32_to_mysql(self, value):
        return float(value)
 
      def _float64_to_mysql(self, value):
        return float(value)
 
      def _int32_to_mysql(self, value):
        return int(value)
 
      def _int64_to_mysql(self, value):
        return int(value)


Записывать это уже тривиальная задача, мне бы её считать как-нибудь оттуда)
Окей. Разложу всё по деталям. Делаю без декодирования
В базе находится BLOB(65535)

В models.py
Python
1
2
class BlobImg(models.Model):
    photo = models.BinaryField(null=True)
В views.py
Python
1
2
3
4
5
6
7
def home(request):
    data = {
        'news': News.objects.all(),
        'title': 'Главная страница',
        'imgs' : BlobImg.objects.get(id=1)
    }
    return render(request, 'app/home.html', data)
Тег:
HTML5
1
<img src="data:image/png;base64,{{ imgs.photo }}" class="img-thumbnail">
не выводит картинку.
При этом imgs.photo возвращает строку:
Кликните здесь для просмотра всего текста
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x 01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x 00C\x00\x08\x06\x06\x07\x06\x05\x08\x07\ x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\ x0c\x19\x12\x13\x0f\x14\x1d\x1a\x1f\x1e\ x1d\x1a\x1c\x1c $.\'

длиной 35012 символов

Что в коде не так? Не могу понять
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
14.05.2019, 08:28
Python
1
2
3
4
5
6
7
8
9
from base64 import b64encode
 
def home(request):
    data = {
        'news': News.objects.all(),
        'title': 'Главная страница',
        'img' : b64encode(BlobImg.objects.get(id=1).photo)
    }
    return render(request, 'app/home.html', data)

HTML5
1
<img src="data:image/png;base64,{{ img }}" class="img-thumbnail">
Определись уже что у тебя в базе, base64 или картинка. Ты словно сам не видишь что ты достаешь из БД.
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
14.05.2019, 08:46  [ТС]
Wi0M, если я для ячейки выберу тип отображаемого изображения "картинка", то она корректно отображается как картинка. Из этого вывод - картинка, но в поле blob
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
14.05.2019, 09:10
да это и так видно по данным которые хранятся в БД. из этого и вывод что требуется кодирование в base64
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
14.05.2019, 11:01  [ТС]
Wi0M, мне нужно делать encodebytes или decodebytes? Я предполагаю, что encodebytes
0
 Аватар для Wi0M
395 / 123 / 48
Регистрация: 26.10.2013
Сообщений: 734
14.05.2019, 11:30
base64.b64encode
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
14.05.2019, 23:39  [ТС]
Wi0M, вот, беру:


Python
1
2
3
4
5
6
7
8
9
10
def home(request):
    obj = BlobImg.objects.get(id=1)
    image_data = base64.b64encode(obj.photo)
 
    data = {
        'news': News.objects.all(),
        'title': 'Главная страница',
        'imgs' : image_data
    }
    return render(request, 'app/home.html', data)
HTML5
1
<img src="data:image/jpeg;base64,{{ imgs }}" class="img-thumbnail">
imgs возвращает строку байтовую, но html никак не может конвертировать это в картинку.
При этом уже перебрал и кучу других вариаций
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
18.05.2019, 16:46  [ТС]
Wi0M, в Python 3 base64.b64encode()функция возвращает закодированные байты, а не строку. Из-за этого URI данные отображаются как data:image/jpeg;base64,b'/9j/4AA...', в то время как они должен быть data:image/jpeg;base64,/9j/4AA.... Чтобы это исправить, декодируйте байты в строку, например, используя base64.b64encode(obj.photo).decode().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2019, 16:46
Помогаю со студенческими работами здесь

Как создать вьюшку состоящую из документов в которых в поле отправлени
У меня на ум пришло использовать @IsNumber, делаю так SELECT (Form=&quot;f_plan&quot; &amp; @IsMember(@UserName;fld_plan_mail)) Но во первых к имени...

Хранение изображений: загрузка или blob/base64
Всем доброго времени суток. Допустим, есть некоторый wysiwyg редактор с возможностью вставки картинок. Выходной текст можно хранить в бд...

Как занести картинку в BLOB-поле?
база сделана через Database Desktop типа Paradox7, при создании поля выбрала типа Grephic. Скажите как в это поле засунуть картинку? и...

Как редактировать поле данных типа blob?
В бд(MySQL) имеется таблица. одно из полей таблицы имеет тип редактировать BLOB Пытался ручками отредактировать данные а таком поле не...

Как записать Blob поле в DBF таблицу ?
Работаю с ADO, драйвер соединения: ODBC. Создал DBF файл &quot;PR&quot; , в нём поле &quot;Picture&quot; типа OLEOBJECT. Есть связанная с ним ADO...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru