Topic 2 of 6

Course materials are currently available in Russian only.

Маршруты и ответы

Flask — небольшой веб-фреймворк: сайт на нём умещается в один файл, и весь код можно понять целиком. На Flask делают сайты, API для мобильных приложений и панели управления.

В курсе вы соберёте сайт-визитку: страницы, шаблоны, форму обратной связи, JSON-API и вход для владельца.

Минимальный сайт

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return "Привет! Это мой сайт."


if __name__ == "__main__":
    app.run(debug=True)

Запустите файл и откройте в браузере http://127.0.0.1:5000/. debug=True перезапускает сервер при каждом сохранении файла и показывает подробные ошибки (только для разработки!). Остановить сервер — Ctrl+C или кнопка «Стоп».

  • app = Flask(__name__) — само приложение.
  • @app.route("/") связывает адрес с функцией. Такая функция называется представлением (view).
  • Что представление вернёт — то браузер и получит.

Переменные в адресе

@app.route("/user/<name>")
def user(name):
    return f"Страница {name}"


@app.route("/post/<int:pid>")
def post(pid):          # pid — уже число
    return f"Пост №{pid}"

Части адреса в угловых скобках становятся аргументами функции. Конвертеры: без конвертера — строка без /, int — неотрицательное целое, float, path — строка вместе с /. Если адрес не подходит (/post/abc), Flask сам отвечает 404.

Коды ответа

Каждый ответ сервера несёт код: 200 — всё хорошо, 302 — перенаправление, 400 — неверный запрос, 404 — не найдено, 405 — метод не разрешён, 500 — ошибка в коде сервера.

from flask import abort


@app.route("/age/<int:age>")
def age(age):
    if age > 150:
        return "Так долго не живут", 400   # текст и код
    if age == 0:
        abort(404)                         # прервать и отдать страницу 404
    return f"Вам {age}"

Если в представлении случится исключение (например, деление на ноль), посетитель увидит 500. Хорошее приложение проверяет входные данные и отвечает понятной ошибкой 400.

Представление должно вернуть строку (или HTML, JSON, кортеж «текст, код»). Число вернуть нельзя — превратите его в строку: return str(total).

Тест-клиент

Чтобы проверить сайт, не нужен браузер:

client = app.test_client()
r = client.get("/age/200")
print(r.status_code)              # 400
print(r.get_data(as_text=True))   # Так долго не живут

Так проверяются все задачи курса. Программа запускает сервер только под if __name__ == "__main__": — при проверке он не стартует, а «Запустить у себя» поднимает настоящий сервер, и сайт можно открыть в браузере.

Итог

  • Flask(__name__), @app.route, app.run(debug=True);
  • переменные в адресе и конвертеры int, float, path;
  • кортеж (текст, код) и abort(код); 200, 400, 404, 500;
  • app.test_client() — проверка без браузера.