@@ -0,0 +1,31 @@
|
||||
"""Локальная генерация 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}"
|
||||
Reference in New Issue
Block a user