32 lines
1.0 KiB
Python
32 lines
1.0 KiB
Python
"""Локальная генерация QR для привязки киоска (без внешних HTTP и без Pillow)."""
|
|
|
|
import base64
|
|
from io import BytesIO
|
|
|
|
import qrcode
|
|
import qrcode.image.svg
|
|
|
|
|
|
def _svg_image_factory():
|
|
"""SvgPathFillImage — белый фон; в старых версиях qrcode может не быть."""
|
|
svg = qrcode.image.svg
|
|
return getattr(svg, "SvgPathFillImage", svg.SvgPathImage)
|
|
|
|
|
|
def pair_url_to_qr_data_uri(pair_url: str) -> str:
|
|
"""QR-код как data URI (SVG) для подстановки в img src. Работает без Pillow."""
|
|
qr = qrcode.QRCode(
|
|
version=None,
|
|
error_correction=qrcode.constants.ERROR_CORRECT_M,
|
|
box_size=10,
|
|
border=4,
|
|
image_factory=_svg_image_factory(),
|
|
)
|
|
qr.add_data(pair_url)
|
|
qr.make(fit=True)
|
|
img = qr.make_image(fill_color="black", back_color="white")
|
|
buf = BytesIO()
|
|
img.save(buf)
|
|
b64 = base64.b64encode(buf.getvalue()).decode("ascii")
|
|
return f"data:image/svg+xml;base64,{b64}"
|