🚀 Как выстраивать непрерывную интеграцию и доставку (CI/CD) для Python-проектов
Когда проект только набирает обороты, неудобства типа "сломал продакшн", "забыл протестировать перед коммитом", "откатил вручную до прошлой версии" кажутся мелочами. Но чем больше кода — тем громче эти мелочи звучат. И вот тут на арену выходит CI/CD: непрерывная интеграция и доставка.
Что такое CI/CD?
- Continuous Integration (CI) — это процесс автоматической сборки и проверки кода при каждом коммите.
- Continuous Delivery (CD) — автоматическая доставка протестированного кода в staging или даже production.
Вместе они превращают “внезапный релиз” в “предсказуемое событие”.
Платформы: GitHub Actions, GitLab CI, CircleCI и др. Мы разберем GitHub Actions — мощный и удобный инструмент, прямо внутри GitHub.
📦 Структура Python-проекта
Типовая структура проекта:
Файл
🔧 Простой CI pipeline (GitHub Actions)
Что происходит:
- Workflow запускается на push или pull request в ветку
- На виртуальной машине ставится Python.
- Устанавливаются зависимости.
- Запускаются тесты с помощью
🛠️ Добавляем Code Quality: linters
Проверка стиля важна не меньше тестов.
Ошибка форматирования — fail pipeline. Чистота — залог стабильности.
🚢 Непрерывная доставка: CD
Допустим, у нас есть staging-сервер и GitHub уже подключен к нему через секреты (например, SSH-ключ, API token и т.д.). Ниже пример, как можно деплоить через SCP:
Реализация зависит от вашего хостинга. Можно использовать Docker, Heroku, DigitalOcean, AWS — что угодно.
🔥 Бонус: кэш зависимостей
Чтобы ускорить pipeline:
При повторном запуске зависимости не будут скачиваться заново — экономим минуты и нервы.
🎯 Вывод
CI/CD превращает ваш Python-проект из “хаоса” в “машину”, где каждый коммит — шаг вперед, а не на грабли. Даже простая автоматизация сборки и тестов — огромный шаг к качеству и стабильности. Начните с малого, добавляйте шаг за шагом. Пусть ваш код работает, пока вы спите!
Когда проект только набирает обороты, неудобства типа "сломал продакшн", "забыл протестировать перед коммитом", "откатил вручную до прошлой версии" кажутся мелочами. Но чем больше кода — тем громче эти мелочи звучат. И вот тут на арену выходит CI/CD: непрерывная интеграция и доставка.
Что такое CI/CD?
- Continuous Integration (CI) — это процесс автоматической сборки и проверки кода при каждом коммите.
- Continuous Delivery (CD) — автоматическая доставка протестированного кода в staging или даже production.
Вместе они превращают “внезапный релиз” в “предсказуемое событие”.
Платформы: GitHub Actions, GitLab CI, CircleCI и др. Мы разберем GitHub Actions — мощный и удобный инструмент, прямо внутри GitHub.
📦 Структура Python-проекта
Типовая структура проекта:
my_project/
├── app/
│ └── main.py
├── tests/
│ └── test_main.py
├── requirements.txt
└── .github/
└── workflows/
└── ci.yml
Файл
ci.yml
— сердце нашего процесса CI.🔧 Простой CI pipeline (GitHub Actions)
name: Python CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: |
pytest tests/
Что происходит:
- Workflow запускается на push или pull request в ветку
main
.- На виртуальной машине ставится Python.
- Устанавливаются зависимости.
- Запускаются тесты с помощью
pytest
.🛠️ Добавляем Code Quality: linters
Проверка стиля важна не меньше тестов.
- name: Run linter
run: |
pip install flake8
flake8 app/
Ошибка форматирования — fail pipeline. Чистота — залог стабильности.
🚢 Непрерывная доставка: CD
Допустим, у нас есть staging-сервер и GitHub уже подключен к нему через секреты (например, SSH-ключ, API token и т.д.). Ниже пример, как можно деплоить через SCP:
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy via SCP
run: scp -r ./app user@staging-host:/app-folder
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
Реализация зависит от вашего хостинга. Можно использовать Docker, Heroku, DigitalOcean, AWS — что угодно.
🔥 Бонус: кэш зависимостей
Чтобы ускорить pipeline:
- name: Cache pip
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
При повторном запуске зависимости не будут скачиваться заново — экономим минуты и нервы.
🎯 Вывод
CI/CD превращает ваш Python-проект из “хаоса” в “машину”, где каждый коммит — шаг вперед, а не на грабли. Даже простая автоматизация сборки и тестов — огромный шаг к качеству и стабильности. Начните с малого, добавляйте шаг за шагом. Пусть ваш код работает, пока вы спите!
Если вы когда-нибудь задумывались, как превратить скрипт на Python в красивое и интерактивное веб-приложение, не вникая в HTML, CSS и JavaScript, то библиотека Dash — это то, что вам нужно. Она позволяет собирать интерактивные сайты с панелями управления (dashboards), графиками и формами буквально из нескольких строчек кода. Всё, что нужно — знание Python и немного фантазии.
Dash создана разработчиками Plotly, и в её основе — Flask, React.js и Plotly.js. Однако всё это скрыто за удобным API, который говорит с вами исключительно на Python.
Начнём с простого примера:
📦 Установка:
📈 Минимальное приложение:
После запуска откройте в браузере http://127.0.0.1:8050 — и увидите вашу первую HTML-страницу, сгенерированную Python-кодом.
Но Dash действительно раскрывает свой потенциал, когда вы интегрируете графику и взаимодействие.
🎯 Добавим графики с Plotly:
Всё, что вы знали о графиках в Jupyter Notebook, теперь работает и в вебе. Идём дальше — добавим интерактивность.
🕹️ Используем callbacks:
Теперь всё живое. Меняете текст — и приложение реагирует. Без JS и без боли. Это может быть input-поле, выпадающий список, слайдер и многое другое.
👨💻 Dash особенно полезен для аналитиков данных и инженеров, которым надо собрать визуальную панель или форму для управления расчётами, не отвлекаясь на фронтенд.
Бонус: всё, что вы делаете в Dash, может быть развёрнуто на любой платформе: от Heroku до Docker-контейнера.
📚 Полезно знать:
-
-
-
Dash — это мост между анализом данных и веб-интерфейсом. Это Python-код, который оживает в браузере. Попробуйте — и удивитесь, как просто стало делать сложное.
Dash создана разработчиками Plotly, и в её основе — Flask, React.js и Plotly.js. Однако всё это скрыто за удобным API, который говорит с вами исключительно на Python.
Начнём с простого примера:
📦 Установка:
pip install dash
📈 Минимальное приложение:
import dash
from dash import html
app = dash.Dash(__name__)
app.layout = html.Div([
html.H1("Hello, Dash!"),
html.P("Build interactive web apps with pure Python.")
])
if __name__ == '__main__':
app.run_server(debug=True)
После запуска откройте в браузере http://127.0.0.1:8050 — и увидите вашу первую HTML-страницу, сгенерированную Python-кодом.
Но Dash действительно раскрывает свой потенциал, когда вы интегрируете графику и взаимодействие.
🎯 Добавим графики с Plotly:
import dash
from dash import dcc, html
import plotly.express as px
import pandas as pd
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
app = dash.Dash(__name__)
app.layout = html.Div(children=[
html.H1("Iris Data Visualization"),
dcc.Graph(
id='iris-graph',
figure=fig
)
])
if __name__ == '__main__':
app.run_server(debug=True)
Всё, что вы знали о графиках в Jupyter Notebook, теперь работает и в вебе. Идём дальше — добавим интерактивность.
🕹️ Используем callbacks:
from dash.dependencies import Input, Output
app.layout = html.Div([
dcc.Input(id='user-input', type='text', value='Dash', debounce=True),
html.H2(id='output')
])
@app.callback(
Output('output', 'children'),
Input('user-input', 'value')
)
def update_output(value):
return f'Hello, {value}!'
Теперь всё живое. Меняете текст — и приложение реагирует. Без JS и без боли. Это может быть input-поле, выпадающий список, слайдер и многое другое.
👨💻 Dash особенно полезен для аналитиков данных и инженеров, которым надо собрать визуальную панель или форму для управления расчётами, не отвлекаясь на фронтенд.
Бонус: всё, что вы делаете в Dash, может быть развёрнуто на любой платформе: от Heroku до Docker-контейнера.
📚 Полезно знать:
-
dash.html
— набор базовых HTML-компонентов-
dash.dcc
— продвинутые компоненты: графики, слайдеры, dropdown-
@app.callback
— магия, связывающая данные и визуалDash — это мост между анализом данных и веб-интерфейсом. Это Python-код, который оживает в браузере. Попробуйте — и удивитесь, как просто стало делать сложное.
👍1
Привет! Сегодня я расскажу тебе о том, как эффективно работать с JSON-LD в Python с помощью библиотеки RDFLib. Звучит академично? А на деле — это практичный инструмент, если ты хочешь работать с семантическими данными, структурированными знаниями и файлами, которые часто встречаются в современных API и открытых данных.
🎯 Немного теории: JSON-LD (JSON for Linking Data) — это способ сериализации Linked Data в формате JSON. Используется для представления семантической информации: описания сущностей, связей между ними и контекста. Обычно это можно встретить в open data от правительств, научных институтов, Википедии (через Wikidata) и в структурированных данных на сайтах.
А теперь самое интересное — практика.
📦 RDFLib — это мощная Python-библиотека для работы с RDF-графами. Она поддерживает различные форматы (Turtle, XML, JSON-LD и другие), позволяет парсить, сериализовать RDF и выполнять запросы SPARQL.
Установим библиотеку:
🛠️ Представим, что у нас есть следующий JSON-LD документ:
Давайте загрузим и обработаем его с помощью RDFLib:
Вывод будет примерно такой:
🎯 Что здесь важно? RDFLib превращает JSON-LD в RDF-граф, с которым ты можешь работать с той же легкостью, что и с обычным Python-объектом.
🔍 Запросы к данным? Легко, с помощью SPARQL:
Вывод:
Да, это похоже на SQL, только графовый стиль. Такой подход особенно хорошо себя проявляет, когда ты работаешь с большими онтологиями или данными из Wikidata.
💡 Совет: RDFLib поддерживает сериализацию обратно в JSON-LD, Turtle и другие форматы. То есть можно использовать её как конвертер:
📌 Такой фреймворк делает Python удобной средой для работы с современными структурированными данными, где важны не только значения, но и связи между ними.
Надеюсь, теперь JSON-LD и RDFLib звучат не как абстрактные академические термины, а как инструменты, которые реально можно и нужно использовать. Experiment, explore, и пусть граф знаний будет с тобой!
🎯 Немного теории: JSON-LD (JSON for Linking Data) — это способ сериализации Linked Data в формате JSON. Используется для представления семантической информации: описания сущностей, связей между ними и контекста. Обычно это можно встретить в open data от правительств, научных институтов, Википедии (через Wikidata) и в структурированных данных на сайтах.
А теперь самое интересное — практика.
📦 RDFLib — это мощная Python-библиотека для работы с RDF-графами. Она поддерживает различные форматы (Turtle, XML, JSON-LD и другие), позволяет парсить, сериализовать RDF и выполнять запросы SPARQL.
Установим библиотеку:
pip install rdflib
🛠️ Представим, что у нас есть следующий JSON-LD документ:
{
"@context": {
"name": "http://schema.org/name",
"homepage": { "@id": "http://schema.org/url", "@type": "@id" }
},
"@id": "http://example.org/person#me",
"name": "Ivan Petrov",
"homepage": "http://example.org/"
}
Давайте загрузим и обработаем его с помощью RDFLib:
from rdflib import Graph
jsonld_data = '''
{
"@context": {
"name": "http://schema.org/name",
"homepage": { "@id": "http://schema.org/url", "@type": "@id" }
},
"@id": "http://example.org/person#me",
"name": "Ivan Petrov",
"homepage": "http://example.org/"
}
'''
g = Graph()
g.parse(data=jsonld_data, format='json-ld')
for subj, pred, obj in g:
print(f"{subj} -- {pred} --> {obj}")
Вывод будет примерно такой:
http://example.org/person#me -- http://schema.org/url --> http://example.org/
http://example.org/person#me -- http://schema.org/name --> Ivan Petrov
🎯 Что здесь важно? RDFLib превращает JSON-LD в RDF-граф, с которым ты можешь работать с той же легкостью, что и с обычным Python-объектом.
🔍 Запросы к данным? Легко, с помощью SPARQL:
from rdflib.namespace import Namespace
SCHEMA = Namespace("http://schema.org/")
query = """
SELECT ?name
WHERE {
?person <http://schema.org/name> ?name .
}
"""
qres = g.query(query)
for row in qres:
print(row.name)
Вывод:
Ivan Petrov
Да, это похоже на SQL, только графовый стиль. Такой подход особенно хорошо себя проявляет, когда ты работаешь с большими онтологиями или данными из Wikidata.
💡 Совет: RDFLib поддерживает сериализацию обратно в JSON-LD, Turtle и другие форматы. То есть можно использовать её как конвертер:
print(g.serialize(format="json-ld", indent=2))
📌 Такой фреймворк делает Python удобной средой для работы с современными структурированными данными, где важны не только значения, но и связи между ними.
Надеюсь, теперь JSON-LD и RDFLib звучат не как абстрактные академические термины, а как инструменты, которые реально можно и нужно использовать. Experiment, explore, и пусть граф знаний будет с тобой!
❤2👍1
Если вы когда-либо хотели дать своим пользователям доступ к сервисам вроде Google, GitHub или Facebook, не заставляя их вбивать пароли — добро пожаловать в мир OAuth.
OAuth (Open Authorization) — это стандарт авторизации, который позволяет получать ограниченный доступ к защищённым ресурсам без передачи логина и пароля. Звучит круто? Ещё бы. И сегодня мы посмотрим, как реализовать OAuth-аутентификацию на Python, используя библиотеку Authlib — одна из самых простых и эффективных для этой задачи.
📦 Установка библиотек:
Мы будем строить небольшой Flask-сервер, через который пользователь сможет авторизоваться через, например, GitHub.
⚙️ Базовая настройка Flask и OAuth-клиента
Вам нужно будет взять значения
🌐 Маршруты Flask:
🔐 Что происходит:
1. Пользователь заходит на
2. Перебрасывается на страницу авторизации GitHub.
3. После логина возвращается на
4. Приложение получает access token и может запрашивать данные.
Теперь, не зная паролей пользователей, мы получаем информацию о них. Максимально безопасно. А если access token протухнет — можно запросить новый, не беспокоя пользователя.
🧠 Полезный совет:
Храните
🔄 А если нужен другой провайдер? Просто поменяйте ссылки и scopes. Authlib поддерживает Google, Facebook, Twitter и даже кастомные OAuth-провайдеры.
В целом, настройка OAuth через Authlib не такая уж и страшная, как может показаться на первый взгляд. Зато какой уровень удобства и безопасности! Если ваше приложение хоть как-то связано с пользователями — OAuth точно стоит освоить.
OAuth (Open Authorization) — это стандарт авторизации, который позволяет получать ограниченный доступ к защищённым ресурсам без передачи логина и пароля. Звучит круто? Ещё бы. И сегодня мы посмотрим, как реализовать OAuth-аутентификацию на Python, используя библиотеку Authlib — одна из самых простых и эффективных для этой задачи.
📦 Установка библиотек:
pip install Authlib Flask
Мы будем строить небольшой Flask-сервер, через который пользователь сможет авторизоваться через, например, GitHub.
⚙️ Базовая настройка Flask и OAuth-клиента
from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth
app = Flask(__name__)
app.secret_key = 'your-secret-key'
oauth = OAuth(app)
github = oauth.register(
name='github',
client_id='GITHUB_CLIENT_ID',
client_secret='GITHUB_CLIENT_SECRET',
access_token_url='https://github.com/login/oauth/access_token',
authorize_url='https://github.com/login/oauth/authorize',
api_base_url='https://api.github.com/',
client_kwargs={'scope': 'user:email'},
)
Вам нужно будет взять значения
client_id
и client_secret
в настройках своего GitHub OAuth-приложения.🌐 Маршруты Flask:
@app.route('/')
def homepage():
return '<a href="/login">Login with GitHub</a>'
@app.route('/login')
def login():
redirect_uri = url_for('authorize', _external=True)
return github.authorize_redirect(redirect_uri)
@app.route('/authorize')
def authorize():
token = github.authorize_access_token()
resp = github.get('user', token=token)
user_info = resp.json()
session['user'] = user_info
return f"Hello, {user_info['login']}!"
🔐 Что происходит:
1. Пользователь заходит на
/login
.2. Перебрасывается на страницу авторизации GitHub.
3. После логина возвращается на
/authorize
.4. Приложение получает access token и может запрашивать данные.
Теперь, не зная паролей пользователей, мы получаем информацию о них. Максимально безопасно. А если access token протухнет — можно запросить новый, не беспокоя пользователя.
🧠 Полезный совет:
Храните
client_id
и client_secret
не в коде, а в переменных окружения:import os
client_id = os.getenv('GITHUB_CLIENT_ID')
client_secret = os.getenv('GITHUB_CLIENT_SECRET')
🔄 А если нужен другой провайдер? Просто поменяйте ссылки и scopes. Authlib поддерживает Google, Facebook, Twitter и даже кастомные OAuth-провайдеры.
В целом, настройка OAuth через Authlib не такая уж и страшная, как может показаться на первый взгляд. Зато какой уровень удобства и безопасности! Если ваше приложение хоть как-то связано с пользователями — OAuth точно стоит освоить.
🎨 Простейшие графические редакторы с использованием библиотеки tkinter
Каждому программисту когда-то хочется превратить консольную рутину во что-то более… зрелищное. Если вы только начинаете осваивать Python – отличной отправной точкой может стать создание собственного графического редактора с помощью tkinter, стандартной библиотеки GUI в Python.
Да-да, самый настоящий Paint в несколько десятков строк!
tkinter поставляется в комплекте с Python, так что ничего дополнительно устанавливать не нужно. Запускаем редактор – и рисуем прямо мышкой. Прекрасная демонстрация того, как события и интерактивность работают в Python.
Разберем базовую версию редактора — с возможностью рисования линий мышкой.
Вот простой пример:
Что здесь происходит:
- Мы создаем окно и холст (canvas), на котором можно рисовать.
- Событие
-
Теперь добавим выбор цвета — немного разнообразия:
Добавим в класс:
Хотите очистить холст? Пожалуйста:
В результате — у нас простенький редактор с выбором цвета и кнопкой очистки. Интересно? На основе такой базы можно реализовать:
- выбор толщины линии;
- сохранение в PNG (с помощью PIL);
- разные инструменты (овал, прямоугольник, ластик — да, просто белая линия!);
- undo/redo с помощью хранения команд;
- и даже распознавание фигур, если вы фанат ML.
tkinter — отличный способ перейти из мира print('Hello') в более наглядный и живой Python. Начните с мини-графредактора, а дальше — рамки только в вашем воображении.
Каждому программисту когда-то хочется превратить консольную рутину во что-то более… зрелищное. Если вы только начинаете осваивать Python – отличной отправной точкой может стать создание собственного графического редактора с помощью tkinter, стандартной библиотеки GUI в Python.
Да-да, самый настоящий Paint в несколько десятков строк!
tkinter поставляется в комплекте с Python, так что ничего дополнительно устанавливать не нужно. Запускаем редактор – и рисуем прямо мышкой. Прекрасная демонстрация того, как события и интерактивность работают в Python.
Разберем базовую версию редактора — с возможностью рисования линий мышкой.
Вот простой пример:
import tkinter as tk
class SimplePaint:
def __init__(self, root):
self.root = root
self.root.title("Mini Paint")
self.canvas = tk.Canvas(root, bg="white", width=600, height=400)
self.canvas.pack(fill=tk.BOTH, expand=True)
self.last_x, self.last_y = None, None
self.canvas.bind("<Button-1>", self.start_draw)
self.canvas.bind("<B1-Motion>", self.draw_line)
def start_draw(self, event):
self.last_x, self.last_y = event.x, event.y
def draw_line(self, event):
x, y = event.x, event.y
self.canvas.create_line(self.last_x, self.last_y, x, y, fill="black", width=2)
self.last_x, self.last_y = x, y
root = tk.Tk()
app = SimplePaint(root)
root.mainloop()
Что здесь происходит:
- Мы создаем окно и холст (canvas), на котором можно рисовать.
- Событие
<Button-1>
(нажатие левой кнопки мыши) отслеживает начало рисования.-
<B1-Motion>
ловит перемещения мыши при нажатой кнопке и соединяет координаты линиями.Теперь добавим выбор цвета — немного разнообразия:
from tkinter.colorchooser import askcolor
def choose_color():
color = askcolor()[1]
if color:
app.current_color = color
color_btn = tk.Button(root, text="Color", command=choose_color)
color_btn.pack()
Добавим в класс:
self.current_color = "black"
...
self.canvas.create_line(self.last_x, self.last_y, x, y, fill=self.current_color, width=2)
Хотите очистить холст? Пожалуйста:
def clear_canvas():
app.canvas.delete("all")
clear_btn = tk.Button(root, text="Clear", command=clear_canvas)
clear_btn.pack()
В результате — у нас простенький редактор с выбором цвета и кнопкой очистки. Интересно? На основе такой базы можно реализовать:
- выбор толщины линии;
- сохранение в PNG (с помощью PIL);
- разные инструменты (овал, прямоугольник, ластик — да, просто белая линия!);
- undo/redo с помощью хранения команд;
- и даже распознавание фигур, если вы фанат ML.
tkinter — отличный способ перейти из мира print('Hello') в более наглядный и живой Python. Начните с мини-графредактора, а дальше — рамки только в вашем воображении.
🎨 Создание собственных графических эффектов для веб-приложений с помощью Python
Python и графика — казалось бы, редкое сочетание, особенно когда речь идёт о вебе. Но всё меняется, когда на сцену выходит библиотека Pillow и генерация изображений на лету. Сегодня мы разберёмся, как с помощью Python можно создавать крутые графические эффекты и динамически генерировать изображения для веба — от градиентов и шумов до генеративного дизайна.
Начнём с основ: Pillow — это форк знаменитой библиотеки PIL (Python Imaging Library). Она позволяет создавать и редактировать изображения прямо на сервере. Например, вы можете генерировать карточки товаров, баннеры, визуальные паттерны, аватары или фоновые текстуры прямо в момент запроса.
Установка:
Теперь представим, что вы хотите создать динамический градиентный фон с шумом для веб-обложки. Вот простой пример:
Результат — красивый градиент с шумом, который отлично подойдёт для стильного фона на лендинге или карточке товара. И, что важно, он уникален при каждом запуске.
Теперь представим, что вы хотите добавить эффект текста с тенью:
Вы можете встроить это изображение прямо в ваше веб-приложение на Flask:
Этот эндпоинт отдаёт сгенерированное изображение при каждом запросе. Можно играться с параметрами URL (например, передавать текст или цвет) и получать кастомизированные баннеры под каждого пользователя. Даже SVG или фильтры постобработки можно внедрять — хотя они больше подойдут для frontend'а, но и на сервере через библиотеки Cairo или Wand (обёртка ImageMagick) можно зажечь любую искру фантазии.
Создание графических эффектов на Python — это не просто утилита, это целое направление, открывающее двери к генеративному дизайну, динамической персонализации и неожиданному креативу прямо со стороны бэкенда. И, что немаловажно, всё работает быстро, просто и контролируемо.
Такой подход идеально подойдёт для тех, кто хочет поднять визуальный уровень своего веб-приложения без тяжёлой артиллерии вроде Photoshop или Canvas API. А ведь это только начало.
Python и графика — казалось бы, редкое сочетание, особенно когда речь идёт о вебе. Но всё меняется, когда на сцену выходит библиотека Pillow и генерация изображений на лету. Сегодня мы разберёмся, как с помощью Python можно создавать крутые графические эффекты и динамически генерировать изображения для веба — от градиентов и шумов до генеративного дизайна.
Начнём с основ: Pillow — это форк знаменитой библиотеки PIL (Python Imaging Library). Она позволяет создавать и редактировать изображения прямо на сервере. Например, вы можете генерировать карточки товаров, баннеры, визуальные паттерны, аватары или фоновые текстуры прямо в момент запроса.
Установка:
pip install pillow
Теперь представим, что вы хотите создать динамический градиентный фон с шумом для веб-обложки. Вот простой пример:
from PIL import Image, ImageDraw
import random
width, height = 800, 400
image = Image.new("RGB", (width, height))
draw = ImageDraw.Draw(image)
for y in range(height):
color = (int(255 * (y / height)), 100, 200)
draw.line([(0, y), (width, y)], fill=color)
for _ in range(10000):
x = random.randint(0, width - 1)
y = random.randint(0, height - 1)
noise_color = (random.randint(200, 255), random.randint(200, 255), random.randint(200, 255))
image.putpixel((x, y), noise_color)
image.save("gradient_noise.png")
Результат — красивый градиент с шумом, который отлично подойдёт для стильного фона на лендинге или карточке товара. И, что важно, он уникален при каждом запуске.
Теперь представим, что вы хотите добавить эффект текста с тенью:
from PIL import ImageFont
font = ImageFont.truetype("arial.ttf", 48)
text = "Hello, Web!"
draw.text((52, 152), text, font=font, fill=(0,0,0)) # Shadow
draw.text((50, 150), text, font=font, fill=(255,255,255)) # Main text
Вы можете встроить это изображение прямо в ваше веб-приложение на Flask:
from flask import Flask, send_file
import io
app = Flask(__name__)
@app.route("/banner")
def banner():
img = Image.new("RGB", (600, 200), color=(30, 30, 30))
draw = ImageDraw.Draw(img)
draw.text((50, 80), "Welcome!", fill=(255, 255, 255))
buf = io.BytesIO()
img.save(buf, format="PNG")
buf.seek(0)
return send_file(buf, mimetype='image/png')
Этот эндпоинт отдаёт сгенерированное изображение при каждом запросе. Можно играться с параметрами URL (например, передавать текст или цвет) и получать кастомизированные баннеры под каждого пользователя. Даже SVG или фильтры постобработки можно внедрять — хотя они больше подойдут для frontend'а, но и на сервере через библиотеки Cairo или Wand (обёртка ImageMagick) можно зажечь любую искру фантазии.
Создание графических эффектов на Python — это не просто утилита, это целое направление, открывающее двери к генеративному дизайну, динамической персонализации и неожиданному креативу прямо со стороны бэкенда. И, что немаловажно, всё работает быстро, просто и контролируемо.
Такой подход идеально подойдёт для тех, кто хочет поднять визуальный уровень своего веб-приложения без тяжёлой артиллерии вроде Photoshop или Canvas API. А ведь это только начало.
👍1
Если вы работаете с данными, то, скорее всего, не раз сталкивались с необходимостью обрабатывать большие объемы информации: забирать файлы из хранилищ, преобразовывать их, фильтровать, грузить в базу данных. Весь этот процесс называется ETL — Extract, Transform, Load. И если делать его вручную — это скучно, ошибкоопасно и просто не масштабируется. А вот автоматизация… вот здесь всё действительно интересно.
Сегодня расскажу, как совместить мощную визуальную платформу Apache Nifi и Python-скрипты, чтобы создать эффективный, гибкий и надёжный ETL-пайплайн. Да, можно обойтись одним Python, но Nifi значительно упрощает потоковую обработку данных, а Python добавляет нужной гибкости.
🔧 Что такое Apache Nifi?
Это open-source инструмент от Apache для автоматической передачи и обработки данных в режиме реального времени. Работает через веб-интерфейс: «нажал, соединил, запустил». Поддерживает более 300 встроенных процессоров (загрузка FTP, HTTP, базы данных, фильтрация, устранение дубликатов и т.д.)
Теперь представьте: у вас есть CSV-файлы с данными, ежедневно падающие на удалённый сервер, и вам нужно:
- Скачивать их
- Преобразовывать
- Загружать в PostgreSQL
Разберём, как это сделать с помощью Apache Nifi и Python.
🛠 Пример пайплайна с Python-скриптом в Nifi
1. Используем процессор GetFile или ListFTP + FetchFile, чтобы забирать CSV.
2. Далее применим ExecuteScript — здесь встроим Python-обработчик CSV.
3. Последний шаг — PutDatabaseRecord для загрузки данных в базу.
💡 Пример Python-обработки CSV в ExecuteScript:
⚠️ Важно: ExecuteScript использует Jython, где модулей вроде pandas нет, но для базовых трансформаций его хватает. Для более сложных случаев можно использовать ExecuteStreamCommand, передав управление вашему внешнему Python 3 скрипту.
🎯 Заключение
Apache Nifi позволяет «рисовать» ETL-пайплайны — быстро, надёжно, наглядно. Python, в свою очередь, расширяет возможности и точечно применим там, где встроенных средств Nifi не хватает. Вместе эти инструменты дают почти безграничную мощность в обработке данных. В следующем посте покажу, как подключить мониторинг и логирование пайплайна, чтобы спать спокойно.
Сегодня расскажу, как совместить мощную визуальную платформу Apache Nifi и Python-скрипты, чтобы создать эффективный, гибкий и надёжный ETL-пайплайн. Да, можно обойтись одним Python, но Nifi значительно упрощает потоковую обработку данных, а Python добавляет нужной гибкости.
🔧 Что такое Apache Nifi?
Это open-source инструмент от Apache для автоматической передачи и обработки данных в режиме реального времени. Работает через веб-интерфейс: «нажал, соединил, запустил». Поддерживает более 300 встроенных процессоров (загрузка FTP, HTTP, базы данных, фильтрация, устранение дубликатов и т.д.)
Теперь представьте: у вас есть CSV-файлы с данными, ежедневно падающие на удалённый сервер, и вам нужно:
- Скачивать их
- Преобразовывать
- Загружать в PostgreSQL
Разберём, как это сделать с помощью Apache Nifi и Python.
🛠 Пример пайплайна с Python-скриптом в Nifi
1. Используем процессор GetFile или ListFTP + FetchFile, чтобы забирать CSV.
2. Далее применим ExecuteScript — здесь встроим Python-обработчик CSV.
3. Последний шаг — PutDatabaseRecord для загрузки данных в базу.
💡 Пример Python-обработки CSV в ExecuteScript:
# Используется Jython (Python 2.7), встроенный в Nifi
import csv
import io
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets
flow_file = session.get()
if flow_file is not None:
try:
content = IOUtils.toString(session.read(flow_file), StandardCharsets.UTF_8)
reader = csv.DictReader(io.StringIO(content))
transformed = []
for row in reader:
row['full_name'] = f"{row['first_name']} {row['last_name']}"
row['age'] = int(row['age'])
transformed.append(row)
output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=transformed[0].keys())
writer.writeheader()
writer.writerows(transformed)
flow_file = session.write(flow_file, lambda out: out.write(output.getvalue().encode('utf-8')))
session.transfer(flow_file, REL_SUCCESS)
except Exception as e:
session.transfer(flow_file, REL_FAILURE)
⚠️ Важно: ExecuteScript использует Jython, где модулей вроде pandas нет, но для базовых трансформаций его хватает. Для более сложных случаев можно использовать ExecuteStreamCommand, передав управление вашему внешнему Python 3 скрипту.
🎯 Заключение
Apache Nifi позволяет «рисовать» ETL-пайплайны — быстро, надёжно, наглядно. Python, в свою очередь, расширяет возможности и точечно применим там, где встроенных средств Nifi не хватает. Вместе эти инструменты дают почти безграничную мощность в обработке данных. В следующем посте покажу, как подключить мониторинг и логирование пайплайна, чтобы спать спокойно.
Когда программисты слышат «машинное обучение» и «мобильные приложения» в одном предложении, у многих в голове сразу возникает вопрос: «А как это вообще возможно с Python?» Ведь Python — язык высокоуровневый, не самый быстрый, а приложения должны быть легкими и быстрыми! Но — спешу вас удивить — Python отлично подходит для подготовки и даже частичной интеграции моделей машинного обучения в мобильные приложения. Главное — грамотно подключить инструменты.
Сегодня разберём, как внедрить ML-модели, написанные на Python, в мобильное приложение: от обучения до запуска на смартфоне.
📦 Подготовка модели в Python
Нам понадобится
Итак, модель обучена и сохранена. Но
🔧 Конвертация модели для мобильного применения
В случае с TensorFlow используем
Теперь у нас есть файл
📱 Внедрение в Android-приложение
Если вы используете Android (например, пишете UI на Kotlin), то подключаете TensorFlow Lite через зависимость
А что если хочется Python'а и на уровне мобильного приложения? Есть выход — Kivy.
🐍 Kivy — Python на мобильных
Kivy позволяет создавать кроссплатформенные мобильные приложения на Python. С ML-моделями он тоже дружит, но есть нюанс: модели должны быть в легковесном формате, желательно
Пример сопровождения модели в Kivy:
Запустить такой код можно на Android, если собрать приложение используя
🎯 Итог
Python отлично подходит для подготовки и оптимизации ML-моделей. После этого вы можете:
- Преобразовать модель в
- Использовать фреймворки (Kivy, BeeWare) для написания мобильных приложений на Python с ML;
- Или же организовать backend на Flask/FastAPI, а мобильное приложение будет слать туда запросы (но это уже другая история).
Так что, машинное обучение и мобильная разработка — совместимы. А Python — это не только про расчёты, но и про реальные приложения прямо в ваших карманах.
Сегодня разберём, как внедрить ML-модели, написанные на Python, в мобильное приложение: от обучения до запуска на смартфоне.
📦 Подготовка модели в Python
Нам понадобится
scikit-learn
, tensorflow
или pytorch
— выбор зависит от задачи. Допустим, мы хотим обучить простую модель для распознавания рукописных цифр с помощью TensorFlow
.import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
(x_train, y_train), (x_test, y_test) = mnist.load_data()
model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
model.save('mnist_model.h5')
Итак, модель обучена и сохранена. Но
.h5
— не совсем мобильный формат. Дальше — оптимизация.🔧 Конвертация модели для мобильного применения
В случае с TensorFlow используем
TensorFlow Lite
— формат, специально созданный для мобильных и встроенных устройств.import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model('mnist_model.h5')
tflite_model = converter.convert()
with open('mnist_model.tflite', 'wb') as f:
f.write(tflite_model)
Теперь у нас есть файл
mnist_model.tflite
, который можно встроить в Android или iOS-приложение.📱 Внедрение в Android-приложение
Если вы используете Android (например, пишете UI на Kotlin), то подключаете TensorFlow Lite через зависимость
implementation "org.tensorflow:tensorflow-lite:2.x.y"
, кладёте .tflite
файл в assets и вызываете модель прямо из Java/Kotlin-кода. Это уже не Python, но вся машинная логика осталась нашей.А что если хочется Python'а и на уровне мобильного приложения? Есть выход — Kivy.
🐍 Kivy — Python на мобильных
Kivy позволяет создавать кроссплатформенные мобильные приложения на Python. С ML-моделями он тоже дружит, но есть нюанс: модели должны быть в легковесном формате, желательно
.tflite
или сериализованные NumPy-объекты.Пример сопровождения модели в Kivy:
import numpy as np
import tensorflow as tf
from kivy.app import App
from kivy.uix.label import Label
class MLApp(App):
def build(self):
interpreter = tf.lite.Interpreter(model_path="mnist_model.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# dummy input
input_data = np.random.rand(1, 28, 28).astype(np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
prediction = interpreter.get_tensor(output_details[0]['index'])
return Label(text=f'Prediction: {np.argmax(prediction)}')
MLApp().run()
Запустить такой код можно на Android, если собрать приложение используя
buildozer
.🎯 Итог
Python отлично подходит для подготовки и оптимизации ML-моделей. После этого вы можете:
- Преобразовать модель в
tflite
и встроить её в нативные Android/iOS-приложения;- Использовать фреймворки (Kivy, BeeWare) для написания мобильных приложений на Python с ML;
- Или же организовать backend на Flask/FastAPI, а мобильное приложение будет слать туда запросы (но это уже другая история).
Так что, машинное обучение и мобильная разработка — совместимы. А Python — это не только про расчёты, но и про реальные приложения прямо в ваших карманах.
🎨 Работа с сериями изображений в Python с помощью scikit-image
Python — незаменимый инструмент для обработки изображений. Когда дело доходит до работы с несколькими изображениями — будь то слайд-шоу, кадры с камеры или серия снимков для ML-проекта — нам нужно что-то мощное и удобное. И тут на сцену выходит scikit-image.
Scikit-image — это библиотека на базе NumPy, предназначенная для обработки изображений. Она умеет всё: от базовой фильтрации до сложного анализа форм и объектов. А ещё — она умеет работать с сериями изображений.
📦 Установка:
Если вы ещё не установили библиотеку:
🔍 Загрузка серии изображений
Допустим, у вас есть папка с изображениями
Теперь
🛠️ Обработка серии
Допустим, вы хотите перевести все кадры в оттенки серого. Можно использовать
Хотите применить фильтр Гаусса ко всем изображениям?
📊 Построим гистограммы яркости
Иногда нужно проанализировать распределение яркости в серии. Используем
🎞️ Построение таймлапса
Допустим, вы обработали серию и теперь хотите сохранить новую последовательность:
🧠 Идеи для практики:
- Сделайте маску объектов на каждом кадре с помощью
- Выделите контуры с
- Сравните движение объектов между изображениями.
Scikit-image — настоящий швейцарский нож в мире изображений. Он понятен, лаконичен и отлично дружит с NumPy. Работать с сериями изображений с его помощью — одно удовольствие, а возможности практически безграничны.
Python — незаменимый инструмент для обработки изображений. Когда дело доходит до работы с несколькими изображениями — будь то слайд-шоу, кадры с камеры или серия снимков для ML-проекта — нам нужно что-то мощное и удобное. И тут на сцену выходит scikit-image.
Scikit-image — это библиотека на базе NumPy, предназначенная для обработки изображений. Она умеет всё: от базовой фильтрации до сложного анализа форм и объектов. А ещё — она умеет работать с сериями изображений.
📦 Установка:
Если вы ещё не установили библиотеку:
pip install scikit-image
🔍 Загрузка серии изображений
Допустим, у вас есть папка с изображениями
.png
или .jpg
. Вместо того чтобы грузить каждое вручную, используем skimage.io.imread_collection
.from skimage.io import imread_collection
images = imread_collection('images/*.png') # Загружаем все .png из папки images
Теперь
images
— это коллекция, с которой можно обращаться как со списком. Например, images[0]
— первое изображение, а len(images)
— общее количество.🛠️ Обработка серии
Допустим, вы хотите перевести все кадры в оттенки серого. Можно использовать
skimage.color.rgb2gray
:from skimage.color import rgb2gray
gray_images = [rgb2gray(img) for img in images]
Хотите применить фильтр Гаусса ко всем изображениям?
from skimage.filters import gaussian
blurred = [gaussian(img, sigma=1) for img in gray_images]
📊 Построим гистограммы яркости
Иногда нужно проанализировать распределение яркости в серии. Используем
skimage.exposure.histogram
:from skimage.exposure import histogram
import matplotlib.pyplot as plt
for i, img in enumerate(gray_images[:3]):
hist, hist_centers = histogram(img)
plt.plot(hist_centers, hist, label=f'Image {i}')
plt.legend()
plt.title("Brightness histograms")
plt.show()
🎞️ Построение таймлапса
Допустим, вы обработали серию и теперь хотите сохранить новую последовательность:
from skimage.io import imsave
import os
output_dir = 'processed'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for i, img in enumerate(blurred):
imsave(f'{output_dir}/frame_{i:03d}.png', img)
🧠 Идеи для практики:
- Сделайте маску объектов на каждом кадре с помощью
skimage.filters.threshold_otsu
.- Выделите контуры с
skimage.feature.canny
.- Сравните движение объектов между изображениями.
Scikit-image — настоящий швейцарский нож в мире изображений. Он понятен, лаконичен и отлично дружит с NumPy. Работать с сериями изображений с его помощью — одно удовольствие, а возможности практически безграничны.
Привет! Сегодня мы окунемся в мир ORM — Object-Relational Mapping. Звучит как заклинание, да? На деле, всё проще: ORM позволяет работать с базой данных, как будто вы работаете с обычными объектами Python. Больше никаких SQL-запросов, только чистый, приятный код. Давайте разберемся, как это работает и чем нам это может помочь.
Представьте, вы пишете блог (как я!) и хотите хранить информацию о статьях: заголовок, текст, дату публикации. Можно, конечно, вручную конструировать SQL-запросы, трекать подключения к базе, писать конвертацию типов. А можно — просто использовать ORM, например, SQLAlchemy или Peewee.
Начнем с SQLAlchemy — одного из самых популярных вариантов.
Устанавливаем:
Создадим простое приложение:
Готово! Мы только что:
- Создали таблицу в SQLite без единого SQL-запроса
- Вставили новую запись в базу данных
- Использовали объектно-ориентированный подход
Если вы знакомы с Django, то знаете, что у него свой встроенный ORM — возможно, один из лучших для быстрого старта. Но если вы хотите легковесность и контроль — SQLAlchemy и Peewee (более минималистичный вариант) вас приятно удивят.
Для сравнения — как выглядит чтение данных:
Или обновление:
Да, ORM не избавляет от необходимости думать о данных, транзакциях и индексации. Но он делает код чище, безопаснее и легче в сопровождении.
Совет: используйте ORM везде, где важна читаемость и масштабируемость проекта. Особенно, если вы работаете в команде — структура кода будет единообразной, и новому участнику будет проще разобраться.
В следующий раз расскажу, как связать несколько таблиц и делать отношения "один-ко-многим" в ORM-стиле. А пока — протестируйте код выше, поэкспериментируйте. Ведь лучший способ выучить ORM — начать его действительно использовать!
Представьте, вы пишете блог (как я!) и хотите хранить информацию о статьях: заголовок, текст, дату публикации. Можно, конечно, вручную конструировать SQL-запросы, трекать подключения к базе, писать конвертацию типов. А можно — просто использовать ORM, например, SQLAlchemy или Peewee.
Начнем с SQLAlchemy — одного из самых популярных вариантов.
Устанавливаем:
pip install sqlalchemy
Создадим простое приложение:
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import declarative_base, sessionmaker
from datetime import datetime
Base = declarative_base()
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True)
title = Column(String)
content = Column(String)
published_at = Column(DateTime, default=datetime.utcnow)
# Настраиваем соединение с SQLite
engine = create_engine('sqlite:///blog.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
# Создаем и сохраняем пост
new_post = Post(title="My First ORM Post", content="ORMs make life easier!")
session.add(new_post)
session.commit()
Готово! Мы только что:
- Создали таблицу в SQLite без единого SQL-запроса
- Вставили новую запись в базу данных
- Использовали объектно-ориентированный подход
Если вы знакомы с Django, то знаете, что у него свой встроенный ORM — возможно, один из лучших для быстрого старта. Но если вы хотите легковесность и контроль — SQLAlchemy и Peewee (более минималистичный вариант) вас приятно удивят.
Для сравнения — как выглядит чтение данных:
posts = session.query(Post).filter(Post.title.like("%ORM%")).all()
for post in posts:
print(post.title, post.published_at)
Или обновление:
post = session.query(Post).first()
post.title = "Updated title"
session.commit()
Да, ORM не избавляет от необходимости думать о данных, транзакциях и индексации. Но он делает код чище, безопаснее и легче в сопровождении.
Совет: используйте ORM везде, где важна читаемость и масштабируемость проекта. Особенно, если вы работаете в команде — структура кода будет единообразной, и новому участнику будет проще разобраться.
В следующий раз расскажу, как связать несколько таблиц и делать отношения "один-ко-многим" в ORM-стиле. А пока — протестируйте код выше, поэкспериментируйте. Ведь лучший способ выучить ORM — начать его действительно использовать!
👍1