Plus simple à écrire un programme Python avec accès à la fonctionnalité de base de données Django
-
21-09-2019 - |
Question
J'ai un site Web qui va chercher l'information de flux RSS périodiquement (bien, actuellement manuellement, ce qui est mon problème). Ceci est actuellement mis en œuvre en vue Django normale, ce qui est très agréable à mon avis. Je voudrais avoir un programme Python qui est exécuté en utilisant une tâche cron au lieu de visiter manuellement l'URL correcte pour mettre à jour les informations.
Quelle est la meilleure façon de faire un programme Python ont accès à mon application particulière Django et Django ORM?
La solution
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)
Ce fut ainsi que je l'ai fait pour une Cron que les parties mises à jour quotidiennes envoyé par courriel. Le .py vivait à la racine de mon application django, de sorte que les paramètres d'importation refléterait que, par conséquent.
Autres conseils
Une alternative à toutes les approches données ici est d'écrire votre tâche cron comme une commande ./manage.py
personnalisée. Ceci est très facile à faire, et vous donne la possibilité de faire ./manage.py yourcommand
soit sur la ligne de commande ou dans votre crontab.
La documentation sur ce qui est très rare, mais il ne vous dit de regarder le code pour les commandes existantes, que vous pouvez utiliser comme modèle pour votre propre.
Modifier : Pour Django 1.7
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
django.setup()
#have fun
réponse choisie est dépréciée depuis Django 1.4
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
#from your_app_name import models
##have fun
Vous voulez quelque chose comme ça dans votre crontab:
PYTHONPATH=/path/to/your/project DJANGO_SETTINGS_MODULE=settings myscript.py
Et puis votre script python devrait commencer par ceci:
#!/usr/bin/env python
from django.conf import settings
A partir de là, vous devriez être en mesure d'importer vos modèles / vues / formes / tout le monde, et ont un environnement à peu près comme un ./manage.py shell
Remarque: Selon la façon dont vous faites vos importations dans votre projet, cela peut ne pas exactement comme indiqué. Si vous êtes toujours en train de faire quelque chose comme « de myproject.myapp.models import * », alors vous voulez mettre en ligne cron pour ressembler à ceci:
PYTHONPATH=/path/to/1_level_before_your_project DJANGO_SETTINGS_MODULE=myproject.settings myscript.py
Je voudrais avoir un programme Python qui est exécuté à l'aide d'un cronjob place de visiter manuellement l'URL correcte de mettre à jour les informations.
Une alternative simpliste: écrire une tâche cron pour automatiquement « visiter l'URL correcte pour mettre à jour les informations » - pourrait être aussi simple que d'un curl
ou wget
, après tout. Cela ne répond pas à la question dans le titre, mais étant donné la façon dont vous expliquer votre vrai problème sous-jacent, il pourrait bien être l'approche la plus simple et le plus immédiat pour le résoudre.