Привет! Меня зовут Иван, и сегодня мы разберём одну из самых недооценённых суперспособностей Python — структурированное логирование! Если вы уже сталкивались с модулем logging, но всегда ограничивались парой строчек для отладки, пришло время поднять левел вашего кода.
### Зачем вообще нужен logging?
Стандартный модуль logging позволяет не просто печатать информацию для “себя” в отладочных целях, а организовать работу вашего приложения так, чтобы логи были читаемыми, информативными и пригодными для автоматической обработки. Это особенно важно, если проект растёт, а в команде появляется ещё кто-то кроме вас.
### Быстрая стартовая конфигурация
Давайте сравним простую запись через
Казалось бы, разница невелика. Но давайте добавим структуру!
### Форматируем логи под свои нужды
С помощью
Теперь в логе — время, уровень сообщения, имя логгера, текст. Попробуйте добавить имя модуля или, например, идентификатор пользователя.
### Структурирование через дополнительный контекст
Ценность логирования растёт, когда можно структурировать данные: например, выводить идентификаторы заказов, пользователей и даже JSON.
Чтобы extra-данные появились в выводе, их нужно добавить в формат:
### Логирование в JSON (ещё шаг к структуре)
Используя сторонние библиотеки типа
### Вывод
Структурированное логирование позволит не теряться в море сообщений даже в большом проекте: вы сможете сортировать, фильтровать и анализировать свои логи как профи. Не ограничивайтесь print’ом — знакомьтесь с logging поближе, и ваши проекты станут на порядок “взрослее”!
Ваш Иван.
### Зачем вообще нужен logging?
Стандартный модуль logging позволяет не просто печатать информацию для “себя” в отладочных целях, а организовать работу вашего приложения так, чтобы логи были читаемыми, информативными и пригодными для автоматической обработки. Это особенно важно, если проект растёт, а в команде появляется ещё кто-то кроме вас.
### Быстрая стартовая конфигурация
Давайте сравним простую запись через
print()
и использование logging:import logging
logging.basicConfig(level=logging.INFO)
logging.info("User logged in")
Казалось бы, разница невелика. Но давайте добавим структуру!
### Форматируем логи под свои нужды
С помощью
format
можно задать, что и как выводить:import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s [%(levelname)s] %(name)s — %(message)s'
)
logging.info("Processing data...")
Теперь в логе — время, уровень сообщения, имя логгера, текст. Попробуйте добавить имя модуля или, например, идентификатор пользователя.
### Структурирование через дополнительный контекст
Ценность логирования растёт, когда можно структурировать данные: например, выводить идентификаторы заказов, пользователей и даже JSON.
import logging
logger = logging.getLogger("auth")
extra_info = {'user_id': 123, 'ip': '192.168.0.1'}
logger.info("Login attempt", extra=extra_info)
Чтобы extra-данные появились в выводе, их нужно добавить в формат:
logging.basicConfig(
format='%(asctime)s [%(levelname)s] %(name)s — %(message)s [User: %(user_id)s IP: %(ip)s]'
)
### Логирование в JSON (ещё шаг к структуре)
Используя сторонние библиотеки типа
python-json-logger
, формат можно сделать пригодным для автоматической обработки:from pythonjsonlogger import jsonlogger
import logging
handler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter()
handler.setFormatter(formatter)
logger = logging.getLogger("myjsonlogger")
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.info("Event processed", extra={'event_id': 555, 'status': 'success'})
### Вывод
Структурированное логирование позволит не теряться в море сообщений даже в большом проекте: вы сможете сортировать, фильтровать и анализировать свои логи как профи. Не ограничивайтесь print’ом — знакомьтесь с logging поближе, и ваши проекты станут на порядок “взрослее”!
Ваш Иван.
👍2
Привет, на связи Иван! Сегодня поговорим о магии управления транзакциями с помощью SQLAlchemy — универсального инструмента для работы с базами данных в Python.
Что такое транзакция и зачем она нужна?
Представьте, что вы обрабатываете банковский перевод: списываете деньги у одного пользователя и начисляете их другому. Что, если в середине операции отключится свет? Важно, чтобы операция либо завершилась полностью, либо не была выполнена вовсе. Здесь и вступают в игру транзакции!
SQLAlchemy не только помогает строить запросы к базе «на лету», но и позволяет контролировать целостность данных через механизмы управления транзакциями.
### Пример 1: Автоматическое управление транзакциями
Всё просто: используем контекстный менеджер
### Пример 2: Ручной контроль — commit и rollback
Иногда нужно больше контроля, например, при сложной логике:
### Преимущества
- Надежность: можно быть уверенным, что данные не останутся в «полусыром» состоянии.
- Удобство: Pythonic API и защита от ошибок.
- Гибкость: поддержка разных СУБД (PostgreSQL, SQLite, MySQL и др.).
SQLAlchemy превращает работу с транзакциями во вполне дружелюбное и безопасное занятие. Теперь вы знаете, как избегать неожиданных неприятностей при работе с базами данных на Python. Попробуйте — понравится!
Что такое транзакция и зачем она нужна?
Представьте, что вы обрабатываете банковский перевод: списываете деньги у одного пользователя и начисляете их другому. Что, если в середине операции отключится свет? Важно, чтобы операция либо завершилась полностью, либо не была выполнена вовсе. Здесь и вступают в игру транзакции!
SQLAlchemy не только помогает строить запросы к базе «на лету», но и позволяет контролировать целостность данных через механизмы управления транзакциями.
### Пример 1: Автоматическое управление транзакциями
Всё просто: используем контекстный менеджер
session.begin()
. Если внутри блока возникает исключение — все изменения автоматом откатываются.from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, Session
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
with session.begin():
new_user = User(name='Alice')
session.add(new_user)
# Закоммитили — пользователь добавлен!
### Пример 2: Ручной контроль — commit и rollback
Иногда нужно больше контроля, например, при сложной логике:
with Session(engine) as session:
try:
user1 = User(name='Bob')
session.add(user1)
# Какая-то логика, возможно, с ошибкой
if user1.name == 'Bob':
raise ValueError("Test error!")
session.commit()
except Exception:
session.rollback()
print("Транзакция отменена, все изменения откатились.")
### Преимущества
- Надежность: можно быть уверенным, что данные не останутся в «полусыром» состоянии.
- Удобство: Pythonic API и защита от ошибок.
- Гибкость: поддержка разных СУБД (PostgreSQL, SQLite, MySQL и др.).
SQLAlchemy превращает работу с транзакциями во вполне дружелюбное и безопасное занятие. Теперь вы знаете, как избегать неожиданных неприятностей при работе с базами данных на Python. Попробуйте — понравится!
👍1
Привет! На связи Иван. Сегодня разберём, как добавить возможность обработки изображений в ваше Python-веб-приложение. Это реальный must-have, если вы хотите, чтобы пользователи могли загружать фото и редактировать их прямо в браузере.
Модули, которые нам пригодятся — это
## Установка
Установим нужные библиотеки:
## Базовое приложение, принимающее изображение
Сначала напишем простейший сервер:
## Как это работает?
1. Пользователь отправляет картинку на
2. Сервер открывает изображение с помощью Pillow.
3. Обрабатывает изображение (здесь — поворот на 90 градусов).
4. Возвращает обработанный файл пользователю.
## Немного больше магии
А вот как сделать превью картинки:
А если хотите фильтр «чёрно-белое фото» — это одна строчка:
## Как попробовать?
Можно использовать Postman или curl:
## Краткие советы
- Всегда проверяйте формат изображения!
- Защитите приложение от загрузки слишком больших файлов.
- Pillow поддерживает кучу фильтров и манипуляций: кадрирование, размытие, изменение яркости и многое другое.
Обработка изображений в веб-приложениях на Python — вопрос пары строчек кода. Главное — фантазия и понимание, как устроен ваш стек. Экспериментируйте, и пусть ваше приложение станет стильнее и удобнее!
До встречи,
Иван
Модули, которые нам пригодятся — это
Flask
для сервера и легендарный Pillow
для обработки изображений. Да, всё проще, чем кажется! ## Установка
Установим нужные библиотеки:
pip install flask pillow
## Базовое приложение, принимающее изображение
Сначала напишем простейший сервер:
from flask import Flask, request, send_file
from PIL import Image
import io
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def process_image():
if 'file' not in request.files:
return "No file uploaded", 400
img_file = request.files['file']
img = Image.open(img_file.stream)
# Применим простую обработку: например, повернём изображение
img = img.rotate(90, expand=True)
buf = io.BytesIO()
img.save(buf, format='JPEG')
buf.seek(0)
return send_file(buf, mimetype='image/jpeg')
if __name__ == "__main__":
app.run(debug=True)
## Как это работает?
1. Пользователь отправляет картинку на
/upload
через POST-запрос.2. Сервер открывает изображение с помощью Pillow.
3. Обрабатывает изображение (здесь — поворот на 90 градусов).
4. Возвращает обработанный файл пользователю.
## Немного больше магии
А вот как сделать превью картинки:
img = Image.open(img_file.stream)
img.thumbnail((128, 128))
А если хотите фильтр «чёрно-белое фото» — это одна строчка:
img = img.convert('L')
## Как попробовать?
Можно использовать Postman или curl:
curl -F "file=@your_image.jpg" http://127.0.0.1:5000/upload --output result.jpg
## Краткие советы
- Всегда проверяйте формат изображения!
- Защитите приложение от загрузки слишком больших файлов.
- Pillow поддерживает кучу фильтров и манипуляций: кадрирование, размытие, изменение яркости и многое другое.
Обработка изображений в веб-приложениях на Python — вопрос пары строчек кода. Главное — фантазия и понимание, как устроен ваш стек. Экспериментируйте, и пусть ваше приложение станет стильнее и удобнее!
До встречи,
Иван
Привет! С вами Иван, и сегодня мы заглянем под обложку одного из самых популярных форматов для документов — PDF. Если вы думали, что читать, объединять или вырезать страницы из PDF — это удел только офисных программ, то пришло время познакомиться с модулем PyPDF2 в Python!
Что такое PyPDF2?
PyPDF2 — это пакет, который позволяет легко обрабатывать PDF-файлы: читать, извлекать текст, собирать вместе разные документы и даже защищать их паролем. Звучит как магия? Давайте попробуем на практике.
### Чтение PDF: быстро и просто
Допустим, у вас есть файл
Вот и всё! Открыли, прочитали первую страницу, вывели текст. Никаких танцев с бубном.
### Склейка документов: дела объединённые
Хотите объединить несколько PDF-файлов в один? Смотрите, как это делается:
Вуаля! Теперь
### Извлечение страниц: никаких лишних листов
Бывает, надо сохранить только несколько нужных страниц. За это отвечает PdfWriter:
Теперь у вас новый PDF только с выбранными страницами!
### Безопасность: ставим пароль
Если хочется оставить секретные заметки только для себя:
Теперь открыть
---
PyPDF2 делает работу с PDF простой и гибкой, как и должно быть в Python. Приложения — на любой вкус: отчеты, автоматизация документов, просто эксперименты. Надеюсь, этот краткий обзор вдохновит вас на новые проекты!
Что такое PyPDF2?
PyPDF2 — это пакет, который позволяет легко обрабатывать PDF-файлы: читать, извлекать текст, собирать вместе разные документы и даже защищать их паролем. Звучит как магия? Давайте попробуем на практике.
### Чтение PDF: быстро и просто
Допустим, у вас есть файл
sample.pdf
, и вы хотите вывести его содержимое на экран. Всё элементарно:import PyPDF2
with open('sample.pdf', 'rb') as file:
pdf_reader = PyPDF2.PdfReader(file)
page = pdf_reader.pages[0]
print(page.extract_text())
Вот и всё! Открыли, прочитали первую страницу, вывели текст. Никаких танцев с бубном.
### Склейка документов: дела объединённые
Хотите объединить несколько PDF-файлов в один? Смотрите, как это делается:
import PyPDF2
merger = PyPDF2.PdfMerger()
for pdf in ['file1.pdf', 'file2.pdf']:
merger.append(pdf)
with open('merged.pdf', 'wb') as output:
merger.write(output)
Вуаля! Теперь
merged.pdf
содержит страницы обоих исходных файлов. Быстро, изящно и удобно.### Извлечение страниц: никаких лишних листов
Бывает, надо сохранить только несколько нужных страниц. За это отвечает PdfWriter:
import PyPDF2
reader = PyPDF2.PdfReader('big.pdf')
writer = PyPDF2.PdfWriter()
for num in [0, 2]: # Например, 1-я и 3-я страницы
writer.add_page(reader.pages[num])
with open('extracted.pdf', 'wb') as out:
writer.write(out)
Теперь у вас новый PDF только с выбранными страницами!
### Безопасность: ставим пароль
Если хочется оставить секретные заметки только для себя:
import PyPDF2
reader = PyPDF2.PdfReader('open.pdf')
writer = PyPDF2.PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.encrypt('StrongPassword!')
with open('protected.pdf', 'wb') as out:
writer.write(out)
Теперь открыть
protected.pdf
без пароля не получится.---
PyPDF2 делает работу с PDF простой и гибкой, как и должно быть в Python. Приложения — на любой вкус: отчеты, автоматизация документов, просто эксперименты. Надеюсь, этот краткий обзор вдохновит вас на новые проекты!