Este documento cubre todos los módulos estables en django.utils. La mayoría de los módulos en django.utils están diseñados para uso interno y solo las siguientes partes pueden considerarse estables y así compatibles con versiones anteriores según la política de desprecación de lanzamientos internos <internal-release-deprecation-policy>.
Este módulo contiene funciones auxiliares para controlar el caché HTTP. Lo hace gestionando el encabezado Vary de las respuestas. Incluye funciones para parchear directamente el encabezado de objetos de respuesta y decoradores que cambian a las funciones para hacerlo ellos mismos.
Para información sobre el encabezado Vary, consulte RFC 9110 Section 12.5.5.
En esencia, el encabezado HTTP Vary define qué encabezados un caché debe tener en cuenta al construir su clave de caché. Las solicitudes con la misma ruta pero contenido diferente para los encabezados nombrados en Vary necesitan obtener claves de caché diferentes para evitar la entrega de contenido incorrecto.
El middleware de internacionalización :doc:``internationalization </topics/i18n/index> requiriría distinguir cachés por el encabezado Accept-language.
Esta función parchea el encabezado Cache-Control agregando todos los argumentos clave a él. La transformación es la siguiente:
Todos los nombres de parámetros de keyword se convierten a minúsculas, y los guiones bajos se convierten en guiones.
Si el valor de un parámetro es True (exactamente True, no solo un valor verdadero), solo se agrega el nombre del parámetro al encabezado.
Todos los demás parámetros se agregan con su valor, después de aplicarle str() a él.
Devuelve la edad máxima desde el encabezado Cache-Control de respuesta como un entero (o None si no lo encontró o no era un entero).
Agrega algunos encabezados útiles al objeto HttpResponse dado:
Expires
Cache-Control
Cada encabezado solo se agrega si ya no está establecido.
cache_timeout está en segundos. La configuración CACHE_MIDDLEWARE_SECONDS se utiliza por defecto.
Agrega un encabezado Expires con la fecha/hora actual.
Agrega el encabezado Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private a una respuesta para indicar que una página nunca debe ser cacheada.
Cada encabezado solo se agrega si ya no está establecido.
Agrega (o actualiza) el encabezado Vary en el objeto de respuesta dado. newheaders es una lista de nombres de encabezados que deben estar en Vary. Si headers contiene un asterisco, entonces el encabezado Vary consistirá en un solo asterisco '*', según RFC 9110 Section 12.5.5. De lo contrario, los encabezados existentes en Vary no se eliminan.
Devuelve una clave de caché basada en la ruta de solicitud. Puede usarse en la fase de solicitud porque extrae la lista de encabezados a tener en cuenta del registro global de rutas y utiliza esos para construir una clave de caché para comprobar contra ella.
Si no hay una lista de encabezados almacenada, la página necesita ser reconstruida, por lo que esta función devuelve None.
Aprende qué encabezados tener en cuenta para alguna ruta de solicitud a partir del objeto de respuesta. Almacena esos encabezados en un registro global de rutas para que luego el acceso a esa ruta conozca qué encabezados tener en cuenta sin generar la respuesta en sí misma. Los encabezados se nombran en el encabezado Vary de la respuesta, pero queremos evitar la generación de respuestas.
La lista de encabezados para usar para la generación de claves de caché está almacenada en el mismo cache que las páginas mismas. Si el cache elimina datos del cache, esto significa que debemos generar la respuesta una vez para obtener el encabezado Vary y así obtener la lista de encabezados para usar para la clave de caché.
django.utils.dateparse¶Las funciones definidas en este módulo comparten las siguientes propiedades:
A continuación te dejo las traducciones de los textos originales manteniendo todas sus etiquetas intactas.
They raise ValueError si su entrada está bien formada pero no es una fecha o hora válida.
They return None si no está bien formado en absoluto.
They accept up to picosecond resolution in input, but they truncate it to microseconds, since that’s what Python supports.
Parses a string and returns a datetime.date.
Parses a string and returns a datetime.time.
UTC offsets aren’t supported; if value describes one, the result is
None.
Parses a string and returns a datetime.datetime.
UTC offsets are supported; if value describes one, the result’s
tzinfo attribute is a datetime.timezone instance.
Parses a string and returns a datetime.timedelta.
Los textos traducidos son:
Convierte un decorador de funciones en un decorador de métodos. Puede utilizarse para decorar métodos o clases; en el último caso, name es el nombre del método a decorar y es obligatorio.
decorator también puede ser una lista o tupla de funciones. Se envuelven en orden inverso para que el orden de llamada sea el orden en que las funciones aparecen en la lista/tupla.
Consulte decorando vistas basadas en clases para ejemplo de uso.
Dado una clase de middleware, devuelve un decorador de vistas. Esto te permite utilizar funcionalidad de middleware en una base por vista. La clase de middleware se crea sin pasar ningún parámetro.
Supone que el middleware es compatible con la antigua forma de Django 1.9 y versiones anteriores (con métodos como process_request(), process_exception() y process_response()).
Como decorator_from_middleware, pero devuelve una función que acepta los argumentos a pasar a la clase de middleware. Por ejemplo, el decorador cache_page() se crea desde el CacheMiddleware de esta manera:
cache_page = decorator_from_middleware_with_args(CacheMiddleware)
@cache_page(3600)
def my_view(request):
pass
Marca un middleware como solo síncrono. (El predeterminado en Django, pero esto te permite future-proof si el predeterminado cambia en una futura versión).
Marca un middleware como solo asíncrono. Django lo envolverá en un bucle de eventos asíncronos cuando se llame desde la ruta de solicitud WSGI.
django.utils.encoding¶Devuelve un objeto str que representa objetos arbitrarios s. Trata las cadenas de bytes utilizando el codec encoding.
Si strings_only es True, no conviertes (algunos) objetos no relacionados con cadenas.
Determina si la instancia del objeto es de un tipo protegido.
Los objetos de tipos protegidos se preservan tal como están cuando se pasan a force_str(strings_only=True).
Similar a smart_str(), excepto que las instancias perezosas se resuelven en cadenas, en lugar de mantenerse como objetos perezosos.
Si strings_only es True, no conviertes (algunos) objetos no relacionados con cadenas.
Devuelve una versión de cadena de bytes de un objeto arbitrario s, codificada según lo especificado en encoding.
Si strings_only es True, no conviertes (algunos) objetos no relacionados con cadenas.
Similar a smart_bytes, excepto que las instancias perezosas se resuelven en cadenas de bytes, en lugar de mantenerse como objetos perezosos.
Si strings_only es True, no conviertes (algunos) objetos no relacionados con cadenas.
Convierte una parte de un Identificador de Recurso Internacional (IRI) a una parte de URI adecuada para su inclusión en una URL.
Este es el resultado de la traducción:
Toma una IRI (cadena o bytes UTF-8) y devuelve una cadena con el resultado codificado.
Convierte un Identificador Uniforme de Recursos en un Identificador Internacionalizado de Recursos.
Esta es un algoritmo desde la sección 3.2 de RFC 3987 Section 3.2.
Toma una URI en bytes ASCII y devuelve una cadena con el resultado codificado.
Convierte un camino del sistema de archivos a una parte de URI que es adecuada para su inclusión en una URL. Se asume que la ruta es o bien bytes UTF-8, cadena o un Path.
Este método codificará ciertos caracteres que normalmente se reconocerían como caracteres especiales para URIs. Tenga en cuenta que este método no codifica el “ caracter, ya que es un carácter válido dentro de las URIs. Consulte la función encodeURIComponent() JavaScript para más detalles.
Devuelve una cadena ASCII con el resultado codificado.
Uso de ejemplo:
>>> from django.utils import feedgenerator
>>> feed = feedgenerator.Rss201rev2Feed(
... title="Poynter E-Media Tidbits",
... link="https://www.poynter.org/tag/e-media-tidbits/",
... description="A group blog by the sharpest minds in online media/journalism/publishing.",
... language="en",
... )
>>> feed.add_item(
... title="Hello",
... link="https://www.holovaty.com/test/",
... description="Testing.",
... )
>>> with open("test.rss", "w") as fp:
... feed.write(fp, "utf-8")
...
Para simplificar la selección de un generador utilice feedgenerator.DefaultFeed que actualmente es Rss201rev2Feed
Para definiciones de las diferentes versiones de RSS, consulte: https://web.archive.org/web/20110718035220/http://diveintomark.org/archivos/2004/02/04/incompatible-rss
Crea una TagURI.
Consulte https://web.archive.org/web/20110514113830/http://diveintomark.org/archivos/2004/05/28/howto-atom-id
Estilo¶Representa un estilo de RSS.
Una cadena opcional que contiene el tipo MIME del estilo. Si no se especifica, Django intentará adivinarlo utilizando la función mimetypes.guess_type() de Python. Utilice mimetype=None si no desea que su estilo tenga un tipo MIME especificado.
Una cadena opcional que se utilizará como atributo media del estilo. Por defecto es "pantalla". Use media=None si no desea que su estilo tenga el atributo media.
Enclosure¶RssFeed¶Rss201rev2Feed¶RssUserland091Feed¶Atom1Feed¶django.utils.functional¶La decoradora @cached_property almacena el resultado de un método con un argumento self como propiedad. El resultado almacenado persistirá mientras dure la instancia, por lo que si la instancia se pasa a otra parte y luego se invoca nuevamente el método, se devolverá el resultado almacenado.
Considera un caso típico, donde una vista podría necesitar llamar al método de un modelo para realizar alguna computación antes de colocar la instancia del modelo en el contexto, donde el template podría invocar nuevamente el método:
# the model
class Person(models.Model):
def friends(self):
# expensive computation
...
return friends
# in the view:
if person.friends():
...
Y en el template tendrías:
{% for friend in person.friends %}
Aquí, friends() se llamará dos veces. Dado que la instancia person en la vista y el template son las mismas, decorando el método friends() con @cached_property puede evitar eso:
from django.utils.functional import cached_property
class Person(models.Model):
@cached_property
def friends(self): ...
Ten en cuenta que como el método ahora es una propiedad, en el código de Python deberá accederse de manera adecuada:
# in the view:
if person.friends:
...
El valor almacenado se puede tratar como un atributo ordinario de la instancia:
# clear it, requiring re-computation next time it's called
person.__dict__.pop("friends", None)
# set a value manually, that will persist on the instance until cleared
person.friends = ["Huckleberry Finn", "Tom Sawyer"]
Gracias a la forma en que funciona el protocolo del descriptor , usar del (o delattr) sobre una cached_property que no ha sido accedida lanza AttributeError.
Los textos traducidos son:
Puedes hacer propiedades cacheadas de métodos. Por ejemplo, si tenías un método caro get_friends() y querías permitir que se llamara sin recuperar el valor cacheado, podrías escribir:
friends = cached_property(get_friends)
Mientras que person.get_friends() volverá a calcular los amigos en cada llamada, el valor de la propiedad cacheada persistirá hasta que lo elimines tal como se describe arriba:
x = person.friends # calls first time
y = person.get_friends() # calls again
z = person.friends # does not call
x is z # is True
De manera similar al decorador @classmethod <classmethod>, el decorador @classproperty convierte el resultado de un método con un solo argumento cls en una propiedad que se puede acceder directamente desde la clase.
Django ofrece muchas funciones de utilidad (particularmente en django.utils) que toman una cadena como su primer argumento y hacen algo con esa cadena. Estas funciones se utilizan tanto por los filtros de plantilla como directamente en otros códigos.
Si escribes tus propias funciones similares y manejas traducciones, te enfrentarás al problema de qué hacer cuando el primer argumento es un objeto de traducción relajado. No quieres convertirlo a cadena inmediatamente porque podrías estar utilizando esta función fuera de una vista (y por lo tanto la configuración local del hilo actual no será correcta).
Para casos como este, utiliza el decorador django.utils.functional.keep_lazy(). Modifica la función para que si se llama con un objeto de traducción relajado como uno de sus argumentos, la evaluación de la función se retrasará hasta que deba convertirse a cadena.
Por ejemplo:
from django.utils.functional import keep_lazy, keep_lazy_text
def fancy_utility_function(s, *args, **kwargs):
# 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, *args, **kwargs): ...
El decorador keep_lazy() toma una serie de argumentos adicionales (*args) que especifican el tipo(s) que la función original puede devolver. Un uso común es tener funciones que devuelven texto. Para estos, puedes pasar el tipo str a keep_lazy (o utilizar el decorador keep_lazy_text() descrito en la siguiente sección).
Utilizar este decorador significa que puedes escribir tu función y asumir que el input es una cadena correcta, luego agregar soporte para objetos de traducción relajados al final.
Atajo para keep_lazy(str)(func).
Si tienes una función que devuelve texto y deseas poder tomar argumentos perezosos mientras se retrasa su evaluación, puedes utilizar este decorador:
from django.utils.functional import keep_lazy, keep_lazy_text
# Our previous example was:
@keep_lazy(str)
def fancy_utility_function(s, *args, **kwargs): ...
# Which can be rewritten as:
@keep_lazy_text
def fancy_utility_function(s, *args, **kwargs): ...
django.utils.html¶Normalmente debes construir HTML utilizando plantillas de Django para aprovechar el mecanismo de autoescape, utilizando las utilidades en django.utils.safestring según sea necesario. Este módulo proporciona algunas utilidades de bajo nivel adicionales para escapar HTML.
Devuelve el texto dado con los ampersandos, comillas y signos de angular codificados para su uso en HTML. El input se fuerza a convertirse primero en una cadena y el output tiene mark_safe() aplicado.
Similar a escape(), excepto que no opera sobre cadenas preescapadas, por lo que no doble escapará.
Esto es similar a str.format(), excepto que es apropiado para construir fragmentos de HTML. El primer argumento format_string no se escapa pero todos los otros args y kwargs se pasan a través de conditional_escape() antes de ser pasados a str.format(). Finalmente, el output tiene mark_safe() aplicado.
Para el caso de construir fragmentos de HTML pequeños, esta función es preferible sobre la interpolación de cadenas utilizando % o str.format() directamente, porque aplica escapar a todos los argumentos - exactamente como el sistema de plantillas aplica escapar por defecto.
Por lo tanto, en lugar de escribir:
mark_safe(
"%s <b>%s</b> %s"
% (
some_html,
escape(some_text),
escape(some_other_text),
)
)
Deberías utilizar en su lugar:
format_html(
"{} <b>{}</b> {}",
mark_safe(some_html),
some_text,
some_other_text,
)
Esto tiene la ventaja de que no necesitas aplicar escape() a cada argumento y correr el riesgo de una vulnerabilidad XSS si te olvidas uno.
Nota que aunque esta función utiliza str.format() para realizar la interpolación, algunas de las opciones de formato proporcionadas por str.format() (por ejemplo, el formato numérico) no funcionarán, ya que todos los argumentos se pasan a través de conditional_escape() que (finalmente) llama a force_str() en los valores.
Obsoleto desde la versión 5.0: Se ha deprecado el soporte para llamar a format_html() sin pasar args o kwargs.
Un wrapper de format_html(), para el caso común de un grupo de argumentos que necesitan ser formateados con la misma cadena de formato y luego unidos utilizando sep. sep también se pasa a través de conditional_escape().
args_generator debe ser un iterador que devuelve argumentos para pasar a format_html(), ya sean secuencias de argumentos posicionales o mapas de argumentos clave.
Por ejemplo, se pueden utilizar tuplas para argumentos posicionales:
format_html_join(
"\n",
"<li>{} {}</li>",
((u.first_name, u.last_name) for u in users),
)
O diccionarios para argumentos clave:
format_html_join(
"\n",
'<li data-id="{id}">{id} {title}</li>',
({"id": b.id, "title": b.title} for b in books),
)
Se ha agregado soporte para mapas en args_generator.
Escapa todos los caracteres especiales HTML/XML con sus escapes Unicode, por lo que el valor es seguro para su uso con JavaScript. También envuelve el JSON escapado en una etiqueta <script>. Si el parámetro element_id no es None, la etiqueta <script> se le da el id pasado.
>>> json_script({"hello": "world"}, element_id="hello-data")
'<script id="hello-data" type="application/json">{"hello": "world"}</script>'
El encoder, que tiene como valor predeterminado django.core.serializers.json.DjangoJSONEncoder, se utilizará para serializar los datos. Consulte la referencia a la <serialization-formats-json> serialización de JSON para obtener más detalles sobre este serializador.
Intenta eliminar cualquier cosa que parezca ser una etiqueta HTML del string, es decir, cualquier cosa contenida dentro de <>.
No se proporciona absolutamente ninguna garantía sobre la cadena resultante siendo segura para HTML. Por lo tanto, NUNCA marque seguro el resultado de un llamado a strip_tags sin escaparlo primero, por ejemplo con escape().
Por ejemplo:
strip_tags(value)
Si value es "<b>Joel</b> <button>es</button> un <span>slug</span>" el valor de retorno será "Joel es un slug".
Si estás buscando una solución más robusta, considera utilizar una herramienta de terceros para sanitizar HTML.
El método __html__() en una clase ayuda a los plantillas no Django a detectar clases cuya salida no requiere escapado de HTML.
Este decorador define el método __html__() en la clase decorada al envolver __str__() con mark_safe(). Asegúrate de que el método __str__() devuelve efectivamente texto que no requiere escapado de HTML.
django.utils.http¶Una versión de la función urllib.parse.urlencode() de Python que puede operar sobre MultiValueDict y valores no de cadena.
Formatea el tiempo para coincidir con el formato de fecha especificado por HTTP RFC 9110 Section 5.6.7.
Acepta un número flotante expresado en segundos desde la época en UTC–como el que produce time.time(). Si se establece en None, utiliza el tiempo actual.
Imprime una cadena en el formato Wdy, DD Mon YYYY HH:MM:SS GMT.
Construye un valor de encabezado HTTP Content-Disposition a partir del filename dado tal como se especifica en RFC 6266. Devuelve None si as_attachment es False y filename es None, de lo contrario devuelve una cadena adecuada para el encabezado HTTP Content-Disposition.
django.utils.module_loading¶Funciones para trabajar con módulos de Python.
Importa un camino de módulo punteado y devuelve el atributo/clase designado por el último nombre en el camino. Levanta ImportError si la importación falló. Por ejemplo:
from django.utils.module_loading import import_string
ValidationError = import_string("django.core.exceptions.ValidationError")
Los textos traducidos son:
from django.core.exceptions import ValidationError
django.utils.safestring¶Funciones y clases para trabajar con «cadenas seguras»: cadenas que se pueden mostrar de forma segura sin escapar adicional en HTML. Marcar algo como una «cadena segura» significa que el productor de la cadena ya ha convertido los caracteres que no deben ser interpretados por el motor HTML (por ejemplo, “<”) en las entidades correspondientes.
Una subclase str que se ha marcado específicamente como «segura» (requiere escapar adicional) para fines de salida en HTML.
Marka explícitamente una cadena como segura para fines de salida (HTML) y el objeto devuelto se puede utilizar en cualquier lugar donde sea apropiado un string.
Puede llamarse varias veces sobre una sola cadena.
También se puede usar como decorador.
Para construir fragmentos de HTML, normalmente deberías estar utilizando django.utils.html.format_html() en su lugar.
Una cadena marcada como segura volverá a ser insegura si se modifica. Por ejemplo:
>>> mystr = "<b>Hello World</b> "
>>> mystr = mark_safe(mystr)
>>> type(mystr)
<class 'django.utils.safestring.SafeString'>
>>> mystr = mystr.strip() # removing whitespace
>>> type(mystr)
<type 'str'>
django.utils.text¶Una versión de str.format() para cuando format_string, args y/o kwargs contienen objetos perezosos. El primer argumento es la cadena a ser formateada. Por ejemplo:
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(),
),
]
Este ejemplo permite a los traductores traducir parte de la URL. Si «person» se traduce a «persona», la expresión regular coincidirá con persona/(?P<pk>\d+)/$, por ejemplo persona/5/.
Convierte una cadena en un slug de URL mediante:
La conversión a ASCII si allow_unicode es False (el valor predeterminado).
Convierte a minúsculas.
Elimina los caracteres que no son alfanuméricos, guiones bajos, guiones o espacios en blanco.
Sustituye cualquier espacio en blanco o guiones repetidos por un solo guión.
Elimina los espacios en blanco y guiones en las cabeceras y pies de página.
Ejemplo:
>>> slugify(" Joel is a slug ")
'joel-is-a-slug'
Si deseas permitir caracteres Unicode, pasa allow_unicode=True. Por ejemplo:
>>> slugify("你好 World", allow_unicode=True)
'你好-world'
django.utils.timezone¶Devuelve una instancia de tzinfo que representa una zona horaria con un desplazamiento fijo desde UTC.
offset es una datetime.timedelta o un número entero de minutos. Utiliza valores positivos para las zonas horarias al este de UTC y negativos para las zonas al oeste de UTC.
Devuelve una instancia de tzinfo que representa la zona horaria por defecto <default-current-time-zone>.
Devuelve el nombre de la zona horaria por defecto <default-current-time-zone>.
Returns una instancia de la clase tzinfo que representa la zona horaria actual <default-current-time-zone>.
Devuelve el nombre de la zona horaria actual <default-current-time-zone>.
Establece la zona horaria actual <default-current-time-zone>. El argumento timezone debe ser una instancia de una subclase de tzinfo o un nombre de zona horaria.
Este es un contexto de Python que establece la zona horaria actual <default-current-time-zone> al entrar con activate(), y restaura la zona horaria previamente activa al salir. Si el argumento timezone es None, la zona horaria actual <default-current-time-zone> se deshabilita al entrar con deactivate() en lugar de establecerla.
También override es usable como decorador de funciones.
Convierte una fecha y hora consciente de la zona horaria a otra zona horaria, por defecto la zona horaria actual <default-current-time-zone>.
Si se omite el valor, por defecto es now().
Esta función no funciona con fechas y horas ingenuas; utilice en su lugar make_aware() .
Utiliza la función localtime() para convertir una fecha y hora consciente de la zona horaria a un día en una zona horaria diferente, por defecto la zona horaria actual <default-current-time-zone>.
Si se omite el valor, por defecto es now().
Esta función no funciona con fechas y horas naifas.
Devuelve una datetime que representa el momento actual. Exactamente qué se devuelve depende del valor de la configuración USE_TZ:
Si la configuración USE_TZ es False, esto será un datetime naif (es decir, una fecha y hora sin asociar a un zona horaria) que representa el momento actual en la zona horaria local del sistema.
Si la configuración USE_TZ es True, esto será un datetime con conciencia de zona horaria que representa el momento actual en UTC. Tenga en cuenta que now() siempre devuelve veces en UTC, independientemente del valor de la configuración TIME_ZONE; puede usar localtime() para obtener la hora en la zona horaria actual.
Devuelve True si value es consciente, False si es naif. Esta función asume que value es un datetime.
Devuelve True si value es naif, False si es consciente. Esta función asume que value es un datetime.
django.utils.translation¶Para una discusión completa sobre el uso del siguiente, consulte la documentación de traducción :doc:` </topics/i18n/translation>`.
Traduce message dado el context y devuelve como cadena de caracteres.
Para más información, consulte Marcadores de contexto.
Igual que las versiones no perezosas anteriores, pero utilizando la ejecución perezosa.
Marca las cadenas para su traducción, pero no las traduce ahora. Esto se puede utilizar para almacenar cadenas en variables globales que deben permanecer en el idioma base (pues pueden usarse externamente) y serán traducidas más tarde.
Traduce singular y plural y devuelve la cadena adecuada según number.
Traduce singular y plural y devuelve la cadena adecuada según number y el context.
Igual que las versiones no perezosas anteriores, pero utilizando la ejecución perezosa.
Obtiene el objeto de traducción para un idioma dado y lo activa como objeto de traducción actual para el hilo actual.
Desactiva el objeto de traducción actual para que las llamadas a _ resuelvan contra el objeto de traducción por defecto, nuevamente.
Hace que el objeto de traducción activo sea una instancia de NullTranslations(). Esto es útil cuando queremos que las traducciones diferidas aparezcan como la cadena original por alguna razón.
Un administrador de contexto de Python que utiliza django.utils.translation.activate() para obtener el objeto de traducción para un idioma dado, lo activa como objeto de traducción para el hilo actual y reactiva el idioma activo previo al salir. Opcionalmente, puede desactivar la traducción temporal al salir con django.utils.translation.deactivate() si el argumento deactivate es True. Si pasa None como argumento de idioma, se activa una instancia de NullTranslations() dentro del contexto.
También override es usable como decorador de funciones.
Verifica si existe un archivo de idiomas global para el código de idioma dado (por ejemplo, “fr”, “pt_BR”). Esto se utiliza para decidir si un idioma proporcionado por el usuario está disponible.
Devuelve el código de idioma seleccionado actualmente. Devuelve None si las traducciones están desactivadas temporalmente (mediante deactivate_all() o cuando None se pasa a override()).
Devuelve la disposición BiDi del idioma seleccionado:
False = disposición de izquierda a derecha
True = disposición de derecha a izquierda
Analiza la solicitud para encontrar qué idioma el usuario quiere que el sistema muestre. Solo se tienen en cuenta los idiomas listados en settings.LANGUAGES. Si el usuario solicita un subidioma donde tenemos un idioma principal, enviamos el idioma principal.
Si check_path es True, la función verifica primero la URL solicitada para ver si su ruta comienza con un código de idioma listado en la LANGUAGES configuración.
Devuelve lang_code si está en la LANGUAGES configuración, posiblemente seleccionando una variante más genérica. Por ejemplo, se devuelve 'es' si lang_code es 'es-ar' y 'es' está en LANGUAGES pero 'es-ar' no lo está.
lang_code tiene un límite máximo de longitud de 500 caracteres. Se levanta una LookupError si lang_code supera este límite y strict es True, o si no existe una variante genérica y strict es False.
Si strict es False (el valor por defecto), se puede devolver una variante específica de país cuando ni el código de idioma ni su variante genérica están encontrados. Por ejemplo, si solo está en LANGUAGES 'es-co', se devuelve para los códigos de idioma como 'es' y 'es-ar'. Esa coincidencia no se devuelve si strict=True.
Se levanta una LookupError si no se encuentra nada.
En versiones anteriores, los valores de lang_code que superaban 500 caracteres se procesaban sin levantar una LookupError.
may 31, 2026