Maneira mais fácil de escrever um programa Python com acesso à funcionalidade do banco de dados Django
-
21-09-2019 - |
Pergunta
Eu tenho um site que busca informações do RSS Feeds periodicamente (bem, atualmente manualmente, e esse é o meu problema). Atualmente, isso é implementado como uma visão normal do Django, o que não é muito bom na minha opinião. Eu gostaria de ter um programa Python que seja executado usando um Cronjob em vez de visitar manualmente o URL correto para atualizar as informações.
Qual é a maneira mais fácil de fazer com que um programa Python tenha acesso ao meu aplicativo Django específico e ao Django ORM?
Solução
from django.core.management import setup_environ
from django.core.mail import EmailMultiAlternatives, send_mail
from django.contrib.auth.models import User
import settings
from my.app.models import *
setup_environ(settings)
Foi assim que fiz isso por um cron que enviou por e -mail as atualizações diárias. O .py morava na raiz do meu aplicativo Django, para que as configurações de importação refletiriam isso de acordo.
Outras dicas
Uma alternativa a todas as abordagens dadas aqui é escrever seu trabalho de cron como um costume ./manage.py
comando. Isso é muito fácil de fazer e lhe dá a capacidade de fazer ./manage.py yourcommand
na linha de comando ou no seu crontab.
A documentação Sobre isso é muito escasso, mas diz para você olhar para o código dos comandos existentes, que você pode usar como modelo para o seu.
Editar: Para django 1.7
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
django.setup()
#have fun
A resposta selecionada é descontinuada Desde Django 1.4
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
#from your_app_name import models
##have fun
Você quer algo assim em seu crontab:
PYTHONPATH=/path/to/your/project DJANGO_SETTINGS_MODULE=settings myscript.py
E então seu script python deve começar com isso:
#!/usr/bin/env python
from django.conf import settings
A partir daí, você poderá importar seus modelos / visualizações / formulários / qualquer outra coisa, e ter um ambiente praticamente como um ./manage.py shell
Nota: Dependendo de como você faz suas importações dentro do seu projeto, isso pode não funcionar exatamente como mostrado. Se você está sempre fazendo algo como "de myProject.myapp.models import *", então você deseja definir a linha Cron para parecer mais assim:
PYTHONPATH=/path/to/1_level_before_your_project DJANGO_SETTINGS_MODULE=myproject.settings myscript.py
Eu gostaria de ter um programa Python que seja executado usando um Cronjob em vez de visitar manualmente o URL correto para atualizar as informações.
Uma alternativa simplista: escreva um cronjob para automaticamente "Visite o URL correto para atualizar as informações" - pode ser tão simples quanto um curl
ou wget
, afinal. Isso não responde à pergunta no título, mas, dada a maneira como você explica o seu verdadeiro problema subjacente, pode ser a abordagem mais simples e imediata para resolvê -la.