Django programa/ejecuta tareas dinámicamente en un momento específico periódicamente a partir del pedido del usuario en la aplicación (sin celery)
Estoy creando una aplicación de Django en la cual el usuario puede programar algunas tareas para que ocurran en un momento específico.
Por ejemplo, en Google Calendar le decimos a Google lo que haremos mañana y luego, en el momento indicado, nos envía una notificación. De manera similar, aquí quiero que sea flexible, por ejemplo, que el usuario le indique a Django la hora y la función a ejecutar. Django esperará hasta la hora indicada para luego ejecutar la función.
Por ejemplo, si el usuario dice “apagar luces a las 12 pm”, entonces Django lo hará. O por ejemplo:
El usuario dice “recuérdame ir al gimnasio en 30 minutos”, y luego, después de 30 minutos, recibe una notificación.
En realidad, las tareas se agregan de forma dinámica, por lo que no podemos codificarlas de antemano.
Código:
skills.py # todas las funciones definidas por el usuario se importan aquí
# por ejemplo, toma esta tarea
def apagar_luz(habitación, id, *args, **kwargs):
# apagar la luz usando python (tu lógica)
print(f"¡La luz {id} ha sido apagada!")
Hay un modelo en Django conocido como Function
en el cual esta función se almacena y el usuario puede acceder a ella fácilmente.
Quiero que los usuarios
seleccionen esta función
dentro de la aplicación y también proporcionen parámetros y hora
, ¡y Django la ejecutará en ese momento!
En resumen, lo que necesito es que el usuario, desde dentro de la aplicación, pueda establecer la hora en la que se ejecutará una función (o tarea) en un momento específico (tal vez periódicamente o una vez o en una situación) y Django la ejecutará en ese momento determinado.
Nota: el usuario también proporcionará argumentos (args) y argumentos con nombre (kwargs) (me encargaré de eso). Lo que necesito es que Django ejecute la función con esos argumentos y argumentos con nombre.
(Solo se apreciará utilizar métodos de Django sin algo como Celery)
¡Gracias!
davy.ai
Aplicación de Django para programar tareas
Introducción
En este proyecto, estamos creando una aplicación de Django en la cual los usuarios pueden programar tareas para que ocurran en un momento específico. El usuario puede seleccionar una función de una lista de funciones definidas por el usuario y también proporcionar argumentos y argumentos de palabras clave a esa función. Django esperará hasta el momento especificado y luego ejecutará la función con los argumentos y argumentos de palabras clave dados.
Pasos
Definir la función y almacenarla en un modelo de Django
Definimos una función en un módulo separado de Python, digamos
skills.py
, que contiene todas las funciones a ser ejecutadas por Django. Por ejemplo, podemos definir una función enskills.py
para apagar la luz.Creamos un modelo de Django para almacenar estas funciones. El modelo se llama
Funcion
, dondename
es el nombre de la función,module
es el nombre del módulo de Python donde se define la función (en nuestro caso,skills
), yargs
ykwargs
son los argumentos por defecto y argumentos de palabras clave para la función, respectivamente.Crear vistas y formularios de Django
Creamos un formulario de Django para permitir a los usuarios seleccionar una función, dar valores para los argumentos y argumentos de palabras clave, y seleccionar la fecha y hora en que la función debe ser ejecutada. El formulario se llama
FormularioTarea
y se define enforms.py
.Luego, creamos una vista para manejar las peticiones
GET
para mostrar el formulario y las peticionesPOST
para agregar una nueva tarea. La vista se llamaagregar_tarea
y se define enviews.py
.La vista verifica si el método de la petición es
POST
. Si lo es, crea una instancia deFormularioTarea
a partir de los datos de la petición. Si el formulario es válido, extrae la función seleccionada, los argumentos y los argumentos de palabras clave, y la hora programada de los datos del formulario, y programa la tarea (discutiremos la lógica de programación más adelante). Finalmente, devuelve una respuesta JSON con estado"ok"
si la tarea fue programada correctamente, o una respuesta JSON con estado"error"
y los errores del formulario si el formulario no era válido.Si el método de la petición es
GET
, la vista crea una instancia vacía deFormularioTarea
y un queryset de todas las funciones disponibles, y renderiza la plantillaagregar_tarea.html
con el formulario y el queryset.Crear plantillas HTML
Creamos una plantilla HTML para el formulario
FormularioTarea
. La plantilla se llamaagregar_tarea.html
y se define de la siguiente manera.La plantilla extiende una plantilla base (no mostrada aquí) y bloquea el
content
. Crea un formulario con una entradadatetime-local
para la hora programada, y un botón de envío. El formulario usa el métodoPOST
para enviar datos a la vistaagregar_tarea
.También necesitamos crear una plantilla
success.html
y una plantillaerror.html
para mostrar un mensaje de éxito o de error después de que el usuario envíe el formulario.Programar la tarea
Ahora llegamos a la parte central del proyecto: programar la tarea. En Django, podemos usar el paquete incorporado
django_apscheduler
, que es un envoltorio ligero alrededor del popular paqueteAPScheduler
.django_apscheduler
proporciona una forma sencilla de programar tareas en Django sin necesidad de una cola de tareas externa como Celery.Primero, instalamos el paquete
django_apscheduler
.Luego, agregamos
apscheduler
ydjango_apscheduler
a la configuraciónINSTALLED_APPS
ensettings.py
.Después, agregamos la configuración de
apscheduler
asettings.py
. Podemos configurar el planificador para usar una base de datos o una base de datos en memoria. Aquí, utilizamos la base de datos.También agregamos la configuración de URL de
django_apscheduler
aurls.py
.Finalmente, modificamos la vista
agregar_tarea
para programar la tarea cuando se envía el formulario.“`python
views.py
import datetime
from django_apscheduler.jobstores import DjangoJobStore
from django_apscheduler.models import DjangoJobExecution
def agregar_tarea(request):
if request.method == “POST”: