ch
Feedback
Python для начинающих

Python для начинающих

前往频道在 Telegram

Python для начинающих

显示更多
1 241
订阅者
+124 小时
+37
+330
帖子存档
Какие задачи на реальных проектах Python решает контейнеризация с помощью Docker.
Какие задачи на реальных проектах Python решает контейнеризация с помощью Docker.

Когда вы пишете веб-приложение на Python, рано или поздно возникает вопрос: «А как всё это запускать в продакшене?». Просто сказать python my_app.py — недостаточно. Нужен настоящий сервер, способный обрабатывать множество запросов, управлять процессами и не «падать» при первом чихе. Тут на сцену выходит Gunicorn — подходящий инструмент для развёртывания серверных приложений на Python, особенно тех, что используют WSGI (например, Flask или Django). Что такое Gunicorn? Gunicorn (Green Unicorn) — это предварительно форкающий WSGI-сервер. Простыми словами, он запускает основное приложение и создаёт дочерние процессы (воркеры), что обеспечивает параллельную обработку запросов. Это даёт выигрыш в производительности и отказоустойчивости. Начнём с установки:
pip install gunicorn
Допустим, у вас простой Flask-приложение:
# app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello from Gunicorn!"
Чтобы запустить это приложение через Gunicorn:
gunicorn app:app
Здесь app:app означает: импортируй из модуля app переменную app, которая представляет собой Flask-приложение. По умолчанию Gunicorn запускает 1 воркер. Можно указать больше:
gunicorn app:app --workers 4
На сколько воркеров стоит ориентироваться? Рекомендуется: количество ядер × 2 + 1. Например, если у вас 2 ядра, оптимально использовать 5 воркеров. Это обеспечит хорошую параллельность. Gunicorn поддерживает разные типы воркеров. Например, sync — по умолчанию, gevent — для асинхронных задач:
gunicorn app:app -k gevent --workers 4
Добавим логирование (чтобы понимать, что происходит при сбоях и нагрузке):
gunicorn app:app --access-logfile access.log --error-logfile error.log
Для надёжной работы в продакшене Gunicorn лучше не запускать как самостоятельный процесс, а обернуть его в процесс-менеджер. Например, systemd (если речь идёт о Linux-сервере), или вы можете использовать supervisor. Конфигурировать Gunicorn можно двумя способами: 1. Через аргументы командной строки (как выше); 2. Через Python-конфигурационный файл:
# gunicorn_config.py
bind = "0.0.0.0:8000"
workers = 4
accesslog = "access.log"
errorlog = "error.log"
А запустить всё так:
gunicorn app:app -c gunicorn_config.py
Если у вас Django-проект, запуск чуть другой:
gunicorn myproject.wsgi:application
Итого: Gunicorn — это ключевой компонент деплоя Python-приложения. Он лёгкий, быстрый, гибкий и замечательно работает с современными фреймворками. Настроив его один раз, можно забыть о приставке “dev server” и перейти на серьёзный уровень — стабильный, отказоустойчивый, боевой.

Как настраивать серверные приложения с Gunicorn и Python.
Как настраивать серверные приложения с Gunicorn и Python.

Когда слышишь «3D-графика на Python», первое, что приходит в голову — это что-то громоздкое и сложное, с кучей зависимостей и километрами кода. Однако библиотека Pyglet ломает этот стереотип: она позволяет создавать 3D-сцены прямо в Python без плясок с бубном и внешних движков. Pyglet — это чистая библиотека на Python для создания мультимедийных приложений, таких как игры и визуализации. Она предоставляет доступ к OpenGL напрямую, что делает её отличным инструментом для работы с 3D. Начнем с самого простого — создадим окно и отрисуем внутри него 3D-объект. Для этого нам понадобится pyglet и немного OpenGL-магии, которая прячется внутри модуля pyglet.gl. Пример создания окна и вращающегося куба:
import pyglet
from pyglet.gl import *
import math

window = pyglet.window.Window(800, 600, "3D Cube with Pyglet", resizable=True)
rotation = 0

@window.event
def on_draw():
    global rotation
    window.clear()

    # Настройка 3D-проекции
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(65, window.width / window.height, 0.1, 100)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glTranslatef(0, 0, -5)
    glRotatef(rotation, 1, 1, 0)

    draw_cube()

def draw_cube():
    glBegin(GL_QUADS)

    # Front face (red)
    glColor3f(1, 0, 0)
    glVertex3f(-1, -1,  1)
    glVertex3f( 1, -1,  1)
    glVertex3f( 1,  1,  1)
    glVertex3f(-1,  1,  1)

    # Back face (green)
    glColor3f(0, 1, 0)
    glVertex3f(-1, -1, -1)
    glVertex3f(-1,  1, -1)
    glVertex3f( 1,  1, -1)
    glVertex3f( 1, -1, -1)

    # Top face (blue)
    glColor3f(0, 0, 1)
    glVertex3f(-1,  1, -1)
    glVertex3f(-1,  1,  1)
    glVertex3f( 1,  1,  1)
    glVertex3f( 1,  1, -1)

    # Bottom face (yellow)
    glColor3f(1, 1, 0)
    glVertex3f(-1, -1, -1)
    glVertex3f( 1, -1, -1)
    glVertex3f( 1, -1,  1)
    glVertex3f(-1, -1,  1)

    # Right face (cyan)
    glColor3f(0, 1, 1)
    glVertex3f( 1, -1, -1)
    glVertex3f( 1,  1, -1)
    glVertex3f( 1,  1,  1)
    glVertex3f( 1, -1,  1)

    # Left face (magenta)
    glColor3f(1, 0, 1)
    glVertex3f(-1, -1, -1)
    glVertex3f(-1, -1,  1)
    glVertex3f(-1,  1,  1)
    glVertex3f(-1,  1, -1)

    glEnd()

def update(dt):
    global rotation
    rotation += 50 * dt

pyglet.clock.schedule(update)
pyglet.app.run()
Запуская этот код, вы увидите вращающийся во все стороны цветной куб. Секрет прост: pyglet предоставляет окно и событийный цикл, OpenGL отвечает за математику и отрисовку граней. Важно: Pyglet не делает абстракций уровнем выше, как это делают движки — если хочешь тени, освещение, текстуры или камеры — всё ты делаешь своими руками. Это и плюс, и вызов: ты лучше понимаешь, что происходит «под капотом», но должен быть готов разобраться с OpenGL-терминами вроде матриц и вершин. Pyglet также хорош тем, что позволяет подключать шрифты, музыку, текстуры и многое другое буквально одной строкой. Хочешь навесить текстуру на куб? Просто подгрузи изображение через pyglet.image и добавь его при рендере. Итог. Pyglet — удобная песочница для 3D-экспериментов, особенно если ты хочешь изучить основы OpenGL, не вылезая из Python. Не самый быстрый путь к полноценной игре, но отличный шаг к пониманию графики изнутри.

Создание 3D-графики с использованием библиотеки Pyglet.
Создание 3D-графики с использованием библиотеки Pyglet.

Создание 3D-графики с использованием библиотеки Pyglet.
Создание 3D-графики с использованием библиотеки Pyglet.

Создание 3D-графики с использованием библиотеки Pyglet.
Создание 3D-графики с использованием библиотеки Pyglet.

Создание 3D-графики с использованием библиотеки Pyglet.
Создание 3D-графики с использованием библиотеки Pyglet.

Ты хочешь, чтобы твой Python-скрипт сообщил всем в Twitter, что ты пьешь утренний кофе? Или, может, каждый день в 9:00 выкладывал мудрую цитату? Что ж, пора познакомиться с одним из самых интересных практических аспектов Python — работой с Twitter API. Да, Twitter (точнее, X) предоставляет открытое API, к которому можно обращаться через HTTP-запросы. А в Python есть готовые удобные библиотеки, которые позволяют сэкономить массу времени. Наш выбор — Tweepy. Это легковесная и популярная обёртка для Twitter API. Первым делом — регистрация приложения в консоли разработчика Twitter (https://developer.twitter.com/). После этого вы получите четыре ключевых параметра: API key, API key secret, Access token и Access token secret. Без них не получится выполнять ни одного запроса. Устанавливаем tweepy:
pip install tweepy
Теперь — сам код. Простой скрипт, который публикует статус:
import tweepy

api_key = "YOUR_API_KEY"
api_secret = "YOUR_API_SECRET"
access_token = "YOUR_ACCESS_TOKEN"
access_secret = "YOUR_ACCESS_SECRET"

auth = tweepy.OAuth1UserHandler(api_key, api_secret, access_token, access_secret)
api = tweepy.API(auth)

status_text = "Доброе утро, Twitter! #python"
api.update_status(status=status_text)
Всё. Этот код опубликует твит от имени пользователя, чьи токены ты указал. Серьёзно, всего несколько строк — и ты уже автоматизируешь публикации. А что насчёт автоматизации по расписанию? Тут пригодится модуль schedule:
pip install schedule
Пример: публиковать сообщение каждый день в определённое время:
import schedule
import time
import tweepy

def post_daily_status():
    status_text = "Автоматическое утро: солнце, Python и немного кофе. ☕ #GoodMorning"
    api.update_status(status=status_text)

auth = tweepy.OAuth1UserHandler(api_key, api_secret, access_token, access_secret)
api = tweepy.API(auth)

schedule.every().day.at("09:00").do(post_daily_status)

while True:
    schedule.run_pending()
    time.sleep(30)
Можно не ограничиваться текстами. С помощью Tweepy можно прикреплять изображения или даже видео — лишь бы придерживаться формата Twitter и не превышать лимитов. Кстати, не забывайте о rate limits: Twitter не позволит вам публиковать тысячи твитов в час. Ознакомьтесь с документацией — там всё чётко расписано. Интересный трюк: создайте JSON-файл с массивом строк, которые бот будет публиковать случайным образом. Чуть-чуть random, чуть-чуть json — и уже почти интеллектуальный твиттер-агент! В следующем шаге можно добавить реакцию на события. Например, бот отслеживает определённый хэштег — и отвечает на твиты в реальном времени. Сам Tweepy поддерживает stream-интерфейс, что делает это вполне реализуемым даже для новичка. Работа с Twitter API — отличный способ почувствовать себя разработчиком "боевого" кода. Это не учебные задачи, это реальная интеграция, которая живёт в сети и взаимодействует с другими людьми. Причём на языке Python, который прекрасно справляется с такими задачами: лаконично, красиво и надёжно.

Работа с API Twitter: Как создавать автоматизированные обновления статуса.
Работа с API Twitter: Как создавать автоматизированные обновления статуса.

Создание собственного чат-бота звучит как магия будущего, но в Python это может быть делом буквально нескольких десятков строк. Сегодня я расскажу тебе о библиотеке ChatterBot — простом инструменте для обучения и создания диалоговых систем. Даже начинающий программист может собрать своего виртуального собеседника за вечер. Поехали! Что такое ChatterBot? ChatterBot — это Python-библиотека, которая позволяет создавать самообучающиеся чат-боты. Она использует алгоритмы машинного обучения для генерации ответов, основываясь на примерах диалогов. Бот анализирует входящие сообщения и подбирает наиболее уместный ответ из своей базы знаний. Установка Для начала нужно установить библиотеку (лучше в отдельном виртуальном окружении): pip install chatterbot==1.0.5 pip install chatterbotcorpus Внимание: ChatterBot не обновлялся с 2020 года, так что он может не поддерживаться в будущих версиях Python. Точная работа гарантирована, например, на Python 3.8. Создание простого чат-бота Начнем с минимального примера: from chatterbot import ChatBot from chatterbot.trainers import ChatterBotCorpusTrainer chatbot = ChatBot('SimpleBot') trainer = ChatterBotCorpusTrainer(chatbot) trainer.train('chatterbot.corpus.english') response = chatbot.getresponse("Hello, how are you?") print(response) Что тут происходит: - Создаем экземпляр ChatBot с именем 'SimpleBot'. - Используем ChatterBotCorpusTrainer для обучения бота на встроенных английских диалогах из chatterbotcorpus. - После тренировки бот уже может отвечать на простые приветствия и бытовые фразы. Добавим свои реплики Корпус англоязычных диалогов — это хорошо, но что если мы хотим научить бота специальной тематике или стилю? from chatterbot.trainers import ListTrainer customdialogue = "Hi", "Hello there!", "What is your name?", "My name is CodeBot.", "What do you do?", "I help you write Python code." trainer = ListTrainer(chatbot) trainer.train(customdialogue) Теперь бот сможет отвечать в стиле, заданном нами. Это особенно полезно для создания узкоспециализированных ботов: техподдержка, FAQ, помощник для онлайн-курса. Улучшение правдоподобия ChatterBot использует механизм сравнения строк и выбор наиболее похожего ответа. Но чтобы бот звучал чуть умнее, его нужно «кормить» большим количеством похожих на реальную переписку диалогов. Можно комбинировать: - Стандартные корпуса: greetings, conversations, computers и другие из chatterbotcorpus. - Свои цепочки реплик: списки на ListTrainer. Также можно подключить логирование: import logging logging.basicConfig(level=logging.INFO) Так ты сможешь видеть, как бот принимает решения при выборе ответа. Ограничения Стоит помнить, что ChatterBot — не инструмент для создания суперумных ботов уровня GPT. Он не понимает смысл текста, не использует нейросети (только локальное машинное обучение), и плохо справляется с генерализацией вне обученной логики. Но как вводная платформа — он отличен. Хочешь создать Telegram-бота с ChatterBot внутри? Пожалуйста. Нужно сделать чат-бота для сайта с базовым FAQ? Тоже не проблема. Заключение ChatterBot — это замечательный способ начать работать с чат-ботами на Python. Он прост, открыт, легко расширяется. Конечно, у него есть ограничения, но для знакомства с темой и несложных задач — он как находка. Будь то ваш первый бот-помощник или просто эксперимент для новых знаний — попробуйте создать свою версию и пообщайтесь с ней. А вдруг она окажется интереснее некоторых людей?

Как использовать Chatterbot для создания чат-ботов на Python
Как использовать Chatterbot для создания чат-ботов на Python

Привет, друзья! Сегодня у нас интересная тема — создание настольных приложений с помощью библиотеки PyQt. Если вы когда-нибудь задумывались: "А как вообще пишут программы с окнами, кнопками и выпадающими списками?" — то добро пожаловать в мир графических интерфейсов. И PyQt — один из самых мощных инструментов для этого в арсенале Python-разработчика. PyQt — это набор привязок (bindings) к фреймворку Qt, который используют такие крупные приложения, как Dropbox и даже интерфейсы в Autodesk Maya. Он кроссплатформенный, стабильный и безумно гибкий. Начнем с простого окна. Установка PyQt5: pip install PyQt5 Теперь создадим базовое окно. Это наш «Hello, world!» в мире GUI: from PyQt5.QtWidgets import QApplication, QWidget import sys app = QApplication(sys.argv) window = QWidget() window.setWindowTitle("My First App") window.resize(300, 200) window.show() sys.exit(app.exec()) Здесь QApplication запускает цикл события — сердце любого GUI-приложения. QWidget — это базовый строительный блок интерфейсов. Метод show() делает наше окно видимым. Теперь добавим кнопку и обработчик события — пусть при нажатии выводится сообщение в терминал: from PyQt5.QtWidgets import QApplication, QWidget, QPushButton import sys def onbuttonclick(): print("Button clicked!") app = QApplication(sys.argv) window = QWidget() window.setWindowTitle("Button Example") window.resize(300, 200) button = QPushButton("Click me", window) button.move(100, 80) button.clicked.connect(onbuttonclick) window.show() sys.exit(app.exec()) Метод connect позволяет связать событие (signal) кнопки с функцией-обработчиком. Все просто и элегантно. Давайте сделаем еще шаг — добавим поле ввода и выведем текст из него: from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QLabel import sys def showtext(): userinput = inputfield.text() label.setText(f"Hello, {userinput}!") app = QApplication(sys.argv) window = QWidget() window.setWindowTitle("Input Example") window.resize(300, 150) inputfield = QLineEdit(window) inputfield.move(20, 20) button = QPushButton("Greet", window) button.move(200, 20) button.clicked.connect(showtext) label = QLabel("", window) label.move(20, 60) window.show() sys.exit(app.exec()) Теперь программа реагирует на действия пользователя, как настоящее приложение. При желании можно подключать меню, вкладки, таблицы, диалоги выбора файлов и даже рисовать на холсте. Именно так создаются полноценные графические программы. Если хочется упорядочить расположение элементов — используйте layout-менеджеры: QVBoxLayout, QHBoxLayout и др. Это избавит от ручного указания координат. PyQt поддерживает более 100 виджетов, работу со стилями (под капотом Qt Style Sheets — аналог CSS), интеграцию с базами данных, OpenGL, WebEngine и даже анимации. Минус один — PyQt имеет двойную лицензию, GPL и коммерческую. Если вы планируете продавать своё приложение и делать его закрытым, стоит обратить внимание на Qt for Python (бывший PySide2 или PySide6) — он полностью бесплатен для коммерции. PyQt — отличный инструмент, чтобы перейти от скриптов к настоящим программам. Он позволяет создавать мощные интерфейсы, не покидая удобный и знакомый Python. Попробуйте — и увидите, насколько это круто.

Основы создания настольных приложений с библиотекой PyQt
Основы создания настольных приложений с библиотекой PyQt

Основы создания настольных приложений с библиотекой PyQt
Основы создания настольных приложений с библиотекой PyQt

Привет! Сегодня поговорим о том, как использовать 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 testloginform(browser): browser.get("https://example.com/login") usernameinput = browser.findelement("name", "username") passwordinput = browser.findelement("name", "password") loginbutton = browser.findelement("id", "login") usernameinput.sendkeys("admin") passwordinput.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 хватает с запасом. Главное — не бояться писать код, даже если ты тестируешь мышкой.

Разработка приложений для тестирования пользовательского интерфейса с PyTest
Разработка приложений для тестирования пользовательского интерфейса с PyTest

Привет! Сегодня мы отправимся в мир движения — а вернее, построим визуализацию кинематической цепи при помощи 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-графики, он — отличная стартовая точка. Играйтесь с углами, добавляйте больше звеньев, усложняйте модели — ведь граница только одна: ваше воображение.

Визуализация кинематических цепей с использованием библиотеки PyPlot
Визуализация кинематических цепей с использованием библиотеки PyPlot

Добро пожаловать в мир, где безопасность веб-приложений перестает быть кошмаром! Сегодня мы разберем, как с помощью 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, внутренних админок и даже более серьёзных проектов, если подкрутить конфигурацию. Хотите создать продвинутую авторизацию буквально за полчаса? Теперь вы знаете, с чего начать.