1
resposta

[Dúvida] Django API

Olá pessoal, tudo bem? Estou desenvolvendo uma aplicação web para a analise em tempo real de sensores, essa API está sendo desenvolvida em Django RestFramework e será consumida em React. O problema começa porque não entendo como eu poderia subir o código da coleta dos sensores assim que o django subisse para o localhost. O django trabalha com um sistemas de apps, então assim que rodamos o servidor, ele carrega o apps principal de todos os apps do projeto (ou seja, ele carregas as configurações). Eu poderia colocar a lógica do beckend dentro dessa app principal para ela rodar automáticamente, porém me foi falado que por conta da coleta se tratar de um loop "infinito", ou seja, sempre estará esperando o sinal dos sensores, isso poderia dar problema no servidor a longo prazo. Tentei uma abordagem com Celery, mas não obtive sucesso, o celery me permite rodar o script de coleta mesmo que o django não esteja no ar, e esse tipo de abordagem não é interessante pro contexto. Como toda a aplicação vai depender dessa coleta, o interessante seria que assim que o localhost estiver no ar, esse script rode e se ele tiver algum problema, eu consiga tratar esse erro e de uma outra forma. Preciso muito de ajuda

1 resposta

Olá Julia, tudo bem?

Uma abordagem que pode funcionar para o seu caso é usar threads ou processos separados para lidar com a coleta de dados, de modo que eles sejam iniciados quando o servidor Django for iniciado.

Você pode utilizar a biblioteca threading do Python para criar uma thread que execute sua lógica de coleta de dados. Aqui está um exemplo básico de como você poderia fazer isso:

import threading
import time

def coletar_dados():
    while True:
        try:
            # Sua lógica de coleta de dados aqui
            print("Coletando dados dos sensores...")
            time.sleep(5)  # Simula o tempo de espera entre as coletas
        except Exception as e:
            # Trate os erros aqui
            print(f"Erro na coleta de dados: {e}")

# Iniciar a thread quando o servidor Django iniciar
def iniciar_coleta():
    thread = threading.Thread(target=coletar_dados)
    thread.daemon = True  # Permite que o Django seja encerrado sem esperar a thread
    thread.start()

# No arquivo apps.py do seu app principal
from django.apps import AppConfig

class MeuAppConfig(AppConfig):
    name = 'meu_app'

    def ready(self):
        iniciar_coleta()

No exemplo acima, a função coletar_dados é executada em uma thread separada, permitindo que o servidor Django continue a operar normalmente. A função iniciar_coleta é chamada quando o app Django é carregado, graças ao método ready no arquivo apps.py.

Essa abordagem permite que você trate erros dentro da função de coleta de dados e mantenha o loop de coleta separado do fluxo principal do Django. Lembre-se de ajustar o tempo de espera e a lógica de coleta conforme necessário para o seu caso específico.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.