Регулярно требуется преобразовать какой-либо текст в максимально совместимый текст для 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
🧩 По полочкам. Кэширование.
• Логически кэш представляет из себя базу типа ключ-значение. Каждая запись в кэше имеет “время жизни”, по истечении которого она удаляется. Это время называют термином Time To Live или TTL. Размер кэша гораздо меньше, чем у основного хранилища, но этот недостаток компенсируется высокой скоростью доступа к данным. Это достигается за счет размещения кэша в быстродействующей памяти RAM. Поэтому обычно кэш содержит самые “горячие” данные.
• Если тема для вас показалось интересной, то вот очень объемная статья о том, как работает кэширование. Всё по полочкам, с картинками и примерами.
➡️https://pikuma.com/blog/understanding-computer-cache
#cache
https://realpython.com/blog/python/caching-in-django-with-redis/
Caching in #Django With #Redis
Application performance is vital to the success of your product. In an environment where users expect website response times of less than a second, the consequences of a slow application can be measured in dollars and cents. Even if you are not selling anything, fast page loads improve the experience of visiting your site.
Everything that happens on the server between the moment it receives a request to the moment it returns a response increases the amount of time it takes to load a page. As a general rule of thumb, the more processing you can eliminate on the server, the faster your application will perform. Caching data after it has been processed and then serving it from the #cache the next time it is requested is one way to relieve stress on the server. In this tutorial, we will explore some of the factors that bog down your application, and we will demonstrate how to implement caching with Redis to counteract their effects.
https://pypi.python.org/pypi/python-memcached
This software is a 100% Python interface to the #memcached#memory#cache daemon. It is the #client side software which allows storing values in one or more, possibly remote, memcached servers. Search google for memcached for more information.
#cplusplus#cache#cpp#database#fibers#in_memory#in_memory_database#key_value#keydb#memcached#message_broker#multi_threading#nosql#redis#valkey#vector_search
Dragonfly is a modern in-memory data store compatible with Redis and Memcached, offering up to 25 times higher throughput and better cache efficiency while using up to 80% fewer resources. It scales well with larger servers, supports many Redis commands, and features a unique, memory-efficient cache and fast snapshotting. Dragonfly provides low latency, high performance, and is easy to configure with familiar Redis options. Its design ensures atomic operations and efficient resource use, making it ideal for fast, cost-effective cloud applications needing real-time data access and high scalability. This means you get faster, more efficient caching and data handling with minimal changes to your existing setup[5][2][4].
https://github.com/dragonflydb/dragonfly
#java#cache#caffine#data#draft#fetch#graphql#immer#immutable#immutable_collections#immutable_datastructures#java#jdbc#kotlin#orm#orm_framework#orm_library#orms#redis#redis_cache
Jimmer is a powerful and advanced ORM (Object-Relational Mapping) framework for Java and Kotlin that lets you easily read and write complex data structures without needing to predefine their shapes. It supports dynamic multi-table queries, automatic SQL optimization, and efficient saving of incomplete or nested objects. Jimmer also generates type-safe DTOs (Data Transfer Objects) for complex queries and updates, avoids common problems like "N+1" queries, and offers strong caching and GraphQL support. This means you can build complex business logic faster and with less hassle, improving both development speed and code quality. It works well with modern IDEs and supports both Java and Kotlin seamlessly.
https://github.com/babyfish-ct/jimmer