Архив метки: flask

Как создать базу данных во Flask: подробный гайд

Создание баз данных во Flask: подробный гайд

Flask – один из самых популярных веб-фреймворков на Python. С его помощью легко и быстро создать функциональное приложение на любую тему. Одним из неотъемлемых аспектов разработки приложений является работа с базами данных. Базы данных нужны для хранения информации: от простых данных пользователей до сложных структур информации. Создание баз данных в Flask происходит при помощи расширений. Расширения Flask работают на основе SQLAlchemy, которая является мощным SQL-ориентированным инструментом для Python.

Данный гайд содержит все необходимые шаги для создания базы данных в Flask. Вы узнаете, как настроить окружение разработки, установить необходимые расширения, описать модели базы данных и запустить проект. Шаг за шагом вы создадите простой web-проект, который использует базу данных для хранения информации. Этот гайд рассчитан на разработчиков, кто хочет углубить свои знания в Flask, SQLAlchemy и базы данных в целом.

Установка необходимых библиотек

Перед началом создания баз данных во Flask, необходимо установить несколько библиотек:

  • Flask: основной фреймворк, который мы будем использовать в нашей работе;
  • SQLAlchemy: библиотека для работы с базами данных, совместимая с различными типами баз данных;
  • Flask-SQLAlchemy: расширение Flask для интеграции SQLAlchemy во Flask-приложения;
  • Flask-Migrate: расширение для миграции баз данных, которое предоставляет удобный интерфейс для изменения структуры базы данных;
  • psycopg2: библиотека для работы с PostgreSQL, которую мы будем использовать в этом гайде.

Чтобы установить эти библиотеки, необходимо воспользоваться менеджером пакетов Pip. Перед установкой библиотек, необходимо убедиться, что у вас установлен Python и Pip.

Чтобы установить Flask, SQLAlchemy и Flask-SQLAlchemy, выполните следующую команду:

pip install flask sqlalchemy flask-sqlalchemy

Чтобы установить Flask-Migrate, выполните следующую команду:

pip install flask-migrate

Чтобы установить psycopg2, выполните следующую команду (для Windows):

pip install psycopg2-binary

Для Linux и macOS:

pip install psycopg2

Установка Flask

Установка и настройка фреймворка Flask требует выполнения нескольких простых шагов:

  1. Убедитесь, что на вашем компьютере установлен Python версии 2.7 или 3.6 и выше.
  2. Создайте виртуальное окружение для Flask с помощью утилиты virtualenv. Для этого выполните в командной строке команду:

python -m venv myenv

где myenv – имя вашего виртуального окружения.

  1. Активируйте виртуальное окружение. Для этого выполните команду:

source myenv/bin/activate

  1. Выполните установку Flask с помощью утилиты pip. Для этого введите следующую команду:

pip install Flask

Данный пакет можно установить и другими способами, например, через пакетный менеджер в вашей операционной системе. Однако установка с помощью pip является наиболее удобным способом и позволяет быстро получить доступ к последней версии фреймворка.

Установка SQLAlchemy

SQLAlchemy представляет собой надежный инструмент для работы с базами данных в Flask. Он позволяет создавать и изменять базы данных MySQL, PostgreSQL, SQLite, Microsoft SQL и другие.

Для установки SQLAlchemy необходимо открыть командную строку и выполнить следующую команду:

pip install SQLAlchemy

Данная команда установит библиотеку SQLAlchemy и все ее зависимости.

Подключение SQLAlchemy к Flask происходит следующим образом:

from flask import Flask

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'

db = SQLAlchemy(app)

В данном примере мы импортируем необходимые библиотеки, создаем объект конфигурации Flask, указываем URI нашей базы данных (в данном случае SQLite) и создаем экземпляр SQLAlchemy. Готово, теперь можно начинать работу с базой данных!

Создание модели базы данных

Перед тем как начать создавать модель базы данных, необходимо определиться с ее структурой и атрибутами. Модель базы данных представляет собой описание сущностей, их свойств и отношений между ними. Для создания модели базы данных в Flask очень удобно использовать ORM – объектно-реляционное отображение. Flask предоставляет несколько ORM библиотек, одной из самых популярных является SQLAlchemy.

Для создания модели базы данных в Flask с помощью SQLAlchemy необходимо создать классы, отображающие таблицы базы данных. Эти классы наследуются от базового класса Model и имеют атрибуты, соответствующие полям таблицы. Каждый атрибут имеет тип данных и может иметь различные ограничения.

Например, если у нас есть таблица пользователей, то соответствующий класс будет выглядеть примерно так:

АтрибутТипОписание
idIntegerУникальный идентификатор пользователя
usernameStringИмя пользователя
emailStringEmail адрес пользователя
passwordStringХеш пароля пользователя

Класс может выглядеть примерно так:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):

__tablename__ = 'users'

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(80), unique=True, nullable=False)

email = db.Column(db.String(120), unique=True, nullable=False)

password = db.Column(db.String(128), nullable=False)

В данном примере мы определили класс User, который наследуется от базового класса Model и имеет атрибуты id, username, email и password, соответствующие полям таблицы базы данных. Также мы задали различные ограничения для этих атрибутов, например, указали, что поля username и email должны быть уникальными и не могут содержать пустые значения.

После того, как мы определили модель базы данных, необходимо создать соответствующую таблицу в базе данных. Для этого можно воспользоваться методом create_all() объекта db:

from flask import Flask

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'

db = SQLAlchemy(app)

if __name__ == '__main__':

db.create_all()

app.run()

В данном примере мы создали экземпляр приложения Flask и определили параметры подключения к базе данных. Затем мы вызвали метод create_all() для объекта db, который создаст все таблицы, определенные в модели базы данных. Затем мы запускаем приложение.

Определение классов модели

Перед тем, как начать создание базы данных, необходимо определить классы модели, которые будут отображаться в таблицах базы данных. Каждый класс модели соответствует одной таблице в базе данных.

При определении класса модели следует задать его поля и их типы данных. Например, класс модели “Пользователь” может содержать поля “Имя”, “Фамилия”, “Адрес электронной почты” и “Пароль”. Типы данных могут быть различными, например, строковые, целочисленные, даты и т.д.

Также следует определить связи между классами модели, если они есть. Например, класс модели “Заказ” может иметь связь с классом модели “Пользователь”, когда каждый заказ отображается вместе с информацией о соответствующем заказчике.

  • Пример определения класса модели:
Класс моделиПоляТипы данных
ПользовательИмя
Фамилия
Адрес электронной почты
Пароль
Строка
Строка
Строка
Строка
ЗаказНомер заказа
Дата заказа
Имя заказчика
Телефон заказчика
Адрес заказчика
Целое число
Дата
Строка
Строка
Строка

Определение отношений между таблицами

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

Существует три типа отношений между таблицами:

  • Один к одному – каждой записи из таблицы A соответствует одна запись в таблице B и наоборот. Это отношение создается, когда информация разделена на две разные таблицы для удобства использования.
  • Один ко многим – каждой записи из таблицы A может соответствовать несколько записей в таблице B, но каждой записи из таблицы B соответствует только одна запись из таблицы A. Это типичное отношение для таблиц, связанных с помощью уникальных идентификаторов.
  • Многие к многим – каждой записи из таблицы A может соответствовать несколько записей в таблице B и наоборот. Для реализации этого типа отношений необходимо использовать дополнительную таблицу, которая будет связывать записи двух таблиц.

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

Во Flask для создания связей между таблицами могут использоваться различные библиотеки, такие как SQLAlchemy и Flask-SQLAlchemy. С их помощью можно создавать отношения между таблицами и работать с базой данных в Python.

Создание базы данных

Создание базы данных – это один из важнейших этапов в разработке программного продукта, особенно если речь идет о веб-приложении. Flask предоставляет удобный инструментарий для работы с базами данных. Существует несколько наиболее распространенных способов создания баз данных в Flask:

  • SQLAlchemy – это удобный ORM-фреймворк, который предоставляет инструменты для работы с реляционными базами данных. SQLAlchemy позволяет не только создавать базы данных, но и работать с данными в более удобном виде, через объекты и методы.
  • Flask-MySQL – это расширение, которое позволяет работать с MySQL базами данных в Flask. Flask-MySQL предоставляет удобные методы для создания и управления таблицами в базе данных.
  • Flask-SQLite3 – это расширение, которое облегчает работу с SQLite3 базами данных. Flask-SQLite3 предоставляет удобный интерфейс для создания баз данных и таблиц, а также для выполнения SQL запросов.

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

Важно помнить, что создание базы данных – это только начало работы с ней. Для работы с данными в базе необходимо создавать таблицы, индексы, добавлять данные и т.д. Flask предоставляет удобные инструменты для всех этих задач, но требуется глубокое понимание используемой базы данных и желание учиться новому.

Независимо от выбранного метода создания базы данных, следует помнить об аспектах безопасности. Необходимо правильно настроить доступ к базе данных и защитить ее от несанкционированного доступа.

Использование команды flask db init

Команда flask db init очень важна при создании баз данных в Flask. Эта команда используется для инициализации миграций базы данных.

Инициализация миграций происходит в момент создания базы данных. Когда вы запускаете команду flask db init, Flask создаст папку миграций, которая будет содержать все ваше миграционное содержимое базы данных. Эта папка называется ‘migrations’ и она будет хранить в себе папки версий базы данных. Каждая папка версий будет содержать два файла: upgrade и downgrade.

Файл upgrade содержит инструкции для обновления базы данных до этой версии, а downgrade содержит инструкции для отката базы данных до предыдущей версии. Эти файлы обычно содержат SQL код, который задает изменения базы данных.

Когда вы создаете новую версию базы данных, вы начинаете с команды flask db migrate, которая генерирует файл миграции. Затем вы используете команду flask db upgrade для обновления базы данных до новой версии. Если что-то идет не так или вы хотите откатить базу данных, вы можете использовать команду flask db downgrade и вернуть базу данных к предыдущей версии.

Поэтому команда flask db init является первоначальной и необходимой командой при создании базы данных в Flask. Она инициализирует папку миграций и предоставляет вам начальную точку для создания новых миграций.

Применение миграций

Миграции представляют собой изменения структуры базы данных, которые могут быть применены к уже созданной базе данных. Подходящая библиотека для миграций в Flask – Flask-Migrate.

Для начала работы с Flask-Migrate необходимо установить библиотеку и настроить ее в приложении. Затем нужно создать файл миграций, указав команду:

python manage.py db init

Команда создаст директорию с названием “migrations”, где будут храниться все миграции в виде файлов Python.

Далее, создайте модели базы данных в приложении Flask и опишите необходимые изменения в моделях. Затем нужно сгенерировать миграцию:

python manage.py db migrate

Команда сгенерирует файл миграции в директории “migrations”, содержащий изменения, описанные в модели базы данных.

Когда миграция создана, можно ее применить к базе данных приложения:

python manage.py db upgrade

Команда применит все изменения из миграции к базе данных.

В случае, если нужно откатить миграцию, используйте команду:

python manage.py db downgrade

Команда отменит последнюю примененную миграцию и вернет базу данных к предыдущей версии.

При использовании миграций необходимо помнить, что они могут иметь ограничения в соответствии с типом базы данных (например, определенные типы данных могут не поддерживаться).

Интеграция базы данных в приложение

Теперь необходимо соединить базу данных с приложением Flask. Для этого в Flask существует множество библиотек, которые помогают работать с базами данных. Рассмотрим использование библиотеки SQLAlchemy.

SQLAlchemy – это библиотека для работы с базами данных, которая обладает мощными возможностями и является одной из самых популярных в Flask.

Для начала необходимо установить библиотеку, выполнить команду в терминале:

  1. pip install flask_sqlalchemy

После установки библиотеки можно приступать к созданию соединения с базой данных. Для этого необходимо в файле приложения импортировать библиотеку и создать объект приложения:

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'

db = SQLAlchemy(app)

В данном примере объект db является экземпляром класса SQLAlchemy. Он помогает создавать и изменять таблицы в базе данных.

Таким образом, выбрав подходящую библиотеку для работы с базой данных и создав соединение, можно легко интегрировать базу данных в приложение Flask и управлять ей.

Инициализация базы данных в приложении

Инициализация базы данных в приложении

При создании приложения Flask необходимо инициализировать базу данных. Обычно для этого используется расширение Flask SQLAlchemy. Прежде чем начать создание базы данных, необходимо установить и импортировать данное расширение.

Для инициализации базы данных в Flask SQLAlchemy необходимо создать экземпляр объекта класса SQLAlchemy:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

Где app – экземпляр класса Flask, который необходимо передать в качестве аргумента.

После инициализации SQLAlchemy можно создавать модели данных. Каждая модель является классом, который наследуется от класса SQLAlchemy.Model. Для создания таблицы в базе данных, необходимо определить поля модели:

class User(db.Model):

id = db.Column(db.Integer, primary_key=True)

name = db.Column(db.String(80), nullable=False)

email = db.Column(db.String(120), unique=True, nullable=False)

Создав модели данных, необходимо создать таблицы в базе данных с помощью метода create_all() экземпляра объекта db:

db.create_all()

Этот метод создаст все таблицы, определенные в моделях данных. В дальнейшем при изменении модели данных необходимо использовать миграции базы данных.

Инициализация базы данных в Flask SQLAlchemy является одной из первых задач при создании приложения. С ее помощью можно создавать сложные и эффективные системы управления данными.

Использование базы данных во views

Flask позволяет легко работать с базами данных, используя множество форматов. В данном гайде мы будем использовать SQLite, но вы можете использовать и другие форматы, такие как PostgreSQL, MySQL, MongoDB и др.

Во views мы можем использовать базу данных, как это обычно делается в других языках программирования. Например, мы можем получить данные из базы данных, отобразить их на странице и обновить данные в базе данных после отправки данных формы пользователем.

Чтобы использовать базу данных во views, нам необходимо создать объект базы данных и подключиться к базе данных внутри функции view. Мы можем использовать библиотеку sqlite3 для работы с базой данных SQLite и выполнить запросы на получение данных или обновление данных в базе. Например:

import sqlite3

# Создание объекта базы данных

conn = sqlite3.connect('mydatabase.db')

# Получение курсора базы данных

cursor = conn.cursor()

# Выполнение запроса на получение данных из таблицы

cursor.execute("SELECT * FROM users")

# Получение всех результатов запроса

rows = cursor.fetchall()

# Закрытие базы данных

conn.close()

Мы можем использовать полученные результаты для отображения на странице или для обработки их внутри функции view.

Таким образом, мы можем использовать базу данных во Flask для получения, отображения и обновления данных. Для более подробной информации о работе с базами данных в Flask вы можете обратиться к официальной документации Flask.

Работа с данными в базе данных

Для работы с данными в базе данных во Flask необходимо использовать специальную библиотеку SQLAlchemy. Она позволяет создавать, изменять и удалять данные, а также производить их выборку для дальнейшей обработки.

Основными объектами, используемыми в SQLAlchemy, являются модели данных. Они представляют собой классы, описывающие структуру таблиц в базе данных. Каждый класс соответствует отдельной таблице, а его атрибуты – столбцам этой таблицы.

Для создания новых записей в базе данных необходимо создать экземпляр модели, заполнить его необходимыми данными и вызвать метод add() объекта сессии. Метод commit() сохраняет изменения в базе данных.

Для выборки данных из базы данных необходимо создать объект запроса с помощью метода query() объекта сессии. Для фильтрации данных используются методы filter() и filter_by(). Для сортировки данных используется метод order_by(). Результатом запроса может быть одна или несколько записей.

Для изменения существующих записей необходимо выбрать их с помощью запроса, внести изменения и вызвать метод commit(). Для удаления записей необходимо выбрать их с помощью запроса и вызвать метод delete(). Метод commit() сохраняет изменения в базе данных.

Для обработки ошибок при работе с базой данных используются исключения ORM (Object-Relational Mapping), такие как IntegrityError, NoResultFound и др.

  • Работа с данными в базе данных во Flask происходит с помощью библиотеки SQLAlchemy.
  • Основными объектами SQLAlchemy являются модели данных, представляющие собой классы, описывающие структуру таблиц в базе данных.
  • Для создания новых записей необходимо создать экземпляр модели, заполнить его необходимыми данными и вызвать метод add(), а затем commit().
  • Для выборки данных из базы данных необходимо создать объект запроса с помощью метода query().
  • Для изменения и удаления существующих записей необходимо выбрать их с помощью запроса и вызвать соответствующие методы.
  • Для обработки ошибок используются исключения ORM.

Добавление данных в таблицы

Правильное добавление данных в таблицу – это важный этап в организации базы данных. Для добавления новых данных в таблицу можно воспользоваться командой SQL INSERT INTO.

Например, для добавления нового пользователя в таблицу ‘users’, можно использовать следующий код:

INSERT INTO users (name, age, email)

VALUES ('Иван', 25, 'ivan@example.com');

В данном коде мы указали названия столбцов, в которые добавляем данные, и соответствующие значения. Важно указать значения в том же порядке, как и названия столбцов.

Также можно добавлять несколько записей за раз:

INSERT INTO users (name, age, email)

VALUES ('Иван', 25, 'ivan@example.com'),

('Петр', 30, 'petr@example.com');

Для добавления данных в таблицу через Flask можно воспользоваться объектом db.session. Например, для добавления нового пользователя в таблицу ‘users’ с помощью модели User:

new_user = User(name='Иван', age=25, email='ivan@example.com')

db.session.add(new_user)

db.session.commit()

В данном коде мы создали новый экземпляр модели User с нужными значениями и добавили его в сессию базы данных. После этого необходимо сохранить изменения с помощью команды commit.

Также возможно добавление нескольких записей за раз с помощью цикла или списка экземпляров моделей:

users = [User(name='Иван', age=25, email='ivan@example.com'),

User(name='Петр', age=30, email='petr@example.com')]

for user in users:

db.session.add(user)

db.session.commit()

В данном примере мы создаем список экземпляров модели User, добавляем каждый экземпляр в сессию и сохраняем изменения.

Чтение данных из таблиц

Чтение данных из таблиц базы данных является одной из базовых операций в работе с ними. В Flask для осуществления этой операции необходимо выполнить запрос к базе данных и получить результат.

Для выполнения запроса в Flask используется объект cursor. Он возвращает результат запроса в виде объекта rows, содержащего данные из таблицы.

Пример чтения данных из таблицы:

  • Создать подключение к базе данных
  • Создать объект cursor с помощью метода cursor()
  • Выполнить запрос SELECT с помощью метода execute()
  • Получить результат запроса с помощью метода fetchall()
  • Обработать результат и вывести на страницу

Также возможно выполнить выборку определенных данных из таблицы по заданному условию, используя условный оператор в запросе.

ФункцияОписание
SELECTВыборка данных из таблицы
FROMОпределяет таблицу, из которой выбираются данные
WHEREОпределяет условие выборки

Запрос может содержать несколько условий, которые могут быть объединены с помощью операторов AND и OR.

В целом, чтение данных из таблиц является одной из ключевых задач при работе с базами данных в Flask. Она позволяет получать необходимые данные из таблиц и использовать их для дальнейших операций.

Обновление данных в таблицах

Обновление данных в таблицах

Одной из важных функций баз данных является обновление данных в таблицах. В процессе работы с приложением возникают ситуации, когда нужно внести изменения в уже имеющиеся данные. Для этого необходимо использовать оператор UPDATE.

Оператор UPDATE позволяет изменить значения в одной или нескольких строках таблицы. В запросе следует указать название таблицы, столбцы, которые нужно изменить, новые значения и условие, определяющее, где нужно производить изменения.

Пример запроса: UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition

  • table_name – название таблицы, в которой нужно изменить данные
  • column1 = value1, column2 = value2 – столбцы и новые значения, которые нужно обновить
  • WHERE – оператор, который позволяет задать условие, в соответствии с которым будут изменены данные
  • condition – условие, которое определяет, в каких строках изменяем данные

При работе с базами данных нужно быть осторожным, чтобы не потерять или испортить данные. Перед выполнением операции обновления рекомендуется создать резервную копию базы данных или выполнять изменения на тестовой версии базы данных.

Пример обновления данных в таблице “users”
IDNameSurnameAge
1MariaIvanova25
2IvanPetrov30
3PetrSidorov35

Допустим, нам нужно изменить возраст пользователя с ID=2 и установить ему новое значение – 32. Для этого нужно выполнить запрос:

UPDATE users SET Age = 32 WHERE ID = 2

Таблица “users” после изменения данных
IDNameSurnameAge
1MariaIvanova25
2IvanPetrov32
3PetrSidorov35

Удаление данных из таблиц

В приложениях Flask удаление данных из таблицы может быть осуществлено с помощью SQL-запроса DELETE. Существует два способа удаления данных из таблицы: удаление всех записей или удаление определенных записей по условию.

Удаление всех записей из таблицы может быть выполнено с помощью следующего SQL-запроса:

DELETE FROM table_name;

При удалении всех записей из таблицы следует быть осторожным и проверить, что это действительно то, что вы хотите сделать.

Удаление определенных записей из таблицы может быть выполнено с помощью SQL-запроса с условием. Например, чтобы удалить все записи, где значение столбца “name” равно “John”, можно использовать следующий SQL-запрос:

DELETE FROM table_name WHERE name = 'John';

При выполнении запроса с условием следует также убедиться, что это действительно то, что вы хотите сделать, и что условие соответствует вашим требованиям.

При удалении данных следует быть осторожным, так как информация может быть утеряна и не может быть восстановлена. Рекомендуется сделать резервную копию базы данных перед выполнением операции удаления.

Вопрос-ответ:

Какие типы БД поддерживаются в Flask?

Flask поддерживает различные типы баз данных, но наиболее популярными являются SQLite, MySQL и PostgreSQL.

Можно ли создать БД в Flask без использования SQL?

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

Какие инструменты или библиотеки могут помочь при создании БД в Flask?

Для работы с базами данных в Flask можно использовать такие инструменты и библиотеки как Flask-SQLAlchemy, Flask-MySQL, Flask-PostgreSQL, Flask-SQLite и т.д.

Можно ли создать свою собственную базу данных в Flask?

Да, в Flask можно создать свою собственную базу данных. Для этого необходимо только определить модели данных и подключить некоторые инструменты, такие как Flask-SQLAlchemy.

Какие особенности нужно учесть при создании БД в Flask?

При создании базы данных в Flask необходимо учесть ее производительность, безопасность и масштабируемость. Также необходимо убедиться, что база данных соответствует требованиям вашего приложения.

Какие функции предоставляет Flask-SQLAlchemy?

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

Видео:

⚗ Flask: подключаем БД, настраиваем SqlAlchemy

⚗ Flask: подключаем БД, настраиваем SqlAlchemy by letsCode 4 years ago 8 minutes, 52 seconds 31,942 views

Flask #22: Flask-SQLAlchemy – установка, создание таблиц, добавление записей

Flask #22: Flask-SQLAlchemy – установка, создание таблиц, добавление записей by selfedu 3 years ago 16 minutes 30,326 views

Сообщение Как создать базу данных во Flask: подробный гайд появились сначала на Программирование на Python.

Почему я не люблю Flask

Есть такой популярный microframework: Flask.

Многим нравится: легкий и простой для изучения, то да сё.

А мне — категорически нет.

Нелюбовь началась с элементарного: request — это thread local variable:

import flask
from myapp import app

@app.route('/')
def handler():
req = flask.request
if 'arg' in req.args:
process_arg(req.args['arg'])
###

Т.е. для для того чтобы узнать с какими GET или POST параметрами вызвали мой код — я должен обращаться к глобальной переменной!

Я знаю разницу между global variable и thread local variable если что — но это не избавляет от неприятного послевкусия.

Ага, есть еще и flask.g!

Если уж мне потребуются context local variables — я их буду использовать по моему выбору, морщась от осознания собственного несовершенства. Зачем flask их мне навязывает?

Дальше — больше.

Смотрим еще раз:

from myapp import app

@app.route('/')
def handler():
###

Имеем наполовину сконфигурированный импортированный откуда-то app, к которому добавляем обработчик.

Мне это не нравится. Я хочу сделать app и добавить в него route table.

Flask это позволяет, но документация провоцирует делать ровно наоборот.

Исполнять код на этапе импорта модуля не выглядит хорошей идеей, сейчас в этом я полностью уверен.

Идем дальше.

Параметры в route:

@app.route('/user/')
def handler(username):
pass

Весной это казалось мне удачным. Даже сделал что-то похожее в aiorest.

Потом понял, что штука абсолютно бесполезная: нам всегдатребовалось что-то из HTTP HEADERS, COOKIES и GET/POST parameres в обработчике запроста.

Чтобы проверить — авторизирован ли пользователь, например.

Выпилил.

С другой стороны проблема правильных параметров для обработчика не имеет красивого решения.

route args, GET, POST, COOKIES — каждый dict может иметь перекрывающиеся имена-названия.

Паша Коломиец в zorro попытался решить проблему через аннотации:

def handler(self, request: Request):
pass

Т.е. handler имеет параметр с аннотацией Request — он получит в него request object.

В zorro можно регистрировать свои аннотации для получения дополнительной информации.

Симпатично и элегантно — но слишком сложно для библиотеки для чайников.

Это путь настоящих джедаев — я же в последние годы пропагандирую применять метапрограммирование как можно реже: когда без трюка совсем не обойтись и его применение настолько простое и очевидное, что ошибиться просто невозможно.

Заключение

Я не призываю не использовать flask, у меня нет такой цели. Хотите граблей — получайте.

Просто сейчас я занялся добавлением в aiohttp WEB-сервера, пригодного для использования простым программистом.

И я точно знаю, чего не будет в aiohttpконтекстных переменныхи зависимостей на этапе импорта.

aiohttp.web должен быть прост насколько это возможно, но не проще.

Желающие выстрелить себе в ногу пусть делают это в библиотеках, построенных на основе aiohttp.web — мы дадим им такую возможность.

Базис должен быть простым и дуракоустойчивым — даже если для этого придётся написать несколько лишних строк кода.

Автор: Andrew Svetlov

Let's have a REST, часть III

В части I рассказано о том, что такое REST и что значит для приложения быть RESTful. На несложном примере проиллюстрирован процесс проектирования RESTful приложения. В части II рассмотрены некоторые детали протокола HTTP в связи с реализацией на его основе RESTful приложений. В частности, рассказано, в чем разница между HTTP-методами POST и PUT, что такое идемпотентность, как обойти ограничения языка HTML и сделать браузерное HTML-приложение RESTful (ну, почти RESTful).

В данной, заключительной части, будут рассмотрены два RESTful приложения, написанные на Python с использованием микрофреймворка Flask. Оба приложения позволяют вести список книг, то есть, просматривать, добавлять, изменять и удалять книги из списка. Эти два приложения:

  • RESTful web-сервис и его клиент,
  • RESTful HTML-приложение, с которым пользователь работает в браузере.

Я не буду рассказывать о том, как установить Flask (соответствующая инструкция есть на сайте), а также об основах работы с Flask (об этом отлично рассказано в разделе Quickstart руководства пользователя).

Перейду сразу к делу и представлю код web-сервиса, возвращающего CSV-представление списка книг:

# -*- coding: utf-8 -*-

from flask import Flask, url_for

app = Flask(__name__)

books = {1 : [u'Лев Толстой', u'Война и мир']}
HEADERS = {'Content-Type' : 'text/csv; charset=utf-8'}

def csvbook(id):
return u"%s;%s;%sn" % (id, books[id][0], books[id][1])

@app.route('/')
@app.route('/books')
def index():
text = ''
for key in books.keys():
text += csvbook(key)
return text, 200, HEADERS


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

Поскольку приложение призвано продемонстрировать принципы REST, то все, что сопутствует этой демонстрации, написано как можно проще, чтобы занимать меньше места и быть понятным без объяснений. Так, книги будем хранить не в базе данных, а в словаре books, где ключ — целое число, а значение — список из двух строковых значений: автор книги, название книги.

Функция index() обрабатывает запросы GET для URL /books и /. Формируется CSV-представление списка книг из словаря books, используя функцию csvbook(id) для получения CSV-строки с данными каждой книги. Сформированное представление возвращается клиенту, причем ответ имеет статус 200 (OK) и HTTP-заголовок, задающий тип и кодировку возвращаемых данных.

Запустив наш сервис

C:> python restful-ws-01.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader

и введя в брузере адрес http://localhost:5000/books, получим файл, содержащий

1;Лев Толстой;Война и мир

Не очень удобно тестировать RESTful web-сервис с помощью браузера. В интернет-магазине Chrome есть приложение Advanced Rest Client, которое существенно упрощает ручное тестирование RESTful web-сервиса. Рекомендую попробовать.

Но в этой статье пойду другим путем и напишу клиента для нашего web-сервиса на Python:

# -*- coding: utf-8 -*-

import requests

def print_response(resp):
print " url: %s" % resp.url
print " status: %s %s" % (resp.status_code, resp.reason)
print "headers: %s " % resp.headers
print " data:n%s" % resp.text

print_response(requests.get("http://localhost:5000/books"))

Я использую библиотеку Requests, которая делает отправку HTTP-запросов с различными методами тривиальной задачей. Результат выполнения приведенного кода:

    url: http://localhost:5000/books
status: 200 OK
headers: CaseInsensitiveDict({'date': 'Thu, 13 Mar 2014 04:39:50 GMT', 'content-length': '45', 'content-type': 'text/csv; charset=utf-8', 'server': 'Werkzeug/0.9.4 Python/2.7.3'})
data:
1;Лев Толстой;Война и мир

Прежде чем реализовать следующие методы web-сервиса и написать для них клиентские запросы, приведу полный список ресурсов и методов web-сервиса:

/books        GET       получить список книг
/books POST создать новую книгу
/books/ GET получить данные книги
/books/ PUT изменить данные книги
/books/ DELETE удалить книгу

Вот код, реализующий перечисленные методы web-сервиса, а также обработчик для случая, когда запрошенный ресурс отсутствует:

# -*- coding: utf-8 -*-

from flask import Flask, request, abort, url_for

app = Flask(__name__)

books = {1 : [u'Лев Толстой', u'Война и мир']}
HEADERS = {'Content-Type' : 'text/csv; charset=utf-8'}

def csvbook(id):
return u"%s;%s;%s;%sn" %
(id, books[id][0], books[id][1], url_for('show', id=id, _external = True))

@app.route('/')
@app.route(&# 39;/books')
def index():
text = ''
for key in books.keys():
text += csvbook(key)
return text, 200, HEADERS

@app.route('/books', methods=['POST'])
def create():
new_id = len(books) + 1
books[new_id] = [request.form['author'], request.form['title']]
return csvbook(new_id), 201, HEADERS

@app.route('/books/')
def show(id):
if books.get(id):
return csvbook(id), 200, HEADERS
else:
abort(404)

@app.route('/books/', methods=['PUT'])
def update(id):
if books.get(id):
books[id] = [request.form['author'], request.form['title']]
else:
abort(404)
return csvbook(id), 200, HEADERS

@app.route('/books/', methods=['DELETE'])
def delete(id):
if books.get(id):
del books[id]
return u'OK', 200, HEADERS

@app.errorhandler(404)
def not_found(error):
return u'404: not found', 404, HEADERS


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

Ниже код клиента, тестирующий все методы нашего web-сервиса:

# -*- coding: utf-8 -*-

import requests

def print_response(resp):
print " url: %s" % resp.url
print " status: %s %s" % (resp.status_code, resp.reason)
print "headers: %s " % resp.headers
print " data:n%s" % resp.text

def list_books():
print("n### GET http://localhost:5000/booksn")
print_response(requests.get("http://localhost:5000/books"))


list_books

print("n### POST http://localhost:5000/booksn")
payload = {'author' : u'Александр Пушкин', 'title' : u'Пиковая дама'}
resp = requests.post("http://localhost:5000/books", data=payload)
print_response(resp)

list_books

print("n### PUT http://localhost:5000/books/2n")
payload = {'author' : u'Лев Толстой', 'title' : u'Анна Каренина'}
resp = requests.put("http://localhost:5000/books/2", data=payload)
print_response(resp)

list_books

print("n### DELETE http://localhost:5000/books/2n")
print_response(requests.delete("http://localhost:5000/books/2"))

list_books

print("n### GET http://localhost:5000/books/1n")
print_response(requests.get("http://localhost:5000/books/1"))

print("n### GET http://localhost:5000/books/2n")
print_response(requests.get("http://localhost:5000/books/2"))

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

Теперь перейдем к браузерному RESTful приложению. Оно поддерживает следующие ресурсы и операции:


/books GET получить представление списка книг
/books/new GET получить форму для ввода данных новой книги
/books POST создать новую книгу
/books/ GET получить представление книги
/books//edit GET получить форму для изменения данных книги
/books/ POST изменить данные книги
_method='PUT'
/books//delete POST удалить книгу
_method='DELETE'

Здесь адреса ресурсов следуют соглашениям фреймворка Ruby on Rails — законодателя мод в области RESTful web-приложений. Так как язык HTML не поддерживает запросы к серверу с методами PUT и DELETE, то эти методы имитируются при помощи скрытых полей форм с именем _method.

Ниже приведен код браузерного приложения:

# -*- coding: utf-8 -*-

from flask import Flask, request, redirect, abort

# GET and HEAD are safe
# GET, HEAD, PUT and DELETE are idempotent
# (RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9)


app = Flask(__name__)
books = {1 : [u'Лев Толстой', u'Война и мир']}

list_books_template = u"""



Список книг



Список книг




%s
idАвторНазвание







"""

show_book_template = u"""



Книга



Книга






id%s
Автор%s
Название%s


К списку книг


"""

edit_book_template = u"""



Книга - Изменить



Книга - Изменить








id%s
Автор
Название








К списку книг


"""

new_book_template = u"""



Книга - Добавить



Книга - Добавить






Автор
Название




К списку книг


"""

error404_template = u"""



Список книг


Такой страницы нет :(




"""

@app.route('/')
@app.route('/books')
def index():
text = ''
for key, val in books.items():
text += u'Edit%s%s%s' % (key, key, key, val[0], val[1])
return list_books_template % text

@app.route('/books/new')
def new():
return new_book_template

@app.route('/books', methods=['POST'])
def create():
new_id = len(books) + 1
books[new_id] = [request.form['author'], request.form['title']]
return show_book_template % (new_id, books[new_id][0], books[new_id][1])


@app.route('/books//edit')
def edit(id):
if books.get(id):
return edit_book_template % (id, id, books[id][0], books[id][1], id)
else:
abort(404)

@app.route('/books/', methods=['GET', 'POST']) # PUT and DELETE
def show(id):
if request.method == 'GET':

# /books/ GET

if books.get(id):
return show_book_template % (id, books[id][0], books[id][1])
else:
abort(404)
elif request.method == 'POST' and request.form['_method'] == 'PUT':

# /books/ PUT

if books.get(id):
books[id] = [request.form['author'], request.form['title']]
else:
abort(404)
return show_book_template % (id, books[id][0], books[id][1])
elif request.method == 'POST' and request.form['_method'] == 'DELETE':

# /books/ DELETE

if books.get(id):
del books[id]
return redirect('/books')


@app.errorhandler(404)
def not_found(error):
return error404_template, 404


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

Запустив приложение

C:> python restful-server.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader

и введя в браузере адрес http://localhost:5000/books, попробуйте просматривать, изменять, добавлять и удалять книги.

В отличие от web-сервиса, в браузерном RESTful приложении большую роль играют гиперссылки, содержащиеся в представлениях (HTML-страницах), возвращаемых сервером клиенту (браузеру). Гиперссылки раскрывают перед пользователем структуру приложения, предлагая ему на выбор возможные варианты действий.

Пока всё. Let's have a rest!

Автор: Andrei Trofimov
Дата публикации: 2014-03-19T21:05:00.000+11:00

Запуск MoinMoin2.0 под Apache22 на FreeBSD9

Предполагается, что moin2 расположен в /home/ishayahu/moin-2.0
Для начала нам надо установить сам апач и mod_wsgi, чтобы он мог работать с Flask (я использую для этого portmaster (/usr/ports/ports-mgmt/portmaster)):
#portmaster www/apache22 www/mod_wsgi
Далее создаём файл moin-2.0/moinmoin2.wsgi, чтобы апач мог запускать Flask приложение:
#для работы mod_wsgi, так как он блокирует sys.stdout
import sys
sys.stdout=sys.stderr
# Собственно для Flask
from MoinMoin.app import create_app
application = create_app('/home/ishayahu/moin-2.0/wikiconfig.py')

Теперь будем настроивать апач. Создадим конфигурацию виртульного хоста: файл /usr/local/etc/apache22/Includes/wiki.local.conf

    ServerAdmin meoc-it@mail.ru
    DocumentRoot /home/ishayahu/moin-2.0
    ServerName wiki.local
    ServerAlias www.wiki.local
    ErrorLog /home/ishayahu/wiki.local-error_log
    CustomLog /home/ishayahu/wiki.local-access_log combined
    WSGIDaemonProcess moinmoin2 user=ishayahu group=ishayahu threads=5
    WSGIScriptAlias / /home/ishayahu/moin-2.0/moinmoin2.wsgi
   
        WSGIProcessGroup moinmoin2
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
   
Настроиваем запуск вики как сервиса. Создаём файл для запуска апача в виртуальном окружении (нужно виртуальное окнужение для работы moin; не забыть chmod +x /root/start_wiki) /root/start_wiki:
#!/bin/bash
source /home/ishayahu/moin-2.0/env/bin/activate
/usr/local/etc/rc.d/apache22 onestart
Создаём файл для регистрации вики как сервиса /etc/rc.d/wiki (не забыть chmod +x /etc/rc.d/wiki):
#!/bin/sh
#
# PROVIDE: wiki
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name=»wiki»
start_cmd=»${name}_start»
stop_cmd=»/usr/local/etc/rc.d/apache22 stop»

wiki_start()
{
    /bin/bash /root/start_wiki
}

load_rc_config $name
run_rc_command «$1»
И в /etc/rc.conf:
wiki_enable=»YES»

Автор: Ishayahu Lastov

Flask. Документация. Предисловие

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

Что означает «микро»?

Микро не означает, что всё ваше веб-приложение уместиться в один файл Python, хотя это и возможно. Кроме того, это не означает, что Flask не хватает какой-то функциональности. «Микро» в слове «микрофреймворк» означает, что Flask старается держать своё ядро простым, но расширяемым. Flask не будет принимать какие-то решения за Вас, например, какую БД использовать. Те решения, которые он делает, например, использование конкретного движка шаблонов, очень легко можно изменить. Всё остальное зависит полностью от Вас, так что Flask может быть всем, что Вам нужно и не быть тем, чем не нужен.
По умолчанию, Flask не включает слой абстракции БД, валидации форм или что-либо ещё, что может сделать другая существующая библиотека. Вместо этого Flask поддерживает расширения, которые позволяют добавить эту функциональность к вашему приложению, как если бы это было реализовано в самом Flask. Некоторые расширения предоставляют интеграцию с БД, валидацию форм, обработку загрузок, различные открытые технологии аутентификации и так далее. Flask может быть «микро», но готов к использованию в различных целях.

Конфигурация и допущения

Flask имеет много конфигурационных значений, с адекватными значениями по умолчанию, и использует некоторые допущения. В частности, предполагается, что шаблоны и статические файлы хранятся в подкаталогах в дереве приложения Python с именами templates и static соответственно. Хотя это и можно изменить, скорее всего Вы не будете это делать, особенно в самом начале.

Двигаемся дальше

После того, как Вы начали пользоваться Flask, Вы обнаружите большое количество доступных расширений, которые Вы можете интегрировать в ваш проект. Команда Flask просматривает эти расширения и следит за тем, чтобы их можно было использовать в новых релизах.
По мере роста вашего кода Вы можете выбрать любой дизайн кода, который Вам больше нравится. Flask продолжит предоставлять Вам лучшее, что может предоставить Python. Вы можете реализовать продвинутые шаблоны в SQLAlchemy или другом инструменте работы с БД, хранить данные не в релиационном хранилище и использовать преимущества инструментов, разработанных для WSGI — Python веб-интерфейса.
Flask включает множество хуков для настройки его поведения. Если Вам нужна более тонкая настройка, класс Flask может быть использован для создания подклассов. Если Вам это интересно, обратитесь к главе Becoming Big. Если Вам любопытны принципы дизайна Flask, обращайтесь к разделу Дизайнерские решения в Flask.

Автор: Ishayahu Lastov

Flask. Документация. Предисловие для опытных программистов

Один из дизайнерских подходов Flask — что простые задачи должны быть простыми, не требовать большого количества кода и при этом не должны ограничивать Вас. Поэтому Flask реализует некоторые решения, которые некоторые могут счесть внезапными или не ортодоксальными. Например, Flask использует локальные для потоков объекты, так что Вы не должны передавать объекты из функции в функцию в пределах запроса чтобы избежать проблем с потоками. Это общепринятый подход, но он требует корректного контекста запроса для внедрения зависимостей или если Вы хотите повторно использовать код, который использует значения, привязанные к запросу. Flask гордится этим, не скрывает этого и заявляет об этом и в коде и в докуменации.

Осторожная разработка для веба

Всегда, когда Вы создаёте веб-приложение, помните о безопасности.
Если Вы пишете веб-приложение, Вы, скорее всего, разрешаете пользователям регистрироваться и оставлять данные на вашем сервере. Пользователи доверяют Вам свои данные. И даже если Вы единственный, кто хранит данные в вашем приложении, Вы всё равно хотите чтобы ваши данные надёжно хранились.
К сожалению, есть множество способов скомпроментировать безопасность веб-приложений. Flask защитит Вас от наиболее популярных проблем современных веб-приложений: cross-site scripting (XSS). Пока Вы намеренно не пометите небезопасный HTML как безопасный, Flask, и работающий с ним движок шаблонов Jinja2, будут Вас прикрывать. Но всё равно у Вас ещё остаётся куча способов оставить дыры в приложении.
Документация будет предупреждать Вас о тех аспектах веб-разработки, которые требуют особого внимания к обеспечению безопасности. Некоторые из них гораздо сложнее, чем Вы могли бы подумать, и все мы иногда недооцениваем возможность эксплуатации уязвимости, пока какой-нибудь сообразительный парень не найдёт способ это сделать. И не думайте, что ваше приложение слишком малоценно, чтобы заинтересовать атакующего. В зависимости от типа атаки, есть вероятность того, что боты автоматически постараются заполнить вашу БД спамом, ссылками на вирусное ПО и т.п.
Flask не отличается от других фреймворков в том плане, что Вы, как разработчик, должны быть осторожны, учитывая возможные векторы атаки.

Статус Python 3

На данный момент сообщество Python работает над тем, чтобы библиотеки поддерживали новую версию Python. Хотя ситуация улучшается, тем не менее всё ещё есть несколько проблем, которые не позволяют нам до сих пор переключиться на Python3. Частично эти проблемы связаны  изменениями в языке, которые слишком долго остаются не пересмотренными, частично из-за того, что мы не до конца понимаем, как должно измениться API для учёта изменения подхода к юникоду в Python 3.
Werkzeug и Flask будут портированны на Python 3 как только будет надено решение этих проблем и мы предоставим советы по переходу на новую версию языка. До тех пор мы строго рекомендуем использовать Python 2.6 и 2.7 со включёнными предупреждениями Python 3 при разработке. Если Вы планируете переход на Python 3 в ближайшем будущем, мы крайне рекомендуем Вам прочитать «Как писать совместимый с будущим код Python«7
Продолжением является либо Установка, либо Быстрый старт

Автор: Ishayahu Lastov