"""Локальная генерация 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}"