Wróć do case study

Własny generator kodów QR w Pythonie

Wstęp: Po co to robimy?

Zamiast korzystać z zewnętrznych generatorów QR, postawiliśmy własne, surowe narzędzie. Wykorzystaliśmy do tego Pythona (Flask) oraz Reverse Proxy, aby ukryć port aplikacji przed światem.

0. - BiedaHosting

Hosting kosztuje 15 PLN na rok i powinien wystarczyć do tego zastosowania. Jeżeli planujesz większe pliki - wybierz większy pakiet

1. Przygotowanie środowiska

Logujemy się przez SSH na serwer i instalujemy niezbędne biblioteki. Wystarczą dwie komendy:

python3 -m pip install --user Flask qrcode[pil]

2. Kod aplikacji (Python)

Tworzymy plik qr_app.py. Kluczowym rozwiązaniem jest generowanie obrazka bezpośrednio do pamięci (BytesIO) i wysyłanie go jako Base64. Dzięki temu serwer nie musi zapisywać żadnych plików na dysku (oszczędzamy I/O).

<code>
from flask import Flask, render_template_string, request, send_file
import qrcode
from io import BytesIO

app = Flask(__name__)

HTML_TEMPLATE = """
<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>BIEDA-QR: Generator Biedahosting.pl</title>
    
</head>
<body>
  
        <h1>[ BIEDA-QR GENERATOR v0.1 ]</h1>
        <p>Wpisz tekst lub URL, aby wygenerowa~G kod QR.</p>
      <p>Zero reklam. Czysty prestiż Biedahostingu.</p>
      <p><form method="POST">
            <input type="text" name="data" placeholder="https://..." required>
            <button type="submit">GENERUJ</button>
        </form></p>
      <p>{% if qr_base64 %}</p>
      <h2>Twój Kod QR:</h2>
      <p>Kliknij prawym -> "Zapisz grafikę jako...", żeby pobrać.</p>
      <p>{% endif %}</p>
      <p>Powered by <a href="../index.html">Biedahosting.pl</a> - Hosting dla kumatych (15 PLN/rok).</p>
      <p></body>
</html>
"""
import base64</p>
      <p>@app.route("/", methods=["GET", "POST"])
def index():
    qr_base64 = None
    if request.method == "POST":
        data = request.form.get("data")
        if data:
            # --- GENEROWANIE KODU QR ---
            qr = qrcode.QRCode(version=1, box_size=10, border=4)
            qr.add_data(data)
            qr.make(fit=True)
            img = qr.make_image(fill_color="black", back_color="white")</p>
      <p># --- KONWERSJA DO BASE64 (aby wyswietlic na stronie bez zapisywania pliku) ---
            buffered = BytesIO()
            img.save(buffered, format="PNG")
            qr_base64 = base64.b64encode(buffered.getvalue()).decode('utf-8')</p>
      <p>return render_template_string(HTML_TEMPLATE, qr_base64=qr_base64)</p>
      <p>if __name__ == "__main__":
    # UWAGA: Na produkcji używa sie gunicorn, ale do testów i Biedahostingu to wystarczy.
    # Ustaw port, który udostepni Ci Admin (jezeli nie 5000).
    app.run(host='127.0.0.1', port=5000)
        </code>

3. Magia Reverse Proxy (.htaccess)

To najważniejszy krok. Aby aplikacja była dostępna pod adresem TwojaDomena.pl/qr/ zamiast TwojaDomena.pl:5000, w pustym folderze /qr/ tworzymy plik .htaccess:


RewriteEngine On
RewriteRule ^(.*)$ http://127.0.0.1:5000/$1 [P,L]
        

4. Uruchomienie

Aby uruchomić skrypt używamy komendy python3 qr_app.py Otrzymyjemy informacje żeby nie robić tak produkcyjnie, więc pewnie nie należy tak robic produkcyjnie.

5. Sprawdzenie

Wchodzimy na twojadomena.pl/qr i sprawdzamy nasz generator

6. Uwaga, bardzo ważne

W biedahostingu staramy zachować sie minumum bezpieczeństwa. Tak wystawiony port będize dostępny dla każdego posaidającego konto na serwerze. Pamiętaj o tym podczas wystawiania skryptów!!! Nie wystawiaj wrażliwych danych, dbaj o odpowiednie zabezpieczenie kodu.

Podsumowanie: W jeden wieczór, postawiliśmy działający mikroserwis. To idealny przykład na to, jak wykorzystać "bieda-zasoby" do ambitnych celów programistycznych.

Więcej takich case'ów znajdziesz na: Biedahosting.pl

Chcę przetestować