Python Заметки
2.31K subscribers
58 photos
2 videos
2 files
212 links
Интересные заметки и обучающие материалы по Python

Контакт: @paulwinex

⚠️ Рекламу на канале не делаю!⚠️

Хештеги для поиска:
#tricks
#libs
#pep
#basic
#regex
#qt
#django
#2to3
#source
#offtop
Download Telegram
Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для URL, имени файла, имени объекта в каком-то софте и тд. Требования совместимости простые: в тексте должны быть только допустимые символы. Обычно это a-z, 0-9 и "_" или "-". То есть, только прописные буквы латинского алфавита и цифры (как пример).

Допустим, нам нужно название статьи в блоге преобразовать в slug для добавления его в URL этой статьи. Как это лучше всего сделать?
В Django по умолчанию есть готовая функция slugify для таких случаев.
Но я её никогда не использую. Почему? Потому что её недостаточно!

Приведём пример

>>> from django.utils.text import slugify
>>> slugify('This is a Title')
'this-is-a-title'

Пока всё отлично

>>> slugify('This is a "Title!"')
'this-is-a-title'

Спец символы удалились, всё хорошо.

>>> slugify('Это заголовок статьи')
''

Вот и приехали 😢. Если текст не английский то буквы просто игнорируются. Можно это поправить

>>> slugify('Это заголовок статьи', allow_unicode=True)
'это-заголовок-статьи'

Но тогда мы не вписываемся в условие. У нас появилась кириллица в тексте.

Так как я часто пишу сайты для русскоязычных пользователей эта проблема весьма актуальна. Я не использую стандартную функцию и всегда пишу свою.

Оригинал я не беру в расчёт и пишу полностью свою функцию. И так, по порядку:

🔸1. Исходный текст:

>>> text = 'Мой заголовок №10 😁!'

Взял специально посложней со специальными символами.

🔸2. Транслит

Необходимо сделать транслит всех символов в латиницу. Здесь очень выручает библиотека unidecode. Помимо простого транслита кириллицы в латиницу она умеет преобразовывать спец символы и иероглифы в текстовые аналоги.

from unidecode import unidecode

>>> unidecode("Ñ Σ ® µ ¶ ¼ 月 山")
'N S (r) u P 1/4 Yue Shan'

Очень крутая библиотека, советую👍
В нашем случае получаем такое преобразование:

>>> text = unidecode(text)
>>> print(text)
'Moi zagolovok No. 10 !'

Отличный транслит. Смайл просто удалился, хотя я ждал что-то вроде :). Ну и ладно, всë равно невалидные символы.
А еще наш код уже поддерживает любой язык, будь то хинди или корейский.

🔸4. Фильтр символов

Unidecode
не занимается фильтрацией по недопустимым символам. Это мы делаем в следующем шаге через regex. Просто заменим все символы на "_" если они вне указанного диапазона.

>>> text = re.sub(r'[^a-zA-Z0-9]+', '_', text)
>>> print(text)
'Moi_zagolovok_No_10_'

Символ "+" в паттерне выручает когда несколько недопустимых символов идут рядом. Все они заменяются на один символ "_".

🔸5. Slugify

Осталось удалить лишние символы по краям и сделать нижний регистр

>>> text = text.strip('_').lower()
>>> print(text)
'moi_zagolovok_no_10'

Получаем отличный slug! 😎

🌎 Полный код в виде функции.
______________
PS. Проверку что в строке остался хоть один допустимый символ я бы вынес в отдельную функцию.

#libs #tricks #django
По аналогии с PEP у Django есть DEP.
Самый интересный для меня на данный момент на это DEP 0009: Async-capable Django. Он про то, как будет внедряться поддержка аснихронности.

Начиная с версии 3 в Django начали появляться асинхронные плюшки. Это всё еще мало чтобы делать асинхронное приложение, но долгий путь начинается с одного маленького шага!

Всё должно пройти в несколько этапов и к 4й версии обещают сделать Django асинхронным!

Что это даёт разработчикам в случае если весь фреймворк станет поддерживать async?

- Ускорение работы web-приложения? Если правильно писать асинхронный код, то да.

- Усложнение кода? Возможно, но фреймворк на то и фреймворк, чтобы прятать сложности где-то внутри. Надеюсь код усложнится не сильно, посмотрим...

И когда нам этого ожидать? Судя по этой схемке Django 4 выйдет в Декабре 2021 года. А это значит, что у вас есть примерно год чтобы научиться понимать асинхронный код, если еще не умеете😁

#django #pep
В Python есть удобный почтовый debug-сервер. Он поможет проверить работу почты вашего web-проекта на этапе разработки без необходимости настраивать внешние сервисы или взаимодействие с реальными серверами Google или Yandex. Этот сервер просто печатает все сообщения в консоль.
Таким образом удобно дебажить одноразовые ссылки активации или просто факт отправки письма по расписанию.

Запускается очень просто:

python3 -m smtpd -n -c DebuggingServer localhost:1025

Теперь настройте ваш проект на использование этого сервера. Например вот так настраивается Django:

# settings.py
if DEBUG:
EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = '[email protected]'

#django #tricks
Стандартная Django админка работает стабильно но не могу сказать что она меня устраивает. Да, есть базовый набор стандартного функционала, но чего-то всегда не хватает. Может автокомплитов а может тёмной темы. 😎

Долгое время я использовал DjangoSuit, но проект заглох на невыпущенной альфе 2й версии которая в Django3 и вовсе не поддерживается.

Что же можно сегодня посоветовать?
На сегодняшний день у меня два фаворита:

🚀 DjangoJET
🌎 сайт
🗄 репозиторий
▶️ видео

Крутая и красивая админка с кучей плюшек.
▫️автокомплиты с AJAX подгрузкой
▫️темы
▫️дашборды
▫️респонсив
▫️кастомизация панелей прямо в админке

Стоит денег для коммерческих продуктов. Для опенсорса бесплатно (AGPL)!

🎷 Django Jazzmin
🗄репозиторий

Не такая пафосная но от этого не менее крутая админка.
▫️полностью кастомизируется
▫️много готовых тем и возможность собрать свою прямо в админке
▫️Bootsrtap Model окна вместо всплывающих окон
▫️интегрирован Select2
▫️респонсив

Знаете еще крутые админки? Напишите в комментах!

#django #libs
Состоялся релиз DJANGO 4.0

Полный список изменений читаем здесь ↗️

#django
На днях вышел Django 5.

▫️ GeneratedField
Поля, которые автоматически рассчитываются по экспрешену (Database generated model field).

▫️Фасетный фильтр для админки
Показывает количество элементов для каждого фильтра.

▫️Async
Добавлены асинхроные функции django.contrib.auth, ORM. Ряд декораторов теперь поддерживаются асинхронными вьюшками.

▫️ORM
Новые возможносте полей, такие как поддержка словарей и функций в choices, дефолтные значения на стороне БД (Database-computed default values) с аргументом db_default и другие.

▫️Шаблоны
Новые возможности шаблонов, позволяющие писать меньше кода в формах.

#django
🎉51