Estou trabalhando em um aplicativo Web usando o Django, e estou curioso para saber se existe uma maneira de agendar um trabalho para ser executado periodicamente.
Basicamente, eu só quero percorrer o banco de dados e fazer alguns cálculos / atualizações de forma automática e regular, mas não consigo encontrar nenhuma documentação para fazer isso.
Alguém sabe como configurar isso?
Para esclarecer: Eu sei que posso configurar um cron
trabalho para fazer isso, mas estou curioso para saber se há algum recurso no Django que fornece essa funcionalidade. Eu gostaria que as pessoas pudessem implantar esse aplicativo elas mesmas sem ter que fazer muita configuração (de preferência zero).
Eu considerei desencadear essas ações "retroativamente" simplesmente verificando se um trabalho deveria ter sido executado desde a última vez em que uma solicitação foi enviada ao site, mas espero algo mais limpo.
Respostas:
Uma solução que empreguei é fazer isso:
1) Crie um comando de gerenciamento personalizado , por exemplo
2) Use
cron
(no Linux) ouat
(no Windows) para executar meu comando nos horários necessários.Esta é uma solução simples que não requer a instalação de uma pilha AMQP pesada. No entanto, existem boas vantagens em usar algo como o aipo, mencionado nas outras respostas. Em particular, com o Celery, é bom não ter que espalhar a lógica do aplicativo em arquivos crontab. No entanto, a solução cron funciona muito bem para um aplicativo de tamanho pequeno a médio e onde você não deseja muitas dependências externas.
EDITAR:
Na versão posterior do Windows, o
at
comando foi descontinuado para Windows 8, Server 2012 e superior. Você pode usarschtasks.exe
para o mesmo uso.**** UPDATE **** Este é o novo link do django doc para escrever o comando de gerenciamento personalizado
fonte
python manage.py runcrons
que executa todos os crons que você definiu e registrou.O aipo é uma fila de tarefas distribuída, construída no AMQP (RabbitMQ). Ele também lida com tarefas periódicas de maneira cron (consulte tarefas periódicas ). Dependendo do seu aplicativo, pode valer a pena.
O aipo é muito fácil de configurar com o django ( documentos ) e as tarefas periódicas realmente pulam as tarefas perdidas em caso de inatividade. O aipo também possui mecanismos de nova tentativa, caso uma tarefa falhe.
fonte
Temos código aberto o que eu acho que é um aplicativo estruturado. que a solução de Brian acima também alude. Gostaríamos muito de qualquer / todos os comentários!
https://github.com/tivix/django-cron
Ele vem com um comando de gerenciamento:
Isso faz o trabalho. Cada cron é modelado como uma classe (portanto, é tudo OO) e cada cron é executado em uma frequência diferente e garantimos que o mesmo tipo de cron não seja executado em paralelo (caso os próprios usuários demorem mais tempo do que sua frequência!)
fonte
at
ou foi projetado especificamente para trabalharcron
?Se você estiver usando um sistema operacional POSIX padrão, use cron .
Se você estiver usando o Windows, use em .
Escreva um comando de gerenciamento do Django para
Descubra em que plataforma eles estão.
Execute o comando "AT" apropriado para seus usuários ou atualize o crontab para seus usuários.
fonte
Interessante novo aplicativo Django conectável: django-chronograph
Você só precisa adicionar uma entrada cron que atue como um cronômetro, e você tem uma ótima interface de administração do Django nos scripts para executar.
fonte
Veja o Django Poor Man's Cron, que é um aplicativo Django que utiliza spambots, robôs de indexação de mecanismos de pesquisa e similares para executar tarefas agendadas em intervalos aproximadamente regulares
Veja: http://code.google.com/p/django-poormanscron/
fonte
Eu tinha exatamente o mesmo requisito há um tempo atrás e acabei resolvendo-o usando o APScheduler ( Guia do Usuário )
Isso torna os trabalhos de agendamento super simples e o mantém independente da execução de algum código com base na solicitação. A seguir, é apresentado um exemplo simples.
Espero que isso ajude alguém!
fonte
A sugestão de Brian Neal de executar comandos de gerenciamento via cron funciona bem, mas se você estiver procurando por algo um pouco mais robusto (ainda não tão elaborado quanto o aipo), eu procuraria uma biblioteca como o Kronos :
fonte
RabbitMQ e Aipo têm mais recursos e recursos de manipulação de tarefas que o Cron. Se a falha da tarefa não for um problema e você acha que lidará com tarefas quebradas na próxima chamada, então o Cron é suficiente.
O Aipo e o AMQP permitirão que você lide com a tarefa quebrada e ela será executada novamente por outro trabalhador (os trabalhadores do aipo aguardam a próxima tarefa a ser trabalhada), até que o
max_retries
atributo da tarefa seja atingido. Você pode até invocar tarefas em caso de falha, como registrar a falha ou enviar um email para o administrador assim que estemax_retries
for alcançado.E você pode distribuir servidores Celery e AMQP quando precisar escalar seu aplicativo.
fonte
Eu pessoalmente uso o cron, mas as partes do agendamento de tarefas do django-extensions parecem interessantes.
fonte
Embora não faça parte do Django, o Airflow é um projeto mais recente (a partir de 2016) que é útil para o gerenciamento de tarefas.
O Airflow é um sistema de automação e programação de fluxo de trabalho que pode ser usado para criar e gerenciar pipelines de dados. Uma interface do usuário baseada na Web fornece ao desenvolvedor uma variedade de opções para gerenciar e visualizar esses pipelines.
O fluxo de ar é escrito em Python e construído usando o Flask.
O Airflow foi criado por Maxime Beauchemin no Airbnb e de código aberto na primavera de 2015. Ingressou no programa de incubação da Apache Software Foundation no inverno de 2016. Aqui está a página do projeto Git e algumas informações adicionais .
fonte
Coloque o seguinte na parte superior do seu arquivo cron.py:
fonte
Eu apenas pensei sobre esta solução bastante simples:
Você pode adicionar parâmetros, mas apenas adicionando parâmetros ao URL.
Diga-me o que vocês pensam.
[Update] Agora estou usando o comando runjob do django-extensions em vez de curl.
Meu cron é mais ou menos assim:
... e assim por diante, diariamente, mensalmente, etc. Você também pode configurá-lo para executar um trabalho específico.
Acho mais manejável e mais limpo. Não requer mapeamento de um URL para uma visualização. Basta definir sua classe de trabalho e crontab e pronto.
fonte
depois da parte do código, eu posso escrever qualquer coisa como o meu views.py :)
de http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
fonte
Você deveria definitivamente conferir o django-q! Não requer configuração adicional e, possivelmente, possui tudo o necessário para lidar com qualquer problema de produção em projetos comerciais.
É ativamente desenvolvido e integra-se muito bem com django, django ORM, mongo, redis. Aqui está minha configuração:
fonte
Django APScheduler para trabalhos de agendador. O Advanced Python Scheduler (APScheduler) é uma biblioteca Python que permite agendar seu código Python para ser executado posteriormente, apenas uma vez ou periodicamente. Você pode adicionar novos trabalhos ou remover trabalhos antigos quando desejar.
nota: sou o autor desta biblioteca
Instalar o APScheduler
Exibir função de arquivo para chamar
nome do arquivo: scheduler_jobs.py
Configurando o planejador
faça o arquivo execute.py e adicione os códigos abaixo
Suas funções escritas Aqui, as funções do planejador são escritas em scheduler_jobs
Vincular o arquivo para execução
Agora, adicione a linha abaixo na parte inferior do arquivo URL
fonte
Eu tive algo parecido com o seu problema hoje.
Eu não queria que isso fosse tratado pelo servidor através do cron (e a maioria das bibliotecas eram apenas auxiliares do cron no final).
Então, eu criei um módulo de agendamento e o anexei ao init .
Não é a melhor abordagem, mas me ajuda a ter todo o código em um único local e com a execução relacionada ao aplicativo principal.
fonte
Sim, o método acima é ótimo. E eu tentei alguns deles. Por fim, encontrei um método como este:
Assim como recursivo .
Ok, espero que este método possa atender às suas necessidades. :)
fonte
Uma solução mais moderna (em comparação com o aipo) é o Django Q: https://django-q.readthedocs.io/en/latest/index.html
Possui ótima documentação e é fácil de grok. O suporte ao Windows está ausente, porque o Windows não suporta o processo de bifurcação. Mas funciona bem se você criar seu ambiente de desenvolvimento usando o Windows for Linux Subsystem.
fonte
Eu uso o aipo para criar minhas tarefas periódicas. Primeiro você precisa instalá-lo da seguinte maneira:
Não se esqueça de registrar
django-celery
suas configurações e, em seguida, você pode fazer algo assim:fonte
Não tenho certeza se isso será útil para qualquer pessoa, já que tive que fornecer outros usuários do sistema para agendar os trabalhos, sem dar a eles acesso ao servidor real (Windows) Agendador de tarefas, criei este aplicativo reutilizável.
Observe que os usuários têm acesso a uma pasta compartilhada no servidor, onde podem criar o arquivo de comando / tarefa / .bat necessário. Esta tarefa pode ser agendada usando este aplicativo.
O nome do aplicativo é Django_Windows_Scheduler
ScreenShot:
fonte
Se você deseja algo mais confiável que o Celery , tente o TaskHawk, construído sobre o AWS SQS / SNS .
Consulte: http://taskhawk.readthedocs.io
fonte
Para projetos dockerized simples, eu realmente não conseguia ver nenhuma resposta existente.
Então, eu escrevi uma solução muito básica, sem a necessidade de bibliotecas ou gatilhos externos, que são executados por conta própria. Nenhum os-cron externo necessário, deve funcionar em todos os ambientes.
Funciona adicionando um middleware:
middleware.py
models/cron.py
:settings.py
:fonte
A maneira mais simples é escrever um comando de shell customizado, ver Documentação do Django e executá-lo usando um cronjob no linux. No entanto, eu recomendo o uso de um corretor de mensagens como o RabbitMQ juntamente com o aipo. Talvez você possa dar uma olhada neste tutorial
fonte