J'ai une table sur la base de données qui utilise les valeurs d'une base de données externe. Cette base de données externe met à jour ses valeurs périodiquement.
Afin de mettre à jour ma base de données à chaque fois que je démarre le serveur, je souhaite exécuter un script juste après le serveur.
Solution potentielle:
J'ai vu qu'il est possible d'exécuter un script à partir d'une certaine application, ce qui m'intéresse. Ceci est réalisable en utilisant les django-extensions
:
https://django-extensions.readthedocs.io/en/latest/runscript.html
Cependant, ce script ne s'exécute qu'avec la commande suivante:
python manage.py runscript your_script
Existe-t-il un autre moyen d'exécuter un script à partir d'une application et de l'exécuter juste après la commande runserver? Je suis ouvert aux suggestions!
Merci d'avance
Mise à jour
Merci à @Raydel Miranda pour les remarques, je pense que je laissé quelques informations derrière.
Mon objectif est qu'une fois le serveur démarré, je prévois d'ouvrir une socket pour maintenir ma base de données à jour.
4 Réponses :
Vous pouvez exécuter le code dans le urls.py
de niveau supérieur. Ce module est importé et exécuté une fois.
urls.py from django.confs.urls.defaults import * from your_script import one_time_startup_function urlpatterns = ... one_time_startup_function()
Je recommanderais d'utiliser quelque chose comme ça, disons que vous avez le script comme ceci:
python manage.py runserver & python manage.py shell < abc.py
Vous pouvez maintenant exécuter ce script juste après runserver (ou de toute autre manière que vous exécutez le django) comme ceci:
# abc.py from your_app.models import do_something do_something()
Pour info, cela ne fonctionnera que si vous avez bash dans votre terminal (comme dans Linux, MacOs).
Après avoir lu attentivement votre problème, je pense qu'exécuter un script après runserver
n'est peut-être pas la meilleure solution. Comme vous l'avez dit:
Cette base de données externe met à jour ses valeurs périodiquement.
Donc, je pense que vous avez besoin d'une sorte de tâche pérodique pour faire cette mise à jour. Vous pouvez utiliser cronjob ou vous pouvez utiliser Céleri pour cela.
Nous pouvons voter pour cronjob pour cela car le réglage du céleri peut coûter cher pour un seul scipt
Une commande Django personnalisée + cron
semble être la solution la plus simple. Un script devra gérer l'initialisation des paramètres de django, les chemins, etc ...
Lancer le script après runserver ne semble pas une très bonne idée, la raison principale est que vous aurez une fenêtre puisque le serveur est en cours d'exécution (et disponible pour les utilisateurs) jusqu'à ce que vous ayez fini de synchroniser vos données. De plus, si vous synchronisez à l'aide d'un script après runserver
, vous ne recevrez pas de mises à jour de la base de données externe après cela.
La meilleure solution pour cela est de configurer plusieurs bases de données, vous pouvez utiliser la base de données externe avec un accès en lecture uniquement. De cette façon, vos vues fourniront des données vraiment mises à jour.
D'autre part ...
Si vous voulez utiliser quelque chose comme un script, il est préférable d'écrire un Commande personnalisée Django (de cette façon, vous n'avez pas à vous occuper de l'initialisation des paramètres de django et d'autres problèmes) et exécutez-la en utilisant cron ou celery comme l'indique @ruddra dans sa réponse.
Dit ceci, vous devriez voir ceci: https: // docs.djangoproject.com/en/2.1/topics/db/multi-db/
Merci pour le conseil! En fait, je n'ai pas un accès complet à la base de données distante. Je ne peux obtenir certaines valeurs qu'en demandant les données historiques dans une plage de périodes. Mon objectif était d'abord de mettre à jour ma base de données puis d'ouvrir une socket pour lire en temps réel la base de données distante
Regardez la section "D'autre part ..." dans la réponse.
J'ai implémenté la commande custom_command et fonctionne très bien! cependant, je ne peux pas l'exécuter à partir de runserver uniquement
Détrompez-vous mon ami, vous voulez exécuter une telle commande en utilisant cron, disons, toutes les 5 minutes pour garder vos données à jour. Pas seulement lors du démarrage du serveur.
Comme écrit dans le premier commentaire, je n'aurai pas besoin de mettre à jour à nouveau le serveur étant donné qu'après l'initialisation, j'ouvrirai une socket ( channels.readthedocs.io/en/latest ).
Cela peut aider. vous pouvez modifier votreapp / apps.py
class MyAppConfig(AppConfig): name = 'myapp' def ready(self): # update my database here pass
Les solutions @Alvaro Again comme celle-ci ne mettront à jour vos données qu'une seule fois au démarrage de votre serveur. Vous souhaitez garder vos utilisateurs informés.
Tout ce que vous avez à faire est d'appeler le script après votre URL.
Regardez ma solution si la base de données externe se met à jour périodiquement, vous ne voulez pas redémarrer le serveur périodiquement juste pour obtenir les nouvelles données. Utilisez plusieurs bases de données pour obtenir ce que vous voulez.