Утилиты Django¶
Этот документ охватывает все стабильные модули в django.utils
. Большинство модулей в django.utils
предназначены для внутреннего использования, и только следующие части могут считаться стабильными и, следовательно, обратно совместимыми в соответствии с internal release deprecation policy.
django.utils.cache
¶
Этот модуль содержит вспомогательные функции для управления кэшированием HTTP. Для этого он управляет заголовком Vary
в ответах. Он включает функции для прямого исправления заголовка объектов ответа и декораторы, которые изменяют функции для самостоятельного исправления заголовка.
Информацию о заголовке Vary
см. в разделе RFC 7231#section-7.1.4.
По сути, HTTP-заголовок Vary
определяет, какие заголовки кэш должен учитывать при построении ключа кэша. Запросы с одинаковым путем, но разным содержанием заголовков, указанных в Vary
>, должны получить разные ключи кэша, чтобы предотвратить доставку неверного содержимого.
Например, промежуточное ПО internationalization должно различать кэши по заголовку Accept-language
.
-
patch_cache_control
(response, **kwargs)[исходный код]¶ Эта функция исправляет заголовок
Cache-Control
, добавляя к нему все аргументы ключевых слов. Преобразование происходит следующим образом:- Все имена параметров ключевых слов переводятся в нижний регистр, а символы подчеркивания преобразуются в дефисы.
- Если значение параметра равно
True
(именноTrue
, а не просто истинное значение), в заголовок добавляется только имя параметра. - Все остальные параметры добавляются со своим значением, после применения к нему
str()
.
-
get_max_age
(response)[исходный код]¶ Возвращает max-age из заголовка Cache-Control ответа в виде целого числа (или
None
, если оно не найдено или не является целым числом).
-
patch_response_headers
(response, cache_timeout=None)[исходный код]¶ Добавляет некоторые полезные заголовки к данному объекту
HttpResponse
:Expires
Cache-Control
Каждый заголовок добавляется только в том случае, если он еще не установлен.
cache_timeout
указывается в секундах. По умолчанию используется значениеCACHE_MIDDLEWARE_SECONDS
.
-
add_never_cache_headers
(response)[исходный код]¶ Добавляет заголовок
Cache-Control: max-age=0, no-cache, no-store, must-revalidate
к ответу, чтобы указать, что страница никогда не должна кэшироваться.
-
patch_vary_headers
(response, newheaders)[исходный код]¶ Добавляет (или обновляет) заголовок
Vary
в заданный объектHttpResponse
.newheaders
- это список имен заголовков, которые должны быть вVary
. Существующие заголовки вVary
не удаляются.
-
get_cache_key
(request, key_prefix=None)[исходный код]¶ Возвращает ключ кэша на основе пути запроса. Его можно использовать на этапе запроса, поскольку он извлекает список заголовков, которые необходимо учитывать, из глобального реестра путей и использует их для создания ключа кэша для проверки.
Если список заголовков не сохранен, страницу необходимо перестроить, поэтому эта функция возвращает
None
.
-
learn_cache_key
(request, response, cache_timeout=None, key_prefix=None)[исходный код]¶ Узнает, какие заголовки следует учитывать для некоторого пути запроса из объекта ответа. Он хранит эти заголовки в глобальном реестре путей, чтобы при последующем обращении к этому пути знать, какие заголовки следует учитывать, не создавая сам объект ответа. Заголовки именуются в заголовке
Vary
ответа, но мы хотим предотвратить генерацию ответа.Список заголовков, используемых для генерации ключа кэша, хранится в том же кэше, что и сами страницы. Если кэш старит некоторые данные из кэша, это означает, что нам нужно один раз построить ответ, чтобы получить заголовок Vary и список заголовков для ключа кэша.
django.utils.dateparse
¶
Функции, определенные в этом модуле, обладают следующими свойствами:
- Они принимают строки в форматах даты/времени ISO 8601 (или некоторые близкие альтернативы) и возвращают объекты из соответствующих классов модуля Python
datetime
. - Они поднимают
ValueError
, если их ввод хорошо отформатирован, но не является действительной датой или временем. - Они возвращают
None
, если он вообще плохо отформатирован. - Они принимают входные данные с разрешением до пикосекунд, но усекают их до микросекунд, поскольку именно это поддерживает Python.
-
parse_date
(value)[исходный код]¶ Разбирает строку и возвращает
datetime.date
.
-
parse_time
(value)[исходный код]¶ Разбирает строку и возвращает
datetime.time
.Смещение по UTC не поддерживается; если
value
описывает один, результатом будетNone
.
-
parse_datetime
(value)[исходный код]¶ Разбирает строку и возвращает
datetime.datetime
.Поддерживаются смещения UTC; если
value
описывает один, то атрибут результатаtzinfo
является экземпляромdatetime.timezone
.Changed in Django 2.2:В старых версиях атрибут
tzinfo
является экземпляромFixedOffset
.
-
parse_duration
(value)[исходный код]¶ Разбирает строку и возвращает
datetime.timedelta
.Ожидает данные в формате
"DD HH:MM:SS.uuuuuu"
или как указано в ISO 8601 (например,P4DT1H15M20S
, что эквивалентно4 1:15:20
) или в формате дневного интервала PostgreSQL (например,3 days 04:05:06
).
django.utils.decorators
¶
-
method_decorator
(decorator, name='')[исходный код]¶ Преобразует декоратор функций в декоратор методов. Он может использоваться для декорирования методов или классов; в последнем случае
name
является именем декорируемого метода и является обязательным.decorator
также может быть списком или кортежем функций. Они обертываются в обратном порядке, так что порядок вызова соответствует порядку появления функций в списке/кортеже.Пример использования см. в decorating class based views.
-
decorator_from_middleware
(middleware_class)[исходный код]¶ Учитывая класс промежуточного ПО, возвращает декоратор представления. Это позволяет вам использовать функциональность промежуточного ПО на основе каждого представления. Промежуточное ПО создается без передачи параметров.
Он предполагает наличие промежуточного программного обеспечения, совместимого со старым стилем Django 1.9 и более ранних версий (с методами типа
process_request()
,process_exception()
иprocess_response()
).
-
decorator_from_middleware_with_args
(middleware_class)[исходный код]¶ Подобно
decorator_from_middleware
, но возвращает функцию, которая принимает аргументы, передаваемые классу middleware_class. Например, декораторcache_page()
создается из декоратораCacheMiddleware
следующим образом:cache_page = decorator_from_middleware_with_args(CacheMiddleware) @cache_page(3600) def my_view(request): pass
django.utils.encoding
¶
-
python_2_unicode_compatible
()¶ Декоратор, определяющий методы
__unicode__
и__str__
под Python 2. В Python 3 он ничего не делает.Чтобы поддерживать Python 2 и 3 с единой кодовой базой, определите метод
__str__
, возвращающий текст (используйтеsix.text_type()
, если вы выполняете приведение), и примените этот декоратор к классу.
-
smart_text
(s, encoding='utf-8', strings_only=False, errors='strict')[исходный код]¶ Возвращает объект
str
, представляющий произвольный объектs
. Обрабатывает байтовые строки, используя кодекencoding
.Если
strings_only
равноTrue
, не конвертируйте (некоторые) нестрокоподобные объекты.
-
is_protected_type
(obj)[исходный код]¶ Определите, является ли экземпляр объекта защищенным типом.
Объекты защищенных типов сохраняются как есть при передаче в
force_text(strings_only=True)
.
-
force_text
(s, encoding='utf-8', strings_only=False, errors='strict')[исходный код]¶ Аналогично
smart_text
, за исключением того, что экземпляры lazy разрешаются в строки, а не сохраняются как объекты lazy.Если
strings_only
равноTrue
, не конвертируйте (некоторые) нестрокоподобные объекты.
-
smart_bytes
(s, encoding='utf-8', strings_only=False, errors='strict')[исходный код]¶ Возвращает байтовую версию произвольного объекта
s
, закодированную так, как указано вencoding
.Если
strings_only
равноTrue
, не конвертируйте (некоторые) нестрокоподобные объекты.
-
force_bytes
(s, encoding='utf-8', strings_only=False, errors='strict')[исходный код]¶ Аналогично
smart_bytes
, за исключением того, что экземпляры lazy разрешаются в байтовые строки, а не сохраняются как объекты lazy.Если
strings_only
равноTrue
, не конвертируйте (некоторые) нестрокоподобные объекты.
-
smart_str
(s, encoding='utf-8', strings_only=False, errors='strict')[исходный код]¶ Псевдоним
smart_text()
. Эта функция возвращаетstr
или ленивую строку.Например, это подходит для записи в
sys.stdout
.Псевдоним
smart_bytes()
на Python 2 (в старых версиях Django, которые его поддерживают).
-
force_str
(s, encoding='utf-8', strings_only=False, errors='strict')[исходный код]¶ Псевдоним функции
force_text()
. Эта функция всегда возвращаетstr
.Псевдоним
force_bytes()
на Python 2 (в старых версиях Django, которые его поддерживают).
-
iri_to_uri
(iri)[исходный код]¶ Преобразование части интернационализированного идентификатора ресурса (IRI) в часть URI, которая подходит для включения в URL.
Это алгоритм из раздела 3.1 RFC 3987#section-3.1, немного упрощенный, поскольку предполагается, что входные данные являются строкой, а не произвольным потоком байтов.
Принимает IRI (строку или байты UTF-8) и возвращает строку, содержащую закодированный результат.
-
uri_to_iri
(uri)[исходный код]¶ Преобразует унифицированный идентификатор ресурса в интернационализированный идентификатор ресурса.
Это алгоритм из раздела 3.2 книги RFC 3987#section-3.2.
Принимает URI в байтах ASCII и возвращает строку, содержащую закодированный результат.
-
filepath_to_uri
(path)[исходный код]¶ Преобразование пути файловой системы в часть URI, пригодную для включения в URL. Предполагается, что путь представляет собой байт UTF-8 или строку.
Этот метод кодирует определенные символы, которые обычно распознаются как специальные символы для URI. Обратите внимание, что этот метод не кодирует символ „, так как он является допустимым символом в URI. Более подробную информацию см. в функции JavaScript
encodeURIComponent()
.Возвращает строку ASCII, содержащую закодированный результат.
-
escape_uri_path
(path)[исходный код]¶ Удаляет небезопасные символы из части пути унифицированного идентификатора ресурса (URI).
django.utils.feedgenerator
¶
Образец использования:
>>> from django.utils import feedgenerator
>>> feed = feedgenerator.Rss201rev2Feed(
... title="Poynter E-Media Tidbits",
... link="http://www.poynter.org/column.asp?id=31",
... description="A group Weblog by the sharpest minds in online media/journalism/publishing.",
... language="en",
... )
>>> feed.add_item(
... title="Hello",
... link="http://www.holovaty.com/test/",
... description="Testing.",
... )
>>> with open('test.rss', 'w') as fp:
... feed.write(fp, 'utf-8')
Для упрощения выбора генератора используйте feedgenerator.DefaultFeed
, который в настоящее время является Rss201rev2Feed
Определения различных версий RSS см. на сайте: https://web.archive.org/web/20110718035220/http://diveintomark.org/archives/2004/02/04/incompatible-rss.
-
get_tag_uri
(url, date)[исходный код]¶ Создает TagURI.
См. https://web.archive.org/web/20110514113830/http://diveintomark.org/archives/2004/05/28/howto-atom-id
SyndicationFeed
¶
-
class
SyndicationFeed
[исходный код]¶ Базовый класс для всех фидов синдикации. Подклассы должны предоставлять функцию write().
-
__init__
(title, link, description, language=None, author_email=None, author_name=None, author_link=None, subtitle=None, categories=None, feed_url=None, feed_copyright=None, feed_guid=None, ttl=None, **kwargs)[исходный код]¶ Инициализация фида с заданным словарем метаданных, который применяется ко всему фиду.
Любые дополнительные аргументы ключевых слов, которые вы передадите в
__init__
, будут сохранены вself.feed
.Все параметры должны быть строками, кроме
categories
, который должен быть последовательностью строк.
-
add_item
(title, link, description, author_email=None, author_name=None, author_link=None, pubdate=None, comments=None, unique_id=None, categories=(), item_copyright=None, ttl=None, updateddate=None, enclosures=None, **kwargs)[исходный код]¶ Добавляет элемент в ленту. Все аргументы должны быть строками, кроме
pubdate
иupdateddate
, которые являютсяdatetime.datetime
объектами, иenclosures
, который является спискомEnclosure
экземпляров.
-
num_items
()[исходный код]¶
-
root_attributes
()[исходный код]¶ Возвращает дополнительные атрибуты для размещения на корневом (т.е. feed/channel) элементе. Вызывается из
write()
.
-
add_root_elements
(handler)[исходный код]¶ Добавляет элементы в корневой (т.е. feed/channel) элемент. Вызывается из
write()
.
-
item_attributes
(item)[исходный код]¶ Возвращает дополнительные атрибуты для размещения на каждом элементе элемента (т.е. элемента/записи).
-
add_item_elements
(handler, item)[исходный код]¶ Добавьте элементы на каждый элемент (т.е. элемент/запись).
-
write
(outfile, encoding)[исходный код]¶ Выводит фид в заданной кодировке в
outfile
, который является файлоподобным объектом. Подклассы должны переопределить это.
-
writeString
(encoding)[исходный код]¶ Возвращает подачу в заданной кодировке в виде строки.
-
latest_post_date
()[исходный код]¶ Возвращает последние
pubdate
илиupdateddate
для всех элементов в фиде. Если ни один элемент не имеет ни одного из этих атрибутов, возвращается текущая дата/время UTC.
-
Enclosure
¶
-
class
Enclosure
[исходный код]¶ Представляет собой корпус RSS
RssFeed
¶
-
class
RssFeed
(SyndicationFeed)[исходный код]¶
Rss201rev2Feed
¶
-
class
Rss201rev2Feed
(RssFeed)[исходный код]¶ Спецификация: https://cyber.harvard.edu/rss/rss.html
RssUserland091Feed
¶
-
class
RssUserland091Feed
(RssFeed)[исходный код]¶ Спецификация: http://backend.userland.com/rss091
Atom1Feed
¶
-
class
Atom1Feed
(SyndicationFeed)[исходный код]¶ Спецификация: https://tools.ietf.org/html/rfc4287
django.utils.functional
¶
-
class
cached_property
(func, name=None)[исходный код]¶ Декоратор
@cached_property
кэширует результат метода с одним аргументомself
в качестве свойства. Кэшированный результат будет сохраняться до тех пор, пока существует экземпляр, поэтому если экземпляр будет передан, а функция впоследствии вызвана, будет возвращен кэшированный результат.Рассмотрим типичный случай, когда представлению может понадобиться вызвать метод модели для выполнения некоторых вычислений, прежде чем поместить экземпляр модели в контекст, где шаблон может вызвать метод еще раз:
# the model class Person(models.Model): def friends(self): # expensive computation ... return friends # in the view: if person.friends(): ...
И в шаблоне у вас будет:
{% for friend in person.friends %}
Здесь
friends()
будет вызван дважды. Поскольку экземплярperson
в представлении и шаблоне один и тот же, украшение методаfriends()
методом@cached_property
позволяет избежать этого:from django.utils.functional import cached_property class Person(models.Model): @cached_property def friends(self): ...
Обратите внимание, что поскольку метод теперь является свойством, в коде Python к нему нужно будет обращаться соответствующим образом:
# in the view: if person.friends: ...
Кэшированное значение может рассматриваться как обычный атрибут экземпляра:
# clear it, requiring re-computation next time it's called del person.friends # or delattr(person, "friends") # set a value manually, that will persist on the instance until cleared person.friends = ["Huckleberry Finn", "Tom Sawyer"]
Из-за того, как работает descriptor protocol, использование
del
(илиdelattr
) наcached_property
, к которому не было доступа, вызываетAttributeError
.Помимо потенциальных преимуществ в производительности,
@cached_property
может гарантировать, что значение атрибута не изменится неожиданно в течение жизни экземпляра. Это может произойти с методом, вычисления которого основаны наdatetime.now()
, или просто если изменение было сохранено в базе данных каким-либо другим процессом в короткий промежуток времени между последующими вызовами метода для одного и того же экземпляра.Вы можете сделать кэшированные свойства методов. Например, если у вас есть дорогой метод
get_friends()
и вы хотите разрешить вызывать его без получения кэшированного значения, вы можете написать:friends = cached_property(get_friends, name='friends')
Аргумент
name
нужен только для поддержки Python < 3.6.Changed in Django 2.2:Более старые версии Django требуют аргумента
name
для всех версий Python.В то время как
person.get_friends()
будет пересчитывать друзей при каждом вызове, значение кэшированного свойства будет сохраняться до тех пор, пока вы не удалите его, как описано выше:x = person.friends # calls first time y = person.get_friends() # calls again z = person.friends # does not call x is z # is True
Предупреждение
В Python < 3.6
cached_property
не работает корректно с искаженным именем mangled, если ему не переданоname
вида_Class__attribute
:__friends = cached_property(get_friends, name='_Person__friends')
-
keep_lazy
(func, *resultclasses)[исходный код]¶ Django предлагает множество служебных функций (особенно в
django.utils
), которые принимают строку в качестве первого аргумента и что-то делают с этой строкой. Эти функции используются фильтрами шаблонов, а также непосредственно в другом коде.Если вы пишете свои собственные подобные функции и работаете с переводами, вы столкнетесь с проблемой, что делать, когда первым аргументом является объект ленивого перевода. Вы не хотите сразу преобразовывать его в строку, потому что вы можете использовать эту функцию вне представления (и, следовательно, настройки локали текущего потока будут неверными).
Для подобных случаев используйте декоратор
django.utils.functional.keep_lazy()
. Он изменяет функцию таким образом, что если она вызывается с ленивым переводом в качестве одного из аргументов, оценка функции задерживается до тех пор, пока не потребуется преобразование в строку.Например:
from django.utils.functional import keep_lazy, keep_lazy_text def fancy_utility_function(s, ...): # Do some conversion on string 's' ... fancy_utility_function = keep_lazy(str)(fancy_utility_function) # Or more succinctly: @keep_lazy(str) def fancy_utility_function(s, ...): ...
Декоратор
keep_lazy()
принимает ряд дополнительных аргументов (*args
), определяющих тип(ы), которые может возвращать исходная функция. Чаще всего используются функции, возвращающие текст. Для них можно просто передать типstr
вkeep_lazy
(или, что еще проще, использовать декораторkeep_lazy_text()
, описанный в следующем разделе).Использование этого декоратора означает, что вы можете написать свою функцию и предположить, что входные данные являются правильной строкой, а затем добавить поддержку объектов ленивого перевода в конце.
-
keep_lazy_text
(func)[исходный код]¶ Сокращение для
keep_lazy(str)(func)
.Если у вас есть функция, возвращающая текст, и вы хотите иметь возможность принимать ленивые аргументы, откладывая их оценку, просто используйте этот декоратор:
from django.utils.functional import keep_lazy, keep_lazy_text # Our previous example was: @keep_lazy(str) def fancy_utility_function(s, ...): ... # Which can be rewritten as: @keep_lazy_text def fancy_utility_function(s, ...): ...
django.utils.html
¶
Обычно вы должны создавать HTML с помощью шаблонов Django, чтобы использовать его механизм автоэскейпа, используя утилиты из django.utils.safestring
, где это необходимо. Этот модуль предоставляет некоторые дополнительные низкоуровневые утилиты для экранирования HTML.
-
escape
(text)[исходный код]¶ Возвращает заданный текст с амперсандами, кавычками и угловыми скобками, закодированный для использования в HTML. Входной текст сначала принудительно преобразуется в строку, а на выходе применяется
mark_safe()
.
-
conditional_escape
(text)[исходный код]¶ Аналогичен
escape()
, за исключением того, что он не работает со строками с предварительной эсэмэской, поэтому он не будет выполнять двойную эсэмэску.
-
format_html
(format_string, *args, **kwargs)[исходный код]¶ Это похоже на
str.format()
, за исключением того, что оно подходит для построения HTML-фрагментов. Все args и kwargs проходят черезconditional_escape()
перед передачей вstr.format()
.В случае построения небольших HTML-фрагментов эта функция предпочтительнее интерполяции строк с помощью
%
илиstr.format()
напрямую, поскольку она применяет экранирование ко всем аргументам - так же, как система шаблонов применяет экранирование по умолчанию.Поэтому вместо того, чтобы написать:
mark_safe("%s <b>%s</b> %s" % ( some_html, escape(some_text), escape(some_other_text), ))
Вместо этого следует использовать:
format_html("{} <b>{}</b> {}", mark_safe(some_html), some_text, some_other_text, )
Это имеет то преимущество, что вам не нужно применять
escape()
к каждому аргументу и рисковать ошибкой и XSS-уязвимостью, если вы забудете один из них.Обратите внимание, что хотя эта функция использует
str.format()
для выполнения интерполяции, некоторые опции форматирования, предоставляемыеstr.format()
(например, форматирование чисел), не будут работать, поскольку все аргументы передаются черезconditional_escape()
, который (в конечном итоге) вызываетforce_text()
для значений.
-
format_html_join
(sep, format_string, args_generator)[исходный код]¶ Обертка
format_html()
, для распространенного случая группы аргументов, которые должны быть отформатированы с использованием одной и той же строки формата, а затем объединены с помощьюsep
.sep
также передается черезconditional_escape()
.args_generator
должен быть итератором, возвращающим последовательностьargs
, которая будет передана вformat_html()
. Например:format_html_join( '\n', "<li>{} {}</li>", ((u.first_name, u.last_name) for u in users) )
-
strip_tags
(value)[исходный код]¶ Пытается удалить из строки все, что похоже на HTML-тег, то есть все, что содержится в пределах
<>
.Абсолютно НИКАКИХ гарантий того, что полученная строка будет безопасна для HTML. Поэтому НИКОГДА не помечайте безопасным результат вызова
strip_tag
, не экранировав его сначала, например, с помощьюescape()
.Например:
strip_tags(value)
Если
value
равно"<b>Joel</b> <button>is</button> a <span>slug</span>"
, то возвращаемое значение будет"Joel is a slug"
.Если вы ищете более надежное решение, обратите внимание на библиотеку bleach Python.
-
html_safe
()[исходный код]¶ Метод
__html__()
для класса помогает шаблонам не-Django обнаружить классы, вывод которых не требует экранирования HTML.Этот декоратор определяет метод
__html__()
на декорируемом классе, обернув__str__()
вmark_safe()
. Убедитесь, что метод__str__()
действительно возвращает текст, не требующий экранирования HTML.
django.utils.http
¶
-
urlencode
(query, doseq=False)[исходный код]¶ Версия функции Python
urllib.parse.urlencode()
, которая может работать сMultiValueDict
и нестроковыми значениями.
-
cookie_date
(epoch_seconds=None)¶ Не рекомендуется, начиная с версии 2.1: Вместо этого используйте
http_date()
, что соответствует последнему RFC.Форматирует время для обеспечения совместимости со стандартом cookie компании Netscape.
Принимает число с плавающей точкой, выраженное в секундах от эпохи в UTC - такое, как выводится
time.time()
. Если установлено значениеNone
, по умолчанию используется текущее время.Выводит строку в формате
Wdy, DD-Mon-YYYY HH:MM:SS GMT
.
-
http_date
(epoch_seconds=None)[исходный код]¶ Форматирует время в соответствии с форматом даты RFC 1123#section-5.2.14, как указано в HTTP RFC 7231#section-7.1.1.1.
Принимает число с плавающей точкой, выраженное в секундах от эпохи в UTC - такое, как выводится
time.time()
. Если установлено значениеNone
, по умолчанию используется текущее время.Выводит строку в формате
Wdy, DD Mon YYYY HH:MM:SS GMT
.
-
base36_to_int
(s)[исходный код]¶ Преобразует строку с основанием 36 в целое число.
-
int_to_base36
(i)[исходный код]¶ Преобразует целое положительное число в строку по основанию 36.
-
urlsafe_base64_encode
(s)[исходный код]¶ Кодирует байтовую строку в строку base64 для использования в URL-адресах, удаляя все идущие следом знаки равенства.
Changed in Django 2.2:В старых версиях вместо строки возвращается байтстринг.
-
urlsafe_base64_decode
(s)[исходный код]¶ Декодирует строку в кодировке base64, добавляя обратно все отстающие знаки равенства, которые могли быть удалены.
Changed in Django 2.2:В старых версиях
s
может быть байтовой строкой.
django.utils.module_loading
¶
Функции для работы с модулями Python.
-
import_string
(dotted_path)[исходный код]¶ Импортирует точечный путь к модулю и возвращает атрибут/класс, обозначенный последним именем в пути. Возвращает
ImportError
, если импорт не удался. Например:from django.utils.module_loading import import_string ValidationError = import_string('django.core.exceptions.ValidationError')
эквивалентно:
from django.core.exceptions import ValidationError
django.utils.safestring
¶
Функции и классы для работы с «безопасными строками»: строки, которые можно безопасно отображать без дальнейшей экранировки в HTML. Пометка чего-либо как «безопасной строки» означает, что производитель строки уже превратил символы, которые не должны интерпретироваться механизмом HTML (например, „<“), в соответствующие сущности.
-
class
SafeString
[исходный код]¶ Подкласс
str
, который был специально помечен как «безопасный» (не требующий дополнительного экранирования) для целей вывода HTML. ПсевдонимSafeText
.
-
class
SafeText
¶ Подкласс
str
, который был специально помечен как «безопасный» для целей вывода HTML.
-
mark_safe
(s)[исходный код]¶ Явно пометить строку как безопасную для вывода (HTML). Возвращаемый объект можно использовать везде, где уместна строка.
Может вызываться несколько раз для одной строки.
Может также использоваться в качестве декоративного элемента.
Для построения фрагментов HTML обычно следует использовать
django.utils.html.format_html()
.Строка, помеченная как безопасная, при изменении снова станет небезопасной. Например:
>>> mystr = '<b>Hello World</b> ' >>> mystr = mark_safe(mystr) >>> type(mystr) <class 'django.utils.safestring.SafeText'> >>> mystr = mystr.strip() # removing whitespace >>> type(mystr) <type 'str'>
django.utils.text
¶
-
format_lazy
(format_string, *args, **kwargs)¶ Версия
str.format()
для случаев, когдаformat_string
,args
и/илиkwargs
содержат ленивые объекты. Первым аргументом является строка, которую нужно отформатировать. Например:from django.utils.text import format_lazy from django.utils.translation import pgettext_lazy urlpatterns = [ path(format_lazy('{person}/<int:pk>/', person=pgettext_lazy('URL', 'person')), PersonDetailView.as_view()), ]
Этот пример позволяет переводчикам переводить часть URL. Если «person» переводится на «persona», то регулярное выражение будет соответствовать
persona/(?P<pk>\d+)/$
, напримерpersona/5/
.
-
slugify
(value, allow_unicode=False)[исходный код]¶ Преобразует строку в URL slug by:
- Преобразование в ASCII, если
allow_unicode
равноFalse
(по умолчанию). - Удаление символов, не являющихся алфавитно-цифровыми, подчеркиваниями, дефисами или пробелами.
- Удаление ведущих и завершающих пробелов.
- Преобразование в нижний регистр.
- Замена пробелов и повторяющихся тире одиночными тире.
Например:
>>> slugify(' Joel is a slug ') 'joel-is-a-slug'
Если вы хотите разрешить символы Unicode, передайте
allow_unicode=True
. Например:>>> slugify('你好 World', allow_unicode=True) '你好-world'
- Преобразование в ASCII, если
django.utils.timezone
¶
-
class
FixedOffset
(offset=None, name=None)¶ Подкласс
tzinfo
моделирует фиксированное смещение от UTC.offset
- целое число минут к востоку от UTC.Не рекомендуется, начиная с версии 2.2: Вместо этого используйте
datetime.timezone
.
-
get_fixed_timezone
(offset)[исходный код]¶ Возвращает экземпляр
tzinfo
, представляющий часовой пояс с фиксированным смещением от UTC.offset
- этоdatetime.timedelta
или целое число минут. Используйте положительные значения для часовых поясов к востоку от UTC и отрицательные - к западу от UTC.
-
get_default_timezone
()[исходный код]¶ Возвращает экземпляр
tzinfo
, который представляет default time zone.
-
get_default_timezone_name
()[исходный код]¶ Возвращает имя default time zone.
-
get_current_timezone
()[исходный код]¶ Возвращает экземпляр
tzinfo
, который представляет current time zone.
-
get_current_timezone_name
()[исходный код]¶ Возвращает имя current time zone.
-
activate
(timezone)[исходный код]¶ Устанавливает значение current time zone. Аргумент
timezone
должен быть экземпляром подклассаtzinfo
или именем часового пояса.
-
deactivate
()[исходный код]¶ Сбрасывает значение current time zone.
-
override
(timezone)[исходный код]¶ Это менеджер контекста Python, который устанавливает current time zone при входе с
activate()
, а при выходе восстанавливает ранее активный часовой пояс. Если аргументомtimezone
являетсяNone
, то при входе вместо current time zone устанавливаетсяdeactivate()
.override
также можно использовать в качестве декоратора функций.
-
localtime
(value=None, timezone=None)[исходный код]¶ Преобразует известное
datetime
в другой часовой пояс, по умолчанию current time zone.Если значение
value
опущено, по умолчанию оно равноnow()
.Эта функция не работает для наивных дат; вместо нее используйте
make_aware()
.
-
localdate
(value=None, timezone=None)[исходный код]¶ Использует
localtime()
для преобразования известногоdatetime
вdate()
в другом часовом поясе, по умолчанию current time zone.Если значение
value
опущено, по умолчанию оно равноnow()
.Эта функция не работает с наивными датами.
-
now
()[исходный код]¶ Возвращает значение
datetime
, которое представляет текущий момент времени. Что именно возвращается, зависит от значенияUSE_TZ
:- Если
USE_TZ
равноFalse
, то это будет naive datetime (т.е. время без связанного часового пояса), которое представляет текущее время в локальном часовом поясе системы. - Если
USE_TZ
равноTrue
, это будет aware datetime, представляющее текущее время в UTC. Обратите внимание, чтоnow()
всегда будет возвращать время в UTC независимо от значенияTIME_ZONE
; вы можете использоватьlocaltime()
для получения времени в текущем часовом поясе.
- Если
-
is_aware
(value)[исходный код]¶ Возвращает
True
, еслиvalue
осознан,False
, если наивен. Эта функция предполагает, чтоvalue
являетсяdatetime
.
-
is_naive
(value)[исходный код]¶ Возвращает
True
, еслиvalue
является наивным,False
, если он осведомлен. Эта функция предполагает, чтоvalue
являетсяdatetime
.
-
make_aware
(value, timezone=None, is_dst=None)[исходный код]¶ Возвращает осознанный
datetime
, который представляет тот же момент времени, что иvalue
вtimezone
,value
являющийся наивнымdatetime
. Еслиtimezone
заданоNone
, то по умолчанию возвращается current time zone.Исключение
pytz.AmbiguousTimeError
возникает, если вы попытаетесь сделатьvalue
известным во время перехода на летнее время, когда одно и то же время встречается дважды (при возврате от летнего времени). Установкаis_dst
вTrue
илиFalse
позволит избежать исключения, выбирая время до или после перехода соответственно.Исключение
pytz.NonExistentTimeError
возникает, если вы пытаетесь сделатьvalue
aware во время перехода на летнее время так, что время никогда не наступало. Например, если час 2:00 пропущен во время перехода на летнее время, попытка сделать 2:30 известным в этом часовом поясе вызовет исключение. Чтобы избежать этого, вы можете использоватьis_dst
, чтобы указать, какmake_aware()
должен интерпретировать такое несуществующее время. Еслиis_dst=True
, то вышеуказанное время будет интерпретировано как 2:30 по местному времени (эквивалентно 1:30 по местному времени). И наоборот, еслиis_dst=False
, то время будет интерпретировано как 2:30 стандартного времени (эквивалентно 3:30 местного времени).
-
make_naive
(value, timezone=None)[исходный код]¶ Возвращает наивный
datetime
, который представляет вtimezone
тот же момент времени, что иvalue
,value
являющийся осознаннымdatetime
. Еслиtimezone
заданоNone
, то по умолчанию возвращается current time zone.
django.utils.translation
¶
Для полного обсуждения использования следующего смотрите translation documentation.
Префикс u
в приведенных ниже функциях обусловлен различием в Python 2 между юникодом и байтстрингами. Если ваш код не поддерживает Python 2, используйте функции без u
.
-
gettext
(message)[исходный код]¶
-
ugettext
(message)[исходный код]¶ Переводит
message
и возвращает его в виде строки.
-
pgettext
(context, message)[исходный код]¶ Переводит
message
вcontext
и возвращает его в виде строки.Для получения дополнительной информации см. раздел Контекстуальные маркеры.
-
gettext_lazy
(message)¶
-
ugettext_lazy
(message)[исходный код]¶
-
pgettext_lazy
(context, message)¶ То же самое, что и неленивые версии выше, но с использованием ленивого выполнения.
-
gettext_noop
(message)[исходный код]¶
-
ugettext_noop
(message)[исходный код]¶ Помечает строки для перевода, но не переводит их сейчас. Это можно использовать для хранения строк в глобальных переменных, которые должны оставаться на базовом языке (поскольку они могут быть использованы извне) и будут переведены позже.
-
ngettext
(singular, plural, number)[исходный код]¶
-
ungettext
(singular, plural, number)[исходный код]¶ Переводит
singular
иplural
и возвращает соответствующую строку на основеnumber
.
-
npgettext
(context, singular, plural, number)[исходный код]¶ Переводит
singular
иplural
и возвращает соответствующую строку на основеnumber
иcontext
.
-
ngettext_lazy
(singular, plural, number)[исходный код]¶
-
ungettext_lazy
(singular, plural, number)[исходный код]¶
-
npgettext_lazy
(context, singular, plural, number)[исходный код]¶ То же самое, что и неленивые версии выше, но с использованием ленивого выполнения.
-
activate
(language)[исходный код]¶ Получает объект перевода для заданного языка и активирует его в качестве текущего объекта перевода для текущего потока.
-
deactivate
()[исходный код]¶ Деактивирует активный в данный момент объект перевода, так что дальнейшие _ вызовы будут снова разрешаться в объект перевода по умолчанию.
-
deactivate_all
()[исходный код]¶ Делает активный объект перевода экземпляром
NullTranslations()
. Это полезно, когда мы хотим, чтобы отложенный перевод по каким-то причинам отображался как оригинальная строка.
-
override
(language, deactivate=False)[исходный код]¶ Менеджер контекста Python, который использует
django.utils.translation.activate()
для получения объекта перевода для данного языка, активирует его в качестве объекта перевода для текущего потока и повторно активирует предыдущий активный язык при выходе. Как вариант, он может просто деактивировать временный перевод при выходе с помощьюdjango.utils.translation.deactivate()
, если аргументомdeactivate
являетсяTrue
. Если вы передадитеNone
в качестве аргумента языка, в контексте активируется экземплярNullTranslations()
.override
также можно использовать в качестве декоратора функций.
-
check_for_language
(lang_code)[исходный код]¶ Проверяет, существует ли глобальный языковой файл для заданного кода языка (например, „fr“, „pt_BR“). Это используется для определения доступности языка, заданного пользователем.
-
get_language
()[исходный код]¶ Возвращает текущий выбранный код языка. Возвращает
None
, если переводы временно отключены (по командеdeactivate_all()
или когдаNone
передается вoverride()
).
-
get_language_bidi
()[исходный код]¶ Возвращает раскладку BiDi выбранного языка:
False
= расположение слева направоTrue
= расположение справа налево
-
get_language_from_request
(request, check_path=False)[исходный код]¶ Анализирует запрос, чтобы определить, какой язык пользователь хочет, чтобы система показала. Учитываются только языки, перечисленные в settings.LANGUAGES. Если пользователь запрашивает подъязык там, где у нас есть основной язык, мы отправляем основной язык.
Если
check_path
равноTrue
, функция сначала проверяет запрашиваемый URL на то, начинается ли его путь с кода языка, указанного в параметреLANGUAGES
.
-
get_supported_language_variant
(lang_code, strict=False)[исходный код]¶ - New in Django 2.1.
Возвращает
lang_code
, если он находится в параметреLANGUAGES
, возможно, выбирая более общий вариант. Например, возвращается'es'
, еслиlang_code
находится в'es-ar'
, а'es'
находится вLANGUAGES
, но'es-ar'
нет.Если
strict
естьFalse
(по умолчанию), может быть возвращен вариант, специфичный для страны, когда не найден ни код языка, ни его общий вариант. Например, если в'es-co'
есть толькоLANGUAGES
, то это возвращается дляlang_code
таких вариантов, как'es'
и'es-ar'
. Эти соответствия не возвращаются, еслиstrict=True
.Вызывает
LookupError
, если ничего не найдено.
-
to_locale
(language)[исходный код]¶ Превращает имя языка (en-us) в имя локали (en_US).
-
templatize
(src)[исходный код]¶ Превращает шаблон Django в нечто, понятное
xgettext
. Он делает это, переводя теги перевода Django в стандартные вызовы функцийgettext
.
-
LANGUAGE_SESSION_KEY
¶ Ключ сессии, под которым хранится активный язык для текущей сессии.