使用Segno即时生成qrcode

时间:2018-10-10 11:37:24

标签: qr-code

如何使用Segno(qrcode python库)即时生成QRCode 显示在网页上 作为SVG数据的示例 导入segno qr = segno.make('跳了魔鬼') svgvar = qr.export_as_svg()

还是更好的主意?

2 个答案:

答案 0 :(得分:0)

import segno
# var contains a SVG data URI
var = segno.make('Up Jumped the Devil').svg_data_uri()

var包含QR码作为数据URI:

data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns[...]

可用于将代码直接嵌入到任何HTML img中。

另一个选择:将SVG写入二进制缓冲区而不是文件中:

import segno 
import io
buff = io.BytesIO()
segno.make('Up Jumped the Devil').save(buff, kind="svg")
# Returns the SVG output
buff.getvalue()

buff包含完整的SVG文档:

<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="33" height="33" class="segno"><path[...]</svg>

输出不能直接在HTML页面中使用,但是您可以省略XML声明和SVG名称空间:

segno.make('Up Jumped the Devil').save(buff, kind="svg", 
           xmldecl=False, svgns=False)

buff.getvalue()的结果:

<svg width="33" height="33" class="segno"><path[...]</svg>

答案 1 :(得分:0)

我能够在我的 views.py 中执行此操作,以动态生成QR码。

import segno
from django.views.generic.base import TemplateView

from .models import MyModel

class QRCodeView(TemplateView):
    template_name = "my_template.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        
        param = self.kwargs['param'] # this is how to grab something from the url pattern

        # scale=10 changes size of saved image
        # svg_data_uri (or png_data_uri) is saved in memory and easily put in html <img src='uri'>
        # .make_qr forces a non-micro QR code
        qr_code = segno.make_qr(f"MY {param} DATA").svg_data_uri(scale=10)
        
        context['qrcode'] = qr_code
        return context

现在我可以在我的 template.html

中访问它了
<img src="{{ qrcode }}" ...>

与使用缓冲区相比,我更喜欢这样做,因为不需要与Byte / Image进行相互转换,也不需要其他库。