1 Востаннє редагувалося Q-bart (22.08.2017 17:02:54)

Тема: HTTP request to db

Привіт всім!

Python/django

Мені треба зберегти всі-всі запити до django в базу даних. Все ок.

Єдина проблема виникає коли є POST запит, і в запиті передавались файли, напр. картинка.

В django в

request.body

якраз передаєтся тіло запиту. Тільки, наскільки я розумію, файли передаються http в байтах?
Як мені записати це в базу даних? + Треба врахувати, що в тілі може бути не тільки файл, а і решта "нормального" тексту. (не знаю, чи правильно я зараз говорю)


Якщо просто в django.db.models.TextField запихати request.body, то виходить помилка:

You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

Оце нагуглив рішення:

base64.encodestring(body) # так кодуєм і записуєм базу
base64.decodestring(body) # а так розкодовуєм

В базу зберігається (закодовано). А от треба тепер якось це в нормальному вигляді показати людям на сайті. Тобто з допомогою base64.decodestring(body). І отут проблема:
якщо зробити

print base64.decodestring(body)

то виведе в термінал багато кракозябрів(це напевно картинка і трохи норм. тексту - всі решта поля). А от якщо через django шаблон відображати - то взагалі нічого не відбувається. Просто пусте місце.


Тож допоможіть:
1. Як відобразати base64.decodestring(body) в шаблоні на сайті.
2. Якщо з першим пунктом нереально взагалі нічого, можливо є інший спосіб записати в базу значення?

Дякую!

2

Re: HTTP request to db

як щодо блоба?

код з інтернету

Джерело: https://stackoverflow.com/questions/221 … ugh-python

import mysql.connector
import sys
from PIL import Image
import base64
import cStringIO
import PIL.Image

db = mysql.connector.connect(user='root', password='abhi',
                              host='localhost',
                              database='cbir')

image = Image.open('C:\Users\Abhi\Desktop\cbir-p\images.jpg')
blob_value = open('C:\Users\Abhi\Desktop\cbir-p\images.jpg', 'rb').read()
sql = 'INSERT INTO img(images) VALUES(%s)'    
args = (blob_value, )
cursor=db.cursor()
cursor.execute(sql,args)
sql1='select * from img'
db.commit()
cursor.execute(sql1)
data=cursor.fetchall()
print type(data[0][0])
file_like=cStringIO.StringIO(data[0][0])
img=PIL.Image.open(file_like)
img.show()

db.close()

Взагалі, зберігати картинки в БД - погана ідея.

Подякували: koala, ostap34PHP2

3

Re: HTTP request to db

Потрібно спочатку надіслати header для зображення.
Наприклад Content-type: image/jpeg
А далі вивід ваших "кракозябрів", це і є зображення.

А взагалі, зберігати зображення в бд - не дуже хороша практика. Для цього і придумали файлові системи.

4

Re: HTTP request to db

а ви знали, що зображення можна зберігати в вигляді тексту?

5

Re: HTTP request to db

І навпаки - текст в вигляді зображення, як в твіттері.

6

Re: HTTP request to db

Та я сам знаю, що то просто рукожопість зберегти картинку в текст. Але це тестове завдання)

7

Re: HTTP request to db

Загалом, зробив:

base64.decodestring(body).decode('latin-1')

Що воно таке виводило не ясно до кінця, але завданням було зберегти запити і весь решту body показувалось ОК

Подякували: 0xDADA11C71

8

Re: HTTP request to db

Q-bart написав:

Та я сам знаю, що то просто рукожопість зберегти картинку в текст. Але це тестове завдання)

ну ... інколи в тестових так і перевіряють чи знаєш, як робити правильно...

p.s.
я б рішив правильно - зберігаючи у файл, а в БД - шлях до файла . І описав би це в коментарі до програми.
або  , якщо б і навіть пхав картинку в БД - обов'язково б написав, що це неправильно, але на вимогу замовника робимо так.

Подякували: ivan.hrytskiv1

9

Re: HTTP request to db

Так там не треба було зберегти файл(він також зберігався) а саме зберегти запит, в тому числі тіло, якщо воно є

Подякували: ping1

10

Re: HTTP request to db

"Так там не треба було зберегти файл(він також зберігався) а саме зберегти запит, в тому числі тіло, якщо воно є"

ну так просто в полі БД зберігаєш тіло POSTа як джейсон чи як тупл )))