Python для начинающих
1.06K subscribers
302 photos
3 videos
232 files
62 links
Python для начинающих
Download Telegram
Привет! Сегодня мы поговорим о настоящей рабочей лошадке в мире обработки данных — модуле csv из стандартной библиотеки Python. Если вы только начинаете погружаться в программирование, то CSV — это один из первых форматов, с которым вы обязательно столкнётесь. Банка Excel? Массивы данных с температурой за 20 лет? Цены акций? Всё это часто лежит в формате CSV. И Python умеет с этим работать очень изящно.

🚀 Что такое CSV?
CSV (Comma-Separated Values) — это простой текстовый формат, в котором каждая строка — это запись, а поля разделены запятыми (или другим символом-разделителем). Удобно, читается любым текстовым редактором, легко обрабатывается.

И вот тут приходит модуль csv — он умеет читать, записывать и аккуратно работать с данными из CSV-файлов. Причём делает это проще, чем кажется!

📥 Пример 1: базовое чтение CSV

Допустим, у нас есть файл data.csv с таким содержимым:

name,age,city
Alice,30,London
Bob,25,New York

Читаем этот файл в Python:

import csv

with open('data.csv', newline='', encoding='utf-8') as file:
reader = csv.reader(file)
for row in reader:
print(row)

Вывод:
'name', 'age', 'city'
'Alice', '30', 'London'
'Bob', '25', 'New York'

Важно: параметр newline='' нужен для корректной обработки переноса строк, особенно на Windows. encoding='utf-8' — чтобы не ругался на юникод.

📌 Лучшие практики:
- Обязательно используйте with для открытия файлов — так файл закроется автоматически, даже если что-то пойдёт не так.
- Никогда не полагайтесь на то, что разделитель всегда запятая. Лучше явно указать delimiter, если файл нестандартного формата.

📥 Пример 2: чтение с использованием словарей (идентификаторы — это красиво!)

import csv

with open('data.csv', newline='', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
print(row'name', 'lives in', row'city')

Вывод:
Alice lives in London
Bob lives in New York

DictReader — это просто магия: он превращает строки в словари, где ключи — это названия столбцов. Удобно и читаемо.

🛠 Пример 3: запись в CSV

newdata = [
{'name': 'Charlie', 'age': 28, 'city': 'Berlin'},
{'name': 'Diana', 'age': 32, 'city': 'Paris'}
]

with open('output.csv', mode='w', newline='', encoding='utf-8') as file:
fieldnames = ['name', 'age', 'city']
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(new
data)

Этот код создаст новый файл output.csv с указанными строками. DictWriter — ещё одна удобная обёртка, позволяющая красиво и структурированно экспортировать данные.

Несколько полезных советов:

- Если данные разделяются не запятыми, указывайте параметр delimiter, например: csv.reader(file, delimiter=';').
- Пустые строки? Передавайте параметр skipinitialspace=True, чтобы не было проблем с лишними пробелами.
- Часто приходится работать с числовыми значениями — не забудьте конвертировать строку: int(row'age') или float(...).

📎 И напоследок: CSV — это просто. С ним справится даже начинающий программист, и это отличная практика для понимания работы с файлами, структурами данных и базовой автоматизации. Используйте модуль csv на полную: он даже в 2024 году не теряет своей актуальности.

До встречи в следующем посте!
👍2
Создание фреймворков на Python: основные подходы и техники
Название статьи: Как создать свой фреймворк на Python и не сойти с ума

Создание собственного фреймворка на Python звучит внушительно — будто ты пишешь новое Django или Flask. Но если отбросить пафос, то это просто: ты создаёшь набор правил, структур и удобных инструментов, которые другие (или ты сам) смогут использовать для быстрой и понятной разработки. В этом посте разберёмся, как вообще подступиться к этой задаче, и какие техники стоит взять на вооружение.

Главная цель фреймворка — абстрагировать рутину. Ты не хочешь каждый раз писать одну и ту же обработку запроса или логирование. Вместо этого ты хочешь сказать: “вот точка входа, вот контроллер, вот обработчик данных” — и всё заработало. Красиво? Красиво. Начинаем.

🔧 Архитектура: как кирпичи в доме

Первый шаг — определить архитектурный скелет. MVC (Model-View-Controller), MVT (как у Django), функциональный стиль — неважно. Главное, чтобы ты чётко знал: где логика, где данные, где интерфейс.

Минимальный фреймворк может выглядеть так:

- точка входа: парсинг запроса, вызов контроллера;
- роутер: определение, какая функция отвечает за запрос;
- контроллер: логика обработки запроса;
- шаблон или функция ответа.

Пример:

# simpleframework.py

import re

routes = {}

def route(path):
def decorator(func):
routes[path] = func
return func
return decorator

def application(env):
path = env.get("PATH", "/")
for pattern, handler in routes.items():
if re.fullmatch(pattern, path):
return handler()
return "404 Not Found"

@route(r"/")
def index():
return "Hello, World!"

@route(r"/about")
def about():
return "This is a demo framework."

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

⚙️ Инверсия контроля: пусть фреймворк командует

Одна из ключевых идей фреймворков — Inversion of Control. Это когда разработчик не вызывает функции фреймворка, а фреймворк сам вызывает код разработчика в нужное время.

Ты предоставляешь “крючки” — функции, которые будут вызваны: обработчики маршрутов, middlewares, хуки при старте и завершении приложения.

Когда ты пишешь:

@route("/hello")
def hello():
return "Hi!"

ты лишь определяешь, что "фреймворк, если вдруг тебе попадается '/hello', вызови вот эту функцию". Это и есть инверсия управления.

🧪 Модули: используем stdlib по максимуму

Хороший фреймворк использует стандартную библиотеку как фундамент. Вот пара модулей, которые сильно помогут:

- inspect — позволяет анализировать аргументы функций, подсказывает, как их вызывать;
- functools — особенно полезен for partial и wraps в декораторах;
- collections — для гибких структур данных;
- asyncio — если ты хочешь сделать асинхронный фреймворк.

Например, добавим поддержку middleware-функций:

middlewares = []

def use(middleware
func):
middlewares.append(middlewarefunc)

def application(env):
path = env.get("PATH", "/")
response = None
for pattern, handler in routes.items():
if re.fullmatch(pattern, path):
response = handler()
break
else:
response = "404 Not Found"

for middleware in reversed(middlewares):
response = middleware(response)

return response

@use
def uppercase
middleware(resp):
return resp.upper()

Теперь любой ответ автоматически становится заглавным. Примитив? Зато гибкость и возможность масштабирования налицо.

📦 Упаковка: превращаем в установочный пакет

Когда фреймворк готов, его стоит опубликовать. Используй setup.py, pyproject.toml и размещай проект на PyPI. Обрати внимание на структуру:

myframework/
init.py
core.py
router.py
...

docs/
tests/

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

🧠 Итого

Создание фреймворка — это не магия, а аккуратная выжимка опыта.
Как создать своего голосового помощника с использованием Python и SpeechRecognition
🎙️ Как создать своего голосового помощника с использованием Python и SpeechRecognition

Привет! Сегодня мы разберём, как создать простого голосового помощника на Python, который сможет воспринимать вашу речь и выполнять команды. И хотя до уровня Jarvis из «Железного человека» нам далеко, уже базовая реализация покажет вам, как работает распознавание речи, и даст в руки инструменты для дальнейших экспериментов.

Что понадобится:

Из модулей нам понадобится:

- speechrecognition — модуль для преобразования аудио в текст
- pyaudio — для захвата звука с микрофона
- pyttsx3 — чтобы помощник мог говорить в ответ
- optionally: webbrowser или os для выполнения простых команд

Установка (терминал):
pip install SpeechRecognition pyaudio pyttsx3

(если с pyaudio будут проблемы — скачайте колесо с https://www.lfd.uci.edu/~gohlke/pythonlibs/)

🚀 Первый голос:

Начнём с простого — распознаем сказанную фразу и ответим на неё голосом.

Пример кода:

import speech_recognition as sr
import pyttsx3

def speak(text):
engine = pyttsx3.init()
engine.say(text)
engine.runAndWait()

def listen():
recognizer = sr.Recognizer()
with sr.Microphone() as source:
print("I'm listening...")
audio = recognizer.listen(source)
try:
return recognizer.recognize_google(audio)
except sr.UnknownValueError:
return "Sorry, I didn't catch that"
except sr.RequestError:
return "Service unavailable"

command = listen()
print("You said:", command)
speak("You said: " + command)


📌 Что тут происходит:
- Микрофон слушает вас.
- Речь преобразуется в текст через Google Speech API.
- Программа озвучивает распознанную фразу.

🛠 Реакция на команды

Теперь добавим простую обработку команд, чтобы наш голосовой помощник мог не только слушать, но и отвечать делом.

import webbrowser
import os

def handle_command(text):
text = text.lower()
if "open google" in text:
webbrowser.open("https://www.google.com")
return "Opening Google"
elif "play music" in text:
os.startfile("C:\\Users\\Public\\Music\\Sample Music\\song.mp3")
return "Playing music"
else:
return "Command not recognized"


Слышим → Понимаем → Действуем:

command = listen()
response = handle_command(command)
speak(response)


🎯 Советы:
- Используйте .lower() для обработки текста в нижнем регистре.
- Можно подключить словари действий.
- Расширьте помощника: пусть открывает почту, погоду, включает напоминания.

Важно:
- Убедитесь, что микрофон работает.
- Речь распознаётся через интернет (если используется Google API).
- Для офлайн-распознавания обратите внимание на pocketsphinx (но качество будет хуже).

💡 Идеи на развитие:
- Поддержка нескольких языков
- Контекстный диалог
- Интеграция с Telegram, Discord, голосовыми ассистентами
- Связка с AI-моделями (например, ChatGPT через API)

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

До встречи в следующем посте — скоро будем обучать ИИ распознавать эмоции по голосу! 🚀
👍2
Использование HelloSign API для обработки электронных подписей
📄 Подписываем документы с Python: HelloSign API в действии

В цифровом мире физические подписи — это как отправка писем с почты: можно, но зачем? Электронные подписи экономят время, автоматизируют бизнес-процессы и легитимны во многих странах. Сегодня разберём, как подключить HelloSign API с помощью Python и отправить документ на подпись за минуты.

Что такое HelloSign?

HelloSign — сервис электронных подписей, ныне часть Dropbox. Он позволяет отправлять документы на подпись, отслеживать статус, хранить подписанные версии и всё это через удобный API. Для разработчика это означает: не нужно городить свою инфраструктуру — просто вызывай метод.

Начнём с подготовки

Для работы понадобится:

- Аккаунт на https://app.hellosign.com (бесплатный тестовый доступ есть)
- API Key (доступен в настройках аккаунта)
- Библиотека requests (если не установлена: pip install requests)

Пример 1: Отправка документа на подпись

Давайте отправим PDF-файл на подпись одному получателю.

import requests

apikey = "YOURAPIKEY"
url = "
https://api.hellosign.com/v3/signaturerequest/send"

data = {
"title": "NDA Agreement",
"subject": "Please sign this NDA",
"message": "Let me know if you have any questions.",
"signers0email_address": "john@example.com",
"signers0name": "John Doe",
"signers0role": "Client",
"testmode": "1" # 1 = тест, 0 = прод
}

files = {
"file": open("nda
template.pdf", "rb")
}

response = requests.post(url, data=data, files=files, auth=(apikey, ""))

print(response.json())

Если всё ок, в ответе будет ID запроса на подпись, статус и ссылка для отслеживания.

Пример 2: Встраиваем форму в веб-приложение

Можно встроить интерфейс HelloSign прямо в ваше приложение — клиент будет подписывать документ, не покидая сайт. Для этого используется embedded-подпись и фронтенд-библиотека (например, hellosign-embedded на JS), но бэкенд всё равно нужен:

url = "
https://api.hellosign.com/v3/signaturerequest/createembedded"

data = {
"client
id": "YOURCLIENTID", # получаем здесь: https://app.hellosign.com/apiapp
"title": "Contract",
"subject": "Please sign this contract",
"message": "Contract for future collaboration.",
"signers[0][email
address]": "alice@example.com",
"signers0name": "Alice Smith",
"signers0role": "Partner",
"testmode": "1"
}

files = {
"file": open("contract.pdf", "rb")
}

response =
requests.post(url, data=data, files=files, auth=(apikey, ""))
requestdata = response.json()
signature
id = requestdata["signaturerequest"]"signatures"0"signature_id"

# Получаем URL для встроенного окна подписи:
embedurl = f"https://app.hellosign.com/editor/embeddedSign?signatureid={signatureid}"

print("Embed URL:", embed
url)

Теперь передаём embedurl на фронт, и пользователь видит форму подписи прямо на нашем сайте.

Отслеживание подписей

Удобно получать статус — документ подписан, отклонён, просрочен и т.д.

status
url = f"https://api.hellosign.com/v3/signaturerequest/{signatureid}"
status = requests.get(statusurl, auth=(apikey, ""))
print(status.json())

Для продвинутых задач можно настроить webhook — HelloSign будет сам уведомлять сервер о статусе.

Плюсы использования HelloSign API:

- Поддержка вложений, шаблонов и ролей
- Уведомления, напоминания
- Лёгкая интеграция
- Embedded-подпись — удобно для UX
- Подписи юридически валидны

Минусы:

- Бесплатный план ограничен
- Требуется осторожность с персональными данными и соблюдение законодательства

Заключение

Интеграция HelloSign в Python-проект — не только просто, но и эффективно. За несколько строк кода вы получаете надёжный инструмент электронного документооборота. Работает стабильно, официальная документация понятна, а под капотом — готовый бизнес-инструмент с юридической основой.
👍2
Современные инструменты для анализа больших данных на Python: модуль PySpark
Привет! Сегодня поговорим о настоящем монстре в мире больших данных — PySpark.

Если вы когда-либо работали с pandas, вы наверняка влюбились в удобство работы с DataFrame. Но однажды наступает момент, когда данных становится слишком много: говорим уже не о десятках тысяч строк, а о миллионах и миллиардах. Вот тут и появляется он — PySpark, Python-интерфейс к Apache Spark.

Apache Spark — это фреймворк для распределённой обработки больших данных. Он позволяет «переварить» десятки гигабайт данных на кластере из множества машин. Но не волнуйтесь: для начала достаточно даже локального режима — на одном компьютере.

Что делает PySpark особенным? Во-первых, он поддерживает ленивое вычисление: операции с данными не выполняются немедленно, а накапливаются в виде плана выполнения. Это позволяет оптимизировать расчёты и сократить ненужные шаги. Во-вторых, PySpark масштабируется — запустите тот же код на одном ноутбуке или на сотне узлов Hadoop кластера, и всё сработает.

Давайте посмотрим на реальные примеры.

Прежде всего, установка:

pip install pyspark

Теперь минимальный пример создания DataFrame и работы с ним:

from pyspark.sql import SparkSession
from pyspark.sql.functions import avg

# Инициализация Spark
spark = SparkSession.builder.appName("BigDataAnalysis").getOrCreate()

# Пример данных
data = ("Alice", 25), ("Bob", 30), ("Charlie", 35), ("David", 40)
columns = "name", "age"

df = spark.createDataFrame(data, columns)

# Простая трансформация
dffiltered = df.filter(df.age > 30)

dffiltered.show()

Результат будет такой:

+-------+---+
| name|age|
+-------+---+
|Charlie| 35|
| David| 40|
+-------+---+

Теперь посчитаем средний возраст:

dfavg = df.select(avg("age").alias("averageage"))
dfavg.show()

Вывод:

+-----------+
|average
age|
+-----------+
| 32.5|
+-----------+

А ещё можно делать группировки, соединения, агрегации — примерно так же, как в pandas, но с учётом миллиардов строк.

Особо стоит отметить PySpark SQL — возможность писать запросы прямо на SQL, обращаясь к таблицам, как к базам данных:

df.createOrReplaceTempView("people")
sqlresult = spark.sql("SELECT name FROM people WHERE age >= 30")
sqlresult.show()

Важно: всё это выполняется распределённо, если подключён кластер. Это значит, что даже при десятках гигабайт данных PySpark не утонет, в отличие от pandas.

PySpark часто используется в реальных проектах: от анализа логов и телеметрии до обработки событий в режиме реального времени. В экосистеме — поддержка Kafka, Amazon S3, Hadoop HDFS, интеграция с MLlib (машинное обучение), GraphX (работа с графами) и другими мощными инструментами.

Да, порог входа чуть выше, чем у pandas. Надо разобраться в концепциях RDD, DAG и планах выполнения, но результат того стоит. Начать можно локально, подключить ноутбук и Jupyter — и вперёд, к большим данным.

PySpark — это не просто модуль, а целая философия обработки данных. Если вы чувствуете, что обычный инструментарий Python упирается в лимит — самое время попробовать Spark.
Настройка и использование Apache Kafka для обработки событий с Python
# Настройка и использование Apache Kafka для обработки событий с Python

Привет, друзья! Сегодня у нас на очереди одна из самых интересных тем — подключение Python к Apache Kafka. Если раньше ты считал, что Kafka — это только для больших компаний и бородатых архитекторах с диаграммами в руках, то готовься: сейчас мы её приручим и начнем использовать буквально в несколько строк кода.

## Что такое Apache Kafka?

Kafka — это распределённая платформа для потоковой передачи сообщений. Грубо говоря, она позволяет одной части вашей системы быстро сообщать события другой части. Представь это как сверхбыстрый почтовый сервис для данных в реальном времени.

## Установка Kafka (локально)

Для локальной установки понадобится Java и собственно Kafka. Если у тебя установлен Docker, развернуть Kafka можно буквально в две команды:

docker network create kafka-net

docker run -d --name zookeeper --network kafka-net -e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest

docker run -d --name kafka --network kafka-net -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 -e ALLOW_ANONYMOUS_LOGIN=yes -p 9092:9092 bitnami/kafka:latest


Это поднимет Zookeeper и Kafka сервер локально на порте 9092.

## Установка Python-клиента

Kafka сама по себе не разговаривает на Python. Нам поможет библиотека kafka-python. Устанавливаем ее:

pip install kafka-python


Готово! Теперь пишем наш первый продюсер и консьюмер сообщений.

## Отправка сообщений в Kafka

Создадим продюсера, который будет отправлять события в топик test-topic:

from kafka import KafkaProducer

producer = KafkaProducer(bootstrap_servers='localhost:9092')

for i in range(5):
message = f"Hello Kafka {i}"
producer.send('test-topic', message.encode('utf-8'))
print(f"Sent: {message}")

producer.flush()


Обрати внимание, Kafka ожидает отправку байтов, поэтому .encode('utf-8') обязательно.

## Получение сообщений из Kafka

А теперь консьюмер, который будет эти сообщения забирать:

from kafka import KafkaConsumer

consumer = KafkaConsumer(
'test-topic',
bootstrap_servers='localhost:9092',
auto_offset_reset='earliest', # берем всё с начала
enable_auto_commit=True,
group_id='test-group'
)

for message in consumer:
print(f"Received: {message.value.decode('utf-8')}")


И вот ты уже слушаешь свой первый поток данных в реальном времени!

## Пара моментов, которые стоит знать:

- Топики и партиции — данные в Kafka не просто в одном потоке, они разбиваются на "топики", а внутри топиков — еще и на "партиции". Это даёт масштабируемость и отказоустойчивость.
- Консьюмер-группы — если несколько приложений читают данные из одного топика в одной группе, Kafka сама балансирует нагрузку между ними.
- Брокеры — один экземпляр Kafka называется брокером. Несколько брокеров можно объединить в кластер для масштабирования.
- Производитель (Producer) и Потребитель (Consumer) — фундаментальные роли в любой системе на Kafka.

## Когда стоит использовать Kafka?

- Если твои данные нужно обрабатывать в реальном времени.
- Когда у тебя много источников событий (например, клики на сайте, заказы в магазине, сенсорные данные).
- Для построения надёжных очередей сообщений между микросервисами.

## Пара советов для продвинутой работы:

- На продакшн используют более надёжные библиотеки, например confluent-kafka-python, основанную на C-библиотеке — она быстрее.
- На старте важно правильно настроить параметры продюсера (например, acks или retries), чтобы не терять сообщения.
- Kafka прекрасно скейлится горизонтально. Добавлять брокеры просто — как складывать кубики Lego.

---

На этом всё! Сегодня мы сделали серьёзный шаг в мир потоковой обработки данных. Теперь ты умеешь не только писать скрипты, но и строить настоящие события в реальном времени.

До встречи в новых статьях — дальше будет ещё интереснее!
👍1
Работа с геопространственными данными с использованием библиотеки Fiona
Привет, друзья! Сегодня у нас в блоге отличная тема: поговорим о работе с географическими данными с помощью библиотеки Fiona.

Часто, когда речь заходит о ГИС-данных (географических информационных системах), большинство вспоминает тяжеловесные инструменты вроде ArcGIS или QGIS. Но если вам нужно быстро прочитать shapefile, извлечь нужные геометрии и метаданные, преобразовать их — Python с его библиотекой Fiona делает это элегантно и без лишнего шума.

Что такое Fiona? В двух словах — это библиотека для работы с геопространственными файлами через Python в стиле "сущности-объекты". Она строится поверх библиотеки GDAL/OGR, но обёрнута в удобный, Python-овый интерфейс.

### Установка

Стандартно через pip:

pip install fiona


Важно: GDAL должен быть установлен до этого. На Windows проще всего поставить всё через Conda.

---

### Пример 1: Читаем shapefile

Допустим, у нас есть shapefile с пунктами мониторинга воздуха. Считаем его:

import fiona

with fiona.open('air_quality_stations.shp') as shp:
for feature in shp:
print(feature['properties'])
print(feature['geometry'])


Что происходит?
- feature — это одна запись в файле: свойства точки (например, имя станции) и геометрия (координаты).
- Свойства хранятся в словаре properties, а форма данных (точка, линия, полигон) — в geometry.

---

### Пример 2: Создаём новый geo-файл

Хотите создать свой собственный shapefile из программы? Fiona тоже здесь пригодится.

import fiona
from shapely.geometry import mapping, Point

schema = {
'geometry': 'Point',
'properties': {'name': 'str'}
}

points = [
{'name': 'Station A', 'coordinates': (102.0, 0.5)},
{'name': 'Station B', 'coordinates': (103.0, 1.0)}
]

with fiona.open(
'new_stations.shp',
mode='w',
driver='ESRI Shapefile',
schema=schema,
crs='EPSG:4326'
) as shp:
for point in points:
geom = Point(point['coordinates'])
shp.write({
'geometry': mapping(geom),
'properties': {'name': point['name']}
})


Здесь:
- Мы задали схему файла: каждый объект — точка + одно текстовое поле name.
- Для каждой точки создаём геометрию через библиотеку Shapely (mapping превращает объект в формат GeoJSON).

---

### Пример 3: Фильтрация объектов

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

import fiona

with fiona.open('air_quality_stations.shp') as shp:
selected = [f for f in shp if f['properties']['city'] == 'Moscow']
print(f"Found {len(selected)} stations in Moscow")


Быстро и лаконично.

---

### Чем ещё полезна Fiona?

- Поддерживает множество форматов: GeoPackage (.gpkg), GeoJSON, Shapefile и др.
- Читает данные постранично, без загрузки всего файла в память — важно для тяжёлых архивов.
- Работает в паре с другими библиотеками — например, вместе с Shapely и Rasterio делает магию геообработки.

Ключевая идея Fiona — "не ломай данные". Она напрямую передаёт вам GeoJSON-подобные объекты без преобразований, тем самым избавляя вас от сюрпризов при чтении/записи.

---

Fiona — основной инструмент, если стартовать работу с ГИС-данными через Python. Минимализм, устойчивость и логичность — вот за что её любят разработчики.

На следующем шаге рекомендую попробовать связать работу Fiona с визуализацией через Folium или обработкой пространственных запросов через GeoPandas. Но об этом как-нибудь в отдельном посте!

До скорого! 🚀
👍2
Как использовать Flask-Security для добавления безопасности в веб-приложения
Добро пожаловать в мир, где безопасность веб-приложений перестает быть кошмаром! Сегодня мы разберем, как с помощью Flask-Security можно быстро добавить регистрацию, логин, подтверждение email и управление ролями в ваше Python-приложение.

Итак, Flask сам по себе не навязывает систему аутентификации. Да, можно писать всё вручную, но это долго и рискованно. Flask-Security же объединяет несколько мощных библиотек — Flask-Login, Flask-Principal, Flask-WTF и Flask-SQLAlchemy — и оборачивает их в элегантный интерфейс.

Давайте сразу к делу.

📦 Устанавливаем всё необходимое:

pip install flask flask_sqlalchemy flask_security-too


Да, именно flask_security-too — форк оригинального Flask-Security, который жив и развивается!

🚀 Базовый пример:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin

app = Flask(__name__)
app.config['SECRET_KEY'] = 'supersecretkey'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SECURITY_REGISTERABLE'] = True
app.config['SECURITY_PASSWORD_SALT'] = 'salt123'

db = SQLAlchemy(app)

# Определяем модели
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)

class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
roles = db.relationship('Role', secondary='roles_users')

class RolesUsers(db.Model):
id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('user.id'))
role_id = db.Column(db.Integer(), db.ForeignKey('role.id'))

# Настраиваем
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

@app.route('/')
def home():
return 'Welcome to the secured app!'

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


И всё! У вас уже есть готовые маршруты для /login, /logout, /register, /reset и многое другое.

Что ещё можно сделать?

Например, ограничить доступ к маршрутам:

from flask_security import login_required, roles_required

@app.route('/profile')
@login_required
def profile():
return 'This is your profile.'

@app.route('/admin')
@roles_required('admin')
def admin_area():
return 'Welcome, admin!'


Теперь только авторизованные пользователи смогут видеть /profile, а доступ к /admin получат лишь те, кто имеет роль "admin".

Пара крутых фишек Flask-Security:

- Встроенное подтверждение регистрации через email.
- Автоматическое управление системой восстановления пароля.
- Защита от CSRF атак "из коробки".
- Возможность кастомизации форм.

Например, чтобы валидировать пароли по-своему, надо просто переопределить форму регистрации:

from flask_security.forms import RegisterForm
from wtforms import StringField
from wtforms.validators import DataRequired

class ExtendedRegisterForm(RegisterForm):
username = StringField('Username', [DataRequired()])

app.config['SECURITY_REGISTER_FORM'] = ExtendedRegisterForm


И теперь ваши пользователи смогут указывать дополнительное поле username при регистрации!

---

Flask-Security делает жизнь разработчика проще без ущерба безопасности. Он отлично подходит для MVP, внутренних админок и даже более серьёзных проектов, если подкрутить конфигурацию.

Хотите создать продвинутую авторизацию буквально за полчаса? Теперь вы знаете, с чего начать.
Визуализация кинематических цепей с использованием библиотеки PyPlot
Привет! Сегодня мы отправимся в мир движения — а вернее, построим визуализацию кинематической цепи при помощи Python и библиотеки PyPlot. Нет, не нужно быть инженером-механиком, чтобы понять, как «ходят» шестерёнки. Достаточно немного кода и чуточку воображения.

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

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

Начнём с обязательного импорта и настроек:

import matplotlib.pyplot as plt
import numpy as np


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

def generate_chain_positions(angles, lengths):
positions = [(0, 0)]
angle_total = 0
for i in range(len(angles)):
angle_total += angles[i]
x = positions[-1][0] + lengths[i] * np.cos(angle_total)
y = positions[-1][1] + lengths[i] * np.sin(angle_total)
positions.append((x, y))
return positions


В этой функции angles — список углов (в радианах), а lengths — длины каждого звена. Мы накапливаем общее смещение по углу (angle_total), чтобы правильно отрисовать концы звеньев при повороте каждого следующего.

Следующая функция займётся отображением цепи:

def draw_chain(positions):
x_coords, y_coords = zip(*positions)
plt.figure(figsize=(6, 6))
plt.plot(x_coords, y_coords, marker='o', linewidth=3, markersize=8)
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.gca().set_aspect('equal')
plt.grid(True)
plt.title('Kinematic Chain Visualization')
plt.show()


Теперь соберем всё вместе и поиграемся с разными положениями:

angles1 = [np.pi/6, np.pi/4, -np.pi/3]
lengths = [3, 2.5, 2]

positions1 = generate_chain_positions(angles1, lengths)
draw_chain(positions1)


Вы увидите трёхзвенную цепь, где каждый следующий сегмент под углом относительно предыдущего. Попробуйте изменить углы — например, анимировать движение:

import time

for i in range(10):
angles = [np.pi/6 + i*0.1, np.pi/4 - i*0.05, -np.pi/6 + i*0.07]
positions = generate_chain_positions(angles, lengths)
draw_chain(positions)
time.sleep(0.1)


Это приведёт к простой анимации — не самой плавной, но эффектной.

Зачем всё это? Такие визуализации важны в робототехнике, где тонко настраивается движение манипуляторов, или в разработке игр, где требуется реализовать движение конечностей персонажа. Более того, основа такой цепи может быть применена в аналитике движений (motion capture), симуляциях или обучении нейросетей захвату объектов.

PyPlot — не единственный инструмент, конечно. Но если вы только начинаете осваивать Python и хотите визуализировать свои идеи без сложной 3D-графики, он — отличная стартовая точка.

Играйтесь с углами, добавляйте больше звеньев, усложняйте модели — ведь граница только одна: ваше воображение.
Разработка приложений для тестирования пользовательского интерфейса с PyTest
Привет! Сегодня поговорим о том, как использовать PyTest для разработки приложений, связанных с тестированием пользовательского интерфейса. Да-да, PyTest – не только про юнит-тесты и проверку бизнес-логики. С его помощью можно очень удобно организовать тестирование UI, особенно если ты уже используешь Selenium или Playwright.

Когда мы говорим о UI-тестах, первое, что может прийти в голову — это длинные, медленные, хрупкие тесты. Но если подойти к процессу с умом, PyTest превращается в мощный инструмент — с поддержкой фикстур, параметризации, удобной организации кода и настроек. Главное понять, как “подружить” его с UI-инструментами.

Начнем с Selenium. Допустим, ты тестируешь веб-приложение.

Установим все:

pip install pytest selenium

Создаём базовую фикстуру для браузера:

# conftest.py
import pytest
from selenium import webdriver

@pytest.fixture
def browser():
driver = webdriver.Chrome()
yield driver
driver.quit()

Теперь пишем наш первый UI-тест:

# testlogin.py
def test
loginform(browser):
browser.get("
https://example.com/login")
username
input = browser.findelement("name", "username")
password
input = browser.findelement("name", "password")
login
button = browser.findelement("id", "login")

username
input.sendkeys("admin")
password
input.sendkeys("123456")
loginbutton.click()

assert "Dashboard" in browser.pagesource

А теперь магия: эти тесты можно запускать, как обычный PyTest-тест, с отчетами, параметрами, фильтрами — как угодно. Если добавить
@pytest.mark.parametrize, можно прогнать этот тест с разными значениями логинов/паролей.

PyTest также позволяет внедрить флаг "--headless", чтобы запускать тесты без открытия окна браузера — полезно для CI/CD.

А что насчет Playwright? Это современная альтернатива Selenium, отлично подходящая для UI-тестов. Установим:

pip install pytest-playwright
playwright install

Далее почти всё также. Фреймворк автоматически предоставляет фикстуру 'page':

#
testsearch.py
def testsearchfunctionality(page):
page.goto("https://example.com")
page.fill("inputname='q'", "Python")
page.click("buttontype='submit'")
assert page.url.contains("search")

С PyTest и Playwright легко запускать тесты в разных браузерах и окружениях, записывать видео, делать скриншоты при ошибках. Всё это поддерживается “из коробки”.

Ещё один плюс PyTest — структура. Можно группировать тесты по классам, использовать фикстуры для авторизации, навигации, состояния сессии. А если потренироваться, можно автоматически формировать отчёты в формате HTML.

Вывод? PyTest — это не просто способ проверить, делится ли два на два. Это настоящая тестовая платформа, в которую прекрасно вписываются UI-инструменты. С ней удобно, быстро и понятно. А ещё — командная строка для запуска, гибкая конфигурация, расширения (например, pytest-html или pytest-xdist для параллельных прогонов).

Так что, если ты хочешь не просто "тыкать по кнопкам", а делать стабильные и наглядные UI-тесты — PyTest хватает с запасом. Главное — не бояться писать код, даже если ты тестируешь мышкой.
Основы создания настольных приложений с библиотекой PyQt