2009-09-04 5 views
3

J'ai un site web qui récupère des informations de flux RSS périodiquement (enfin, actuellement manuellement, et c'est mon problème). Ceci est actuellement implémenté comme une vue Django normale, ce qui n'est pas très agréable à mon avis. Je voudrais avoir un programme Python qui est exécuté en utilisant un cronjob au lieu de visiter manuellement l'URL correcte pour mettre à jour les informations.Meilleur moyen d'écrire un programme Python avec accès à la fonctionnalité de base de données Django

Quelle est la manière la plus simple de faire en sorte qu'un programme Python ait accès à mon application Django et à l'ORM de Django?

+0

double: http://stackoverflow.com/questions/579511/using-only-the-db-part-of-django –

+0

double: http: // stackoverflow. com/questions/302651/use-only-some-parts-of-django –

Répondre

13
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) 

C'est ainsi que je l'ai fait pour un cron qui a envoyé des mises à jour quotidiennes par courriel. Le .py vécu dans la racine de mon application django, donc les paramètres d'importation reflètent cela en conséquence.

+0

Cela a été très utile. Merci. –

0

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 

À partir de là, vous devriez être en mesure d'importer vos modèles/vues/forms/whatever else, et ont un environnement à peu près comme un ./manage.py shell

Note: Selon la façon dont vous faites vos importations dans votre projet, cela ne peut pas t fonctionne 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 
0

Je voudrais avoir un programme Python qui est exécuté en utilisant un cronjob à la place de visiter manuellement l'URL correcte pour mettre à jour les informations.

Une alternative simpliste: écrire un cronjob à 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 expliquez votre véritable problème sous-jacent, ce pourrait être l'approche la plus simple et la plus immédiate pour la résoudre.

9

Une alternative à toutes les approches données ici consiste à écrire votre travail cron en tant que commande personnalisée ./manage.py. C'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. Sur ce point est très clairsemé, mais il vous dit de regarder le code pour les commandes existantes, que vous pouvez utiliser comme modèle pour les vôtres.

+0

Cela fonctionne parfaitement; juste comme une note supplémentaire, gardez à l'esprit que cron et apache sont la propriété de différents utilisateurs, et donc vous pouvez avoir des problèmes avec l'environnement (comme proxy, autorisations, etc). –

+0

Vous pouvez probablement exécuter le travail cron en tant qu'utilisateur apache. –

2

Modifier: Django 1,7

import os 
import django 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") 
django.setup() 
#have fun 

Credit


sélectionnée réponse 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 

Source: https://stackoverflow.com/a/18760222

Questions connexes