Python для начинающих
1.06K subscribers
303 photos
3 videos
232 files
62 links
Python для начинающих
Download Telegram
- Введение в структурированное логирование с помощью модуля logging
Привет! Меня зовут Иван, и сегодня мы разберём одну из самых недооценённых суперспособностей Python — структурированное логирование! Если вы уже сталкивались с модулем 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 для управления транзакциями в базах данных
Привет, на связи Иван! Сегодня поговорим о магии управления транзакциями с помощью 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
Привет! На связи Иван. Сегодня разберём, как добавить возможность обработки изображений в ваше Python-веб-приложение. Это реальный must-have, если вы хотите, чтобы пользователи могли загружать фото и редактировать их прямо в браузере.

Модули, которые нам пригодятся — это 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 — вопрос пары строчек кода. Главное — фантазия и понимание, как устроен ваш стек. Экспериментируйте, и пусть ваше приложение станет стильнее и удобнее!

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