Índice del contenido

Django 3.1 cambios y novedades: resumen completo

Django 3.1 cambios y novedades: resumen completo

Hace unas horas estaba navegando por mi twitter y me enteré de que acaban de hacer públicas Django 3.1, cambios y novedades de ; mi framework para web favorito. Esta nueva versión tiene algunos cambios interesantes de los que hablaré a continuación.

Vistas, Middleware y tests asíncronos

Adivina quién más le está apostando a la asincronía. Con esta nueva actualización Django incorpora asincronismo en vistas, middleware y tests. Sin embargo el ORM de Django, la cache y otras piezas de código que se conectan con internet no tienen soporte asíncrono para esta actualización, aunque en la documentación se afirma que se añadirá soporte para versiones posteriores.

vistas

Django reconocerá las vistas que especifiquemos con async def y se encargará de ejecutarlas en un contexto asíncrono. Para obtener los beneficios se debe usar un servidor ASGI. Por otro lado, también es posible usar un servidor WSGI pero habrá penalizaciones en el rendimiento.

import datetime
from django.http import HttpResponse

async def current_datetime(request):
    now = datetime.datetime.now()
    html = '<html><body>It is now %s.</body></html>' % now
    return HttpResponse(html)

middleware

Django ahora permite combinar tanto middlewares asíncronos o sincronos. De manera predeterminada Django asumirá que tus middlewares son sincronos. Para modificar este comportamiento es necesario cambiar los atributos booleanos de tu fábrica de middleware:

  • sync_capable (default en True)
  • async_capable (default en False)

Django incorpora ahora tres decoradores para tus fábricas de middlewares. Además, si tu fábrica de middleware retorna un get_response() asíncrono debe usarse la sintaxis adecuada; async def.

  • sync_only_middleware()
  • async_only_middleware()
  • and sync_and_async_middleware()
import asyncio
from django.utils.decorators import sync_and_async_middleware

@sync_and_async_middleware
def simple_middleware(get_response):
    # One-time configuration and initialization goes here.
    if asyncio.iscoroutinefunction(get_response):
        async def middleware(request):
            # Do something here!
            response = await get_response(request)
            return response

    else:
        def middleware(request):
            # Do something here!
            response = get_response(request)
            return response

    return middleware

tests

Si estás haciendo pruebas desde una función asíncrona debes usar el cliente de test asíncrono que está disponible como django.test.AsyncClient, o como self.async_client. Este nuevo cliente AsyncClient tiene los mismos métodos que el cliente normal de testeo.

async def test_my_thing(self):
    response = await self.async_client.get('/some-url/')
    self.assertEqual(response.status_code, 200)

Campos compatibles con JSON

¡Ya era tiempo de un campo JSON! Django ahora incluye un campo para sus modelos llamado models.JSONField y un campo forms.JSONfield, que puede ser usado en cualquier backend de base de datos compatible. Ambos campos soportan codificadores y decodificadores de JSON personalizados.

from django.db import models

class ContactInfo(models.Model):
    data = models.JSONField()

ContactInfo.objects.create(data={
    'name': 'John',
    'cities': ['London', 'Cambridge'],
    'pets': {'dogs': ['Rufus', 'Meg']},
})

Búsqueda en campos JSON

Podemos filtrar por este nuevo campo buscando el contenido de las propiedades del JSON usando notación de doble guión bajo.


ContactInfo.objects.filter(
    data__name='John',
)

Django nos otorga la capacidad buscar objetos por la presencia de llaves específicas en el nivel más alto del contenido de su campo JSON


ContactInfo.objects.filter(
    data__pets__has_key='dogs',
)

Así mismo podemos buscar la presencia o ausencia de ciertos elementos en una propiedad que tenga como valor una lista


ContactInfo.objects.filter(
    data__cities__contains='London',
)

Configuración DEFAULT_HASHING_ALGORITHM

Con esta nueva actualización podemos especificar el algoritmo por defecto de hashing en el archivo settings.py. Este valor se usará para codificar las cookies, tokens de reseteo de contraseña en el panel de administraciones, sesiones de usuario y en las firmas creadas por django.core.signing.Signer y django.core.signing.dumps(). Además se agrega soporte para SHA-256.

Otras novedades de Django 3.1

PASSWORD_RESET_TIMEOUT_DAYS es obsoleta en favor de PASSWORD_RESET_TIMEOUT, esta nueva variable de configuración permite definir el número de segundos que será válido un enlace reinicio de contraseña.

Ya se puede iterar a través del Paginator para obtener las páginas.

Se agrega un enlace para limpiar todos los filtros en el panel lateral derecho del admin.

Ahora la variable de configuración CSRF_COOKIE_SAMESITE permite ‘None’ como valor. Mientras que HttpResponse.set_cookie() y HttpResponse.set_signed_cookie() permiten usar samesite=‘None’.

Recuerda que si quieres ver los cambios a la documentación completa puedes entrar en este enlace para ver los cambios completos que trae la versión de Django 3.1

Si quieres mejorar tus habilidades en Django te dejo aquí recomendaciones de dos excelentes libros. Entra y checa mis reseñas de Django for Professionals y de Two scoops of Django.

Eduardo Zepeda
Desarrollador web, entusiasta de los sistemas GNU/Linux y el Software Libre. Py, Ts y Go, pero abierto a otras opciones como el Rustaceanismo. Creo en las bondades de las criptodivisas más allá de la especulación monetaria.
Leer más