Как развернуть сервер на Flask: пошаговое руководство

Как развернуть сервер на Flask: пошаговое руководство

Flask — это популярный фреймворк для создания веб-приложений на языке Python. Он прост в использовании и идеально подходит для быстрого прототипирования и разработки минимально жизнеспособных продуктов. В этой статье мы расскажем, как развернуть сервер на Flask, создавая простую программу с рендерингом шаблонов и передачей данных в них. Также обсудим распространенные ошибки, с которыми могут столкнуться новички.


Содержание:

  1. Установка
  2. Простое приложение
  3. Структура простая
  4. Структура "фабрика"
  5. Запуск
  6. Ошибки и их решение

 

1. Установка Flask

Для начала, вам потребуется установить Flask. Это можно сделать с помощью менеджера пакетов Python - pip. Выполните следующую команду в терминале:

pip install Flask

После завершения установки вы можете проверить, что Flask установлен, выполнив:

pip show Flask

2. Создание простого приложения Flask

2.1 Структура проекта

Создайте папку для вашего проекта, например, flask_app. Внутри создайте файл app.py, а также папку templates для хранения ваших HTML-шаблонов.

Упрощенная структура для большинства проектов выглядит так:

flask_app/
 - app.py
 - templates
 -- index.html

 

Гибкая и масштабируемая структура где используется функция-фабрика:

flask_app/
│
├── app/
│   ├── __init__.py
│   ├── views.py
│   ├── models.py
│   ├── static/
│   └── templates/
│       └── index.html
│
├── config.py
└── run.py

 

Описание структуры:

  • flask_app/: Корневая директория проекта.​
  • app/: Пакет приложения, содержащий основные модули и ресурсы.​
    • __init__.py: Инициализирует приложение Flask с помощью функции-фабрики.​
    • views.py: Определяет маршруты и функции представления.​
    • models.py: Содержит модели базы данных.​
    • static/: Директория для статических файлов (CSS, JS, изображения).​
    • templates/: Директория для HTML-шаблонов.​
      • index.html: Главная страница приложения.
  • config.py: Файл конфигурации приложения.​
  • run.py: Точка входа для запуска приложения.​

 

Пример config.py:

import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'your_secret_key'
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
        'sqlite:///' + os.path.join(os.path.abspath(os.path.dirname(__file__)), 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False

 

Пример app/__init__.py с функцией-фабрикой:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from config import Config

db = SQLAlchemy()
migrate = Migrate()

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    db.init_app(app)
    migrate.init_app(app, db)

    from app import views, models

    return app

 

Пример run.py:

from app import create_app

app = create_app()

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

 

2.2 Основной код приложения

Если вы создаете простое приложение с простой структурой, то код ниж вам подойдет. В другом случае воспользуйтесь примерами выше с "фабрикой".

Теперь откройте файл app.py и добавьте следующий код:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def home():
    title = "Привет, Flask!"
    message = "Это простое приложение на Flask."
    return render_template('index.html', title=title, message=message)

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

Что делает return в данном случае:

  • "Рендерит" шаблон index.html.
  • Передает в шаблон две переменные title и message

@app.route('/') - это декоратор. "/" означает что сайт будет доступен по адресу "site.com".

Если вы указываете myapp = Flask(__name__)

то в декораторе будет @myapp.route('/')

 

2.3 Создание шаблона

Теперь создайте файл index.html внутри папки templates и добавьте следующий HTML-код:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <h1>{{ title }}</h1>
    <p>{{ message }}</p>
</body>
</html>

Код в этом файле использует синтаксис Jinja2 для отображения переданных данных.

Переменные в шаблоне отображаются - {{ }}

В Jinja2 доступны также:

  • Списки
  • Условные выражения
  • Циклы
  • и тд

3. Запуск приложения

Чтобы запустить приложение, выполните команду в консоле:

python app.py

Теперь вы можете открыть веб-браузер и перейти по адресу http://127.0.0.1:5000/, чтобы увидеть ваше приложение.

Кроме консоли скрипт можно запустить обычным стартом программы через кнопку "запуск".

4. Популярные ошибки и их решения

При разработке приложений на Flask новички часто допускают ряд распространённых ошибок. Рассмотрим некоторые из них с примерами и способами их предотвращения.

1. Отсутствие виртуального окружения

Ошибка: Установка Flask и других зависимостей глобально, что может привести к конфликтам между пакетами в разных проектах.

Пример:

pip install flask

Решение:

Создавайте и активируйте виртуальное окружение для каждого проекта:

python -m venv env
source env/bin/activate  # Для Windows: env\Scripts\activate

 

2. Игнорирование обработки ошибок

Ошибка: Отсутствие обработки исключений, что может привести к падению приложения при возникновении ошибок.

Пример:

@app.route('/divide')
def divide():
    a = int(request.args.get('a'))
    b = int(request.args.get('b'))
    return str(a / b)

Если b равен нулю, произойдёт ошибка деления на ноль.

Решение:

Обрабатывайте возможные исключения:

@app.route('/divide')
def divide():
    try:
        a = int(request.args.get('a'))
        b = int(request.args.get('b'))
        return str(a / b)
    except ZeroDivisionError:
        return "Ошибка: деление на ноль запрещено."

 

3. Хранение конфиденциальных данных в коде

Ошибка: Жёсткое кодирование секретных ключей и паролей в исходном коде.

Пример:

app.config['SECRET_KEY'] = 'mysecretkey'

 

Решение:

Используйте переменные окружения для хранения конфиденциальных данных:

import os
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')

 

4. Отсутствие защиты от CSRF-атак

Ошибка: Неиспользование токенов CSRF при обработке форм, что делает приложение уязвимым для CSRF-атак.

Решение:

Используйте расширение Flask-WTF, которое автоматически добавляет защиту от CSRF:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField

class MyForm(FlaskForm):
    name = StringField('Name')
    submit = SubmitField('Submit')

 

5. Неправильная структура проекта

Ошибка: Размещение всего кода в одном файле, что затрудняет поддержку и масштабирование приложения.

Решение:

Организуйте проект с использованием функции-фабрики и модулярной структуры, как описано ранее.

6. Отсутствие обработки статических файлов

Ошибка: Некорректная настройка обработки статических файлов, что приводит к ошибкам при их загрузке.

Решение:

Убедитесь, что статические файлы размещены в папке static, и Flask настроен на их обслуживание:

app = Flask(__name__, static_folder='static')

 

7. Использование отладочного режима в продакшене

Ошибка: Запуск приложения с включённым режимом отладки на боевом сервере, что может раскрыть внутреннюю информацию об ошибках.

Решение:

Убедитесь, что режим отладки отключён в продакшене:

if __name__ == '__main__':
    app.run(debug=False)

 

Избегая этих распространённых ошибок, вы сможете создать более надёжное и безопасное приложение на Flask.

 

Избегая этих распространённых ошибок, вы сможете создать более надёжное и безопасное приложение на Flask.

5. Заключение

Создание сервера на Flask — это простой и увлекательный процесс. Надеемся, что это руководство помогло вам освоить базовые принципы работы с Flask, а также рендеринг шаблонов и передачу данных. Ошибки неизбежны, но важно не бояться их, а учиться на каждом шаге. Удачи в разработке!

Автор: Евгений Цветков

Читайте также

Ошибки новичков в написании программы на Python

Ошибки новичков в написании программы на Python

Python — это один из самых популярных языков программирования, который используется как новичками, так и профессио...

Читать далее

Основы Flask: что это и для чего он нужен

Основы Flask: что это и для чего он нужен

Flask — это легковесный и мощный веб-фреймворк на языке Python, который позволяет создавать желаемые приложения вс...

Читать далее

Еврокомиссия одобрила покупку Run:ai Nvidia

Еврокомиссия одобрила покупку Run:ai Nvidia

Европейская комиссия одобрила без условий приобретение израильского стартапа Run:ai компанией Nvidia за $700 милли...

Читать далее

Rust - язык программирования будущего

Rust - язык программирования будущего

Rust — это современный язык программирования, который стремительно набирает популярность благодаря своей безопасно...

Читать далее

Облачные платформы для ИИ: плюсы, минусы и возможности

Облачные платформы для ИИ: плюсы, минусы и возможности

Облачные платформы для разработки и поддержки ИИ-решений стремительно завоевывают популярность в мире технологий. ...

Читать далее

Защита приватности в эпоху ИИ: вызовы и перспективы

Защита приватности в эпоху ИИ: вызовы и перспективы

С каждым днём технологии всё глубже проникают в нашу жизнь, и среди них искусственный интеллект (ИИ) становится вс...

Читать далее