Rozdział 22 · Tworzenie stron internetowych z Python

Pierwsza aplikacja webowa na Flask

Flask — lekki framework webowy do tworzenia aplikacji webowych w Python.

Flask jest lekkim frameworkiem webowym do tworzenia aplikacji webowych w tym języku Python. Zapewnia routing, obiekty żądań i odpowiedzi, pracując z szablonami Jinja oraz innych podstawowych narzędzi wymaganych przez aplikację serwerową. Sam Flask nie akceptuje Bezpośrednie połączenia sieciowe – obsługiwane przez osobny serwer (Rozdział 22.19 to wyjaśnia granicy w bardziej szczegółowym zakresie); podczas lokalnego działania Flask tymczasowo przejmuje tę rolę poprzez Wbudowany Werkzeug. instalacja serwera deweloperskiego — jak każda biblioteka:

terminal.txt
pip install flask

Najmniejszy Flask-app

app_minimal.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def glavnaya():
    return „Witaj, świecie!”

if __name__ == "__main__":
    app.run(debug=True)
@app.route(„/”
Linia powyżej funkcji to dekorator. @app.route("/") rejestruje trasę: łączy adres / z funkcją glavnaya(), który obsługuje zapytanie na ten adres i generuje odpowiedź. Ten mechanizm jest szczegółowo omówiony w sekcji 22.11.

Szablony – HTML z wyrażeniami Jinja

Zwracanie HTML bezpośrednio jako łańcuch znaków w Python jest niewygodne. Flask używa silnika szablonowego Jinja (sekcja 22.12 omawia go szczegółowo) — to osobny język szablonów ze swoją składnią: zwykły plik HTML-, do którego można wstawiać wyrażenia i konstrukcje sterujące Jinja w nawiasach klamrowych {{ }}:

templates/index.html
<h1>Мой список задач</h1>
<ul>
  {% for zadacha in zadachi %}
    <li>{{ zadacha }}</li>
  {% endfor %}
</ul>
app.py
from flask import Flask, render_template

app = Flask(__name__)
zadachi = [„Naucz się podstaw Python”, „Zbudować stronę na Flask”]

@app.route("/")
def glavnaya():
    return render_template("index.html", zadachi=zadachi)

Adresy dynamiczne

Część adresu można zamienić w parametr trasowania — Flask przekazuje jego wartość jako argument funkcji-obslugi:

dinamicheskij_marshrut.py
@app.route("/privet/<imya>")
def privet(imya):
    return render_template("privet.html", imya=imya)
/privet/sergey → imya = „Sergey”
Otwierając adres w przeglądarce /privet/Сергейwejdziesz do imya linia "Сергей" to część adresu Flask przekazuje funkcji obsługiwającej jako argument.
Strona przeglądarki: nagłówek "Hey Ada!" oraz link "Powrót do listy zadań"
Projekt końcowy wykorzystuje tę ścieżkę: adres /privet/A w przeglądarce, a Flask zastępuje nazwę z URL do szablonu.

Akceptuj dane z formularza

Aby użytkownik mógł coś wysłać na serwer (np. dodać zadanie), używana jest forma HTML- i trasa przyjmująca metodę POST (dlaczego POST, a nie GET znajduje się w sekcji 22.13):

dobavlenie.py
from flask import request, redirect, url_for

@app.route("/dobavit", methods=["POST"])
def dobavit():
    novaya_zadacha = request.form.get("zadacha", "").strip()
    if novaya_zadacha:
        zadachi.append(novaya_zadacha)
    return redirect(url_for("glavnaya"))

Ministrona z gotową listą zadań

Trasy, szablony, formularz i statyczny plik CSS z tej sekcji zostały zebrane w gotową mini-stronę „Lista zadań”:

projects/flask/todo-app/app.py

Uruchom stronę internetową na swojej stronie
python app.py w terminalu wewnątrz projects/flask/todo-app/, następnie otwórz http://127.0.0.1:5000/ w przeglądarce. W ten sposób uruchamia się serwer deweloperski; czym różni się od środowiska produkcyjnego — w sekcji 22.34.

Obecnie zadania są przechowywane w zwykłej liście Python i znikają po ponownym uruchomieniu programu — dlaczego to problem, wyjaśnia rozdział 22.20, a rozdziały 22.20-22.29 stopniowo zastąpią lista bazą danych SQLite.

★★ Zadanie samodzielne
Licznik zadań

Dodaj wiersz do index.html pokazujący łączną liczbę zadań: {{ zadachi| length }}.

Challenge
Usuwanie zadania

Dodaj trasę /udalit/<int:indeks>, która usuwa zadanie według jego numeru w liście i przekierowuje na stronę główną.

Praktyka: trasy, szablony i formy
Moduł flask nie jest zainstalowany w środowisku przeglądarki Pyodide – działa lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →