Utiliza este crédito gratuito para lanzar tus proyectos ahora en Digital Ocean, eres libre de gastarlo cuando quieras en los siguientes 60 días.
Í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 .