Python уроки. Пишем генератра QR-кодов с помощью Django и Bootstrap

Python уроки. Пишем генератра QR-кодов с помощью Django и Bootstrap

Введение

В этом руководстве мы рассмотрим, как создать генератор QR-кодов с помощью Django и Bootstrap. QR-коды становятся все более популярными для различных применений, таких как обмен ссылками, контактной информацией или деталями продукта. К концу этого урока у вас будет полнофункциональное веб-приложение, которое позволит пользователям генерировать QR-коды из текста или ссылок.

https://t.me/data_analysis_ml – Дата-саенс на Python наш телеграм канал!

Предварительные условия

Чтобы следовать этому руководству, вы должны обладать базовыми знаниями Python, Django и HTML/CSS. Убедитесь, что на вашей машине установлены Python и Django.

Настройка проекта Django

  • Начните с создания нового проекта Django под названием “qrgen”: django-admin startproject qrgen.
  • Создайте новое приложение Django с именем “qr”: python manage.py startapp qr.
  • Откройте файл settings.py в директории проекта и добавьте приложение “qr” в список INSTALLED_APPS.

Создание генератора QR-кодов

1) В файле views.py внутри приложения “qr” определите функцию index. Эта функция будет обрабатывать рендеринг страницы генератора QR-кода и саму генерацию QR-кода.

2) Внутри функции index обработайте HTTP POST запрос, проверив, была ли отправлена форма. Получите текст ввода из формы и сгенерируйте соответствующий QR-код с помощью библиотеки qrcode.

from django.shortcuts import render import qrcode from PIL import Image from io import BytesIO import base64 def index(request): context = {} if request.method == "POST": qr_text = request.POST.get("qr_text", "") qr_image = qrcode.make(qr_text, box_size=15) qr_image_pil = qr_image.get_image() stream = BytesIO() qr_image_pil.save(stream, format='PNG') qr_image_data = stream.getvalue() qr_image_base64 = base64.b64encode(qr_image_data).decode('utf-8') context['qr_image_base64'] = qr_image_base64 context['variable'] = qr_text return render(request, 'index.html', context=context)

3) Преобразуйте сгенерированное изображение QR-кода в base64-кодированную строку и передайте ее в качестве контекстной переменной в шаблон.

4) Создайте новый HTML-шаблон с именем index.html в каталоге templates. Этот шаблон будет определять структуру и расположение страницы генератора QR-кодов.

5) Настройте шаблон, добавив заголовок, форму ввода и секцию отображения QR-кода на основе Bootstrap. Примените соответствующие стили, чтобы сделать страницу визуально привлекательной.

6) Добавьте функции JavaScript для обработки функций загрузки и обмена QR-кодами. Функция downloadQR создает ссылку для загрузки изображения QR-кода, а функция shareQR делится QR-кодом с помощью Web Share API, если поддерживается, или открывает его в новом окне в противном случае.

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>QR Code Generator</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6" crossorigin="anonymous"> <style> body { background-color: #4800a3; } .container { background-color: #1a0247; color: white; border-radius: 5%; padding: 3em; } .header { color: white; text-align: center; margin-top: 1em; margin-bottom: 1em; font-size: 34px; font-weight: bold; } .download-share-buttons { display: flex; justify-content: center; margin-top: 1em; } .download-share-buttons button { margin-right: 0.5em; } .py-2 { background-color: #1a0247; } </style> </head> <body> <header class="py-2"> <h1 class="header">QR Code Generator</h1> </header> <div class="container shadow" style="width: 800px; margin-top: 5em; padding: 3em"> <form method="post"> {% csrf_token %} <h3><center>Enter text/link to generate a QR code</center></h3> </br> <div class="input-group mb-3"> <span class="input-group-text" id="inputGroup-sizing-default">Text/Link:</span> <input type="text" class="form-control" aria-describedby="inputGroup-sizing-default" name="qr_text" autofocus> </div> <div class="input-group mb-3"> <input type="submit" style="max-width: 200px; margin: auto" class="form-control"> </div> </form> {% if qr_image_base64 %} <h4><center>QR for {{ variable }} is:</center></h4></br> {% endif %} <div class="input-group mb-3"> <div style="margin: auto"> {% if qr_image_base64 %} <img src="data:image/png;base64,{{ qr_image_base64 }}" alt="QR Code"> <div class="download-share-buttons"> <button class="btn btn-primary" onclick="downloadQR()">Download</button> <button class="btn btn-primary" onclick="shareQR()">Share</button> </div> {% endif %} </div> </div> </div> <script> function downloadQR() { const link = document.createElement('a'); link.href = 'data:image/png;base64,{{ qr_image_base64 }}'; link.download = 'qr_code.png'; link.click(); } function shareQR() { const dataUrl = 'data:image/png;base64,{{ qr_image_base64 }}'; if (navigator.share) { navigator.share({ title: 'QR Code', text: 'Check out this QR Code', url: dataUrl }) .then(() => console.log('Shared successfully')) .catch((error) => console.log('Error sharing:', error)); } else { const newWindow = window.open(dataUrl); if (!newWindow) { alert('Pop-up blocked. Please allow pop-ups for this website and try again.'); } } } </script> </body> </html>

7) Наконец, определите шаблон URL для представления index в файле urls.py в каталоге проекта.

#qr\urls.py from django.urls import path from qr import views urlpatterns = [ path('', views.index) ]

Заключение

Поздравляем! Вы успешно создали генератор QR-кодов с помощью Django и Bootstrap. Теперь пользователи могут генерировать QR-коды, вводя текст или ссылки, а сгенерированные QR-коды можно скачивать или передавать. Этот проект может быть усовершенствован путем добавления дополнительных функций, таких как настройка дизайна QR-кода или интеграция его в более крупное веб-приложение.

Следующие шаги:

  • Реализуйте функцию сканирования QR-кодов с помощью библиотеки JavaScript, например QuaggaJS.
  • Добавьте обработку ошибок и валидацию формы ввода для улучшения пользовательского опыта.
  • Разверните генератор QR-кодов на платформе хостинга, например Heroku или AWS, для публичного доступа.
Начать дискуссию
\n\n","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

7) Наконец, определите шаблон URL для представления index в файле urls.py в каталоге проекта.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#qr\\urls.py\nfrom django.urls import path\nfrom qr import views\nurlpatterns = [\n path('', views.index)\n]","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Заключение"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Поздравляем! Вы успешно создали генератор QR-кодов с помощью Django и Bootstrap. Теперь пользователи могут генерировать QR-коды, вводя текст или ссылки, а сгенерированные QR-коды можно скачивать или передавать. Этот проект может быть усовершенствован путем добавления дополнительных функций, таких как настройка дизайна QR-кода или интеграция его в более крупное веб-приложение.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Следующие шаги:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Реализуйте функцию сканирования QR-кодов с помощью библиотеки JavaScript, например QuaggaJS.","Добавьте обработку ошибок и валидацию формы ввода для улучшения пользовательского опыта.","Разверните генератор QR-кодов на платформе хостинга, например Heroku или AWS, для публичного доступа."],"type":"UL"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":0,"reposts":0,"views":103,"hits":613,"reads":null,"online":0},"dateFavorite":0,"hitsCount":613,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id1389654/745449-python-uroki-pishem-generatra-qr-kodov-s-pomoshyu-django-i-bootstrap","author":{"id":1389654,"name":"Machine learning","nickname":null,"description":"Самая актуальная информация из мира ИТ, мл, нейронных сетей, t.me/ai_machinelearning_big_data","uri":"","avatar":{"type":"image","data":{"uuid":"a78c7151-4c19-5bca-9f1e-9857305ee8e1","width":640,"height":640,"size":32754,"type":"jpg","color":"043b54","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"a78c7151-4c19-5bca-9f1e-9857305ee8e1","width":640,"height":640,"size":32754,"type":"jpg","color":"043b54","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4062297,"userId":1389654,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4062297"}],"lastModificationDate":1764925224,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":1389654,"name":"Machine learning","nickname":null,"description":"Самая актуальная информация из мира ИТ, мл, нейронных сетей, t.me/ai_machinelearning_big_data","uri":"","avatar":{"type":"image","data":{"uuid":"a78c7151-4c19-5bca-9f1e-9857305ee8e1","width":640,"height":640,"size":32754,"type":"jpg","color":"043b54","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"a78c7151-4c19-5bca-9f1e-9857305ee8e1","width":640,"height":640,"size":32754,"type":"jpg","color":"043b54","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4062297,"userId":1389654,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4062297"}],"lastModificationDate":1764925224,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null,"keywords":["qr","4800a3","1a0247"],"media":{"type":"image","data":{"uuid":"27d9b8dc-b680-57a5-805d-56a853db4484","width":1644,"height":882,"size":605011,"type":"png","color":"3a309e","hash":"","external_service":[]}},"customCover":null,"robotsTag":"noindex","categories":[],"isAnonymized":true}};