Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для URL, имени файла, имени объекта в каком-то софте и тд. Требования совместимости простые: в тексте должны быть только допустимые символы. Обычно это a-z, 0-9 и "_" или "-". То есть, только прописные буквы латинского алфавита и цифры (как пример).
Допустим, нам нужно название статьи в блоге преобразовать в slug для добавления его в URL этой статьи. Как это лучше всего сделать?
В Django по умолчанию есть готовая функция slugify для таких случаев.
Но я её никогда не использую. Почему? Потому что её недостаточно!
Приведём пример
Так как я часто пишу сайты для русскоязычных пользователей эта проблема весьма актуальна. Я не использую стандартную функцию и всегда пишу свою.
Оригинал я не беру в расчёт и пишу полностью свою функцию. И так, по порядку:
🔸1. Исходный текст:
🔸2. Транслит
Необходимо сделать транслит всех символов в латиницу. Здесь очень выручает библиотека unidecode. Помимо простого транслита кириллицы в латиницу она умеет преобразовывать спец символы и иероглифы в текстовые аналоги.
В нашем случае получаем такое преобразование:
А еще наш код уже поддерживает любой язык, будь то хинди или корейский.
🔸4. Фильтр символов
Unidecode не занимается фильтрацией по недопустимым символам. Это мы делаем в следующем шаге через regex. Просто заменим все символы на "_" если они вне указанного диапазона.
🔸5. Slugify
Осталось удалить лишние символы по краям и сделать нижний регистр
🌎 Полный код в виде функции.
______________
PS. Проверку что в строке остался хоть один допустимый символ я бы вынес в отдельную функцию.
#libs #tricks #django
Допустим, нам нужно название статьи в блоге преобразовать в 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
GitHub
django/django/utils/text.py at main · django/django
The Web framework for perfectionists with deadlines. - django/django
По аналогии с PEP у Django есть DEP.
Самый интересный для меня на данный момент на это DEP 0009: Async-capable Django. Он про то, как будет внедряться поддержка аснихронности.
Начиная с версии 3 в Django начали появляться асинхронные плюшки. Это всё еще мало чтобы делать асинхронное приложение, но долгий путь начинается с одного маленького шага!
Всё должно пройти в несколько этапов и к 4й версии обещают сделать Django асинхронным!
Что это даёт разработчикам в случае если весь фреймворк станет поддерживать async?
- Ускорение работы web-приложения? Если правильно писать асинхронный код, то да.
- Усложнение кода? Возможно, но фреймворк на то и фреймворк, чтобы прятать сложности где-то внутри. Надеюсь код усложнится не сильно, посмотрим...
И когда нам этого ожидать? Судя по этой схемке Django 4 выйдет в Декабре 2021 года. А это значит, что у вас есть примерно год чтобы научиться понимать асинхронный код, если еще не умеете😁
#django #pep
Самый интересный для меня на данный момент на это DEP 0009: Async-capable Django. Он про то, как будет внедряться поддержка аснихронности.
Начиная с версии 3 в Django начали появляться асинхронные плюшки. Это всё еще мало чтобы делать асинхронное приложение, но долгий путь начинается с одного маленького шага!
Всё должно пройти в несколько этапов и к 4й версии обещают сделать Django асинхронным!
Что это даёт разработчикам в случае если весь фреймворк станет поддерживать async?
- Ускорение работы web-приложения? Если правильно писать асинхронный код, то да.
- Усложнение кода? Возможно, но фреймворк на то и фреймворк, чтобы прятать сложности где-то внутри. Надеюсь код усложнится не сильно, посмотрим...
И когда нам этого ожидать? Судя по этой схемке Django 4 выйдет в Декабре 2021 года. А это значит, что у вас есть примерно год чтобы научиться понимать асинхронный код, если еще не умеете😁
#django #pep
GitHub
GitHub - django/deps: Django Enhancement Proposals
Django Enhancement Proposals. Contribute to django/deps development by creating an account on GitHub.
В Python есть удобный почтовый debug-сервер. Он поможет проверить работу почты вашего web-проекта на этапе разработки без необходимости настраивать внешние сервисы или взаимодействие с реальными серверами Google или Yandex. Этот сервер просто печатает все сообщения в консоль.
Таким образом удобно дебажить одноразовые ссылки активации или просто факт отправки письма по расписанию.
Запускается очень просто:
Таким образом удобно дебажить одноразовые ссылки активации или просто факт отправки письма по расписанию.
Запускается очень просто:
python3 -m smtpd -n -c DebuggingServer localhost:1025Теперь настройте ваш проект на использование этого сервера. Например вот так настраивается Django:
# settings.py#django #tricks
if DEBUG:
EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = '[email protected]'
Стандартная Django админка работает стабильно но не могу сказать что она меня устраивает. Да, есть базовый набор стандартного функционала, но чего-то всегда не хватает. Может автокомплитов а может тёмной темы. 😎
Долгое время я использовал DjangoSuit, но проект заглох на невыпущенной альфе 2й версии которая в Django3 и вовсе не поддерживается.
Что же можно сегодня посоветовать?
На сегодняшний день у меня два фаворита:
🚀 DjangoJET
🌎 сайт
🗄 репозиторий
▶️ видео
Крутая и красивая админка с кучей плюшек.
▫️автокомплиты с AJAX подгрузкой
▫️темы
▫️дашборды
▫️респонсив
▫️кастомизация панелей прямо в админке
Стоит денег для коммерческих продуктов. Для опенсорса бесплатно (AGPL)!
🎷 Django Jazzmin
🗄репозиторий
Не такая пафосная но от этого не менее крутая админка.
▫️полностью кастомизируется
▫️много готовых тем и возможность собрать свою прямо в админке
▫️Bootsrtap Model окна вместо всплывающих окон
▫️интегрирован Select2
▫️респонсив
Знаете еще крутые админки? Напишите в комментах!
#django #libs
Долгое время я использовал DjangoSuit, но проект заглох на невыпущенной альфе 2й версии которая в Django3 и вовсе не поддерживается.
Что же можно сегодня посоветовать?
На сегодняшний день у меня два фаворита:
🚀 DjangoJET
🌎 сайт
🗄 репозиторий
▶️ видео
Крутая и красивая админка с кучей плюшек.
▫️автокомплиты с AJAX подгрузкой
▫️темы
▫️дашборды
▫️респонсив
▫️кастомизация панелей прямо в админке
Стоит денег для коммерческих продуктов. Для опенсорса бесплатно (AGPL)!
🎷 Django Jazzmin
🗄репозиторий
Не такая пафосная но от этого не менее крутая админка.
▫️полностью кастомизируется
▫️много готовых тем и возможность собрать свою прямо в админке
▫️Bootsrtap Model окна вместо всплывающих окон
▫️интегрирован Select2
▫️респонсив
Знаете еще крутые админки? Напишите в комментах!
#django #libs
На днях вышел Django 5.
▫️ GeneratedField
Поля, которые автоматически рассчитываются по экспрешену (Database generated model field).
▫️Фасетный фильтр для админки
Показывает количество элементов для каждого фильтра.
▫️Async
Добавлены асинхроные функции django.contrib.auth, ORM. Ряд декораторов теперь поддерживаются асинхронными вьюшками.
▫️ORM
Новые возможносте полей, такие как поддержка словарей и функций в choices, дефолтные значения на стороне БД (Database-computed default values) с аргументом db_default и другие.
▫️Шаблоны
Новые возможности шаблонов, позволяющие писать меньше кода в формах.
#django
▫️ GeneratedField
Поля, которые автоматически рассчитываются по экспрешену (Database generated model field).
▫️Фасетный фильтр для админки
Показывает количество элементов для каждого фильтра.
▫️Async
Добавлены асинхроные функции django.contrib.auth, ORM. Ряд декораторов теперь поддерживаются асинхронными вьюшками.
▫️ORM
Новые возможносте полей, такие как поддержка словарей и функций в choices, дефолтные значения на стороне БД (Database-computed default values) с аргументом db_default и другие.
▫️Шаблоны
Новые возможности шаблонов, позволяющие писать меньше кода в формах.
#django
🎉5❤1