在 Django 中显示来自二维码的 SVG 图像
Display SVG image from qrcode in Django
根据 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}}"/>
显示,但实际上并没有得到任何结果。该错误显示它正在尝试获取 img url,但有没有一种方法可以在不保存 img 等的情况下执行此操作?终端输出:
>>> 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
您可以将其写入响应流:
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>
为了解决这个问题,我将 <qrcode.image.svg.SvgImage>
转换为 base64 字符串,然后可以将其用作 HTML 中的 img src="{{variable}}"
。
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
如果这不是一个好的解决方案,我希望得到一些反馈。干杯
根据 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}}"/>
显示,但实际上并没有得到任何结果。该错误显示它正在尝试获取 img url,但有没有一种方法可以在不保存 img 等的情况下执行此操作?终端输出:
>>> 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
您可以将其写入响应流:
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>
为了解决这个问题,我将 <qrcode.image.svg.SvgImage>
转换为 base64 字符串,然后可以将其用作 HTML 中的 img src="{{variable}}"
。
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
如果这不是一个好的解决方案,我希望得到一些反馈。干杯