Отображение изображения SVG из qrcode в Django - PullRequest
1 голос
/ 17 июня 2020

Согласно qrcode документам, я генерирую SVG QR-код:

import qrcode
import qrcode.image.svg
def get_qrcode_svg( uri ):
    img = qrcode.make( uri, image_factory = qrcode.image.svg.SvgImage)
    return img

И все в порядке. Я получаю объект <qrcode.image.svg.SvgImage object at 0x7f94d84aada0>.
Я хотел бы отобразить это сейчас в Django html. Я передаю этот объект как контекст (как qrcode_svg) и пытаюсь отобразить с помощью <img src="{{qrcode_svg}}"/>, но ничего не добился с этим. Ошибка показывает, что он пытается получить URL-адрес img, но разве я не могу сделать это без сохранения img et c.? Вывод терминала:

>>> UNKNOWN ?????? 2020-06-16 07:38:28.295038 10.0.2.2 GET 
/user/<qrcode.image.svg.SvgImage object at 0x7f94d84aada0>
Not Found: /user/<qrcode.image.svg.SvgImage object at 0x7f94d84aada0>
"GET /user/%3Cqrcode.image.svg.SvgImage%20object%20at%200x7f94d84aada0%3E HTTP/1.1" 404 32447

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Чтобы решить эту проблему, я преобразовал <qrcode.image.svg.SvgImage> в строку base64, которую затем можно использовать как img src="{{variable}}" в HTML.

import io
import base64

from qrcode import make as qr_code_make
from qrcode.image.svg import SvgPathFillImage

def get_qr_image_for_user(qr_url: str) -> str:
    svg_image_obj = qr_code_make(qr_url, image_factory=SvgPathFillImage)
    image = io.BytesIO()
    svg_image_obj.save(stream=image)
    base64_image = base64.b64encode(image.getvalue()).decode()
    return 'data:image/svg+xml;utf8;base64,' + base64_image

Если это не лучшее решение, мне бы хотелось получить отзывы. Ура

1 голос
/ 17 июня 2020

Вы можете записать его в поток ответа:

import qrcode
from qrcode.image.svg import SvgImage
from django.http import HttpResponse
from bytesIO import bytesIO

def get_qrcode_svg(uri):
    stream = bytesIO()
    img = qrcode.make( uri, image_factory=SvgImage)
    img.save(stream)
    return stream.getvalue().decode()

Это передаст svg source , а не URI с исходным кодом. Таким образом, в шаблоне вы визуализируете это с помощью:

<b>{{ qrcode_svg|safe }}</b>
...