2009-07-07 3 views
4

J'essaye de recharger automatiquement mon application django qui utilise apache + mod_wsgi sur ma machine Windows locale.Apache Django Mod_Wsgi - recharge automatique

Je voudrais savoir où dois-je ajouter ce code qui est référencé dans l'article suivant:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

def _restart(path): 
    _queue.put(True) 
    prefix = 'monitor (pid=%d):' % os.getpid() 
    print >> sys.stderr, '%s Change detected to \'%s\'.' % (prefix, path) 
    print >> sys.stderr, '%s Triggering Apache restart.' % prefix 
    import ctypes 
    ctypes.windll.libhttpd.ap_signal_parent(1) 

Répondre

1

Vous remplacez la fonction de redémarrage qui est mentionné dans le bloc de code ci-dessus le même article.

+0

Où est ce bloc de code? – Eeyore

+1

Vous devriez avoir une sorte de fichier script que votre application WSGI utilise comme point d'entrée. C'est là que le code appartient. Si vous n'avez pas ce fichier, vous devrez chercher comment le faire avant de travailler avec le rechargement automatique. – AlbertoPL

+0

Merci, je vais essayer ça. – Eeyore

0

Vous remplacez la fonction de redémarrage dans le bloc de code suivant que vous trouverez sur la page:

Monitoring For Code Changes 

The use of signals to restart a daemon process could also be employed in a mechanism which automatically detects changes to any Python modules or dependent files. This could be achieved by creating a thread at startup which periodically looks to see if file timestamps have changed and trigger a restart if they have. 

Example code for such an automatic restart mechanism which is compatible with how mod_wsgi works is shown below. 

import os 
import sys 
import time 
import signal 
import threading 
import atexit 
import Queue 

_interval = 1.0 
_times = {} 
_files = [] 

_running = False 
_queue = Queue.Queue() 
_lock = threading.Lock() 

def _restart(path): 
    _queue.put(True) 
    prefix = 'monitor (pid=%d):' % os.getpid() 
    print >> sys.stderr, '%s Change detected to \'%s\'.' % (prefix, path) 
    print >> sys.stderr, '%s Triggering process restart.' % prefix 
    os.kill(os.getpid(), signal.SIGINT) 
+0

Je sais cela mais où dans le système de fichiers est ce code? Le nom du fichier, etc ... – Eeyore

5

Lire:

http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html

Il vous dit exactement où placer le fichier lors de l'utilisation Django. Vous avez juste besoin de faire le changement de code que tout le monde vous indique dans la section de documentation de rechargement de code source liée à Windows. A lire également:

http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html

ce qui explique les variations sur la première associée à Windows.

0

J'utilise ce code sur mon serveur

touch site.wsgi 

et ça marche. Après recharger la page dans le navigateur, j'obtiens la page avec les changements. Peut-être moche - mais simple et pas besoin de redémarrer apache.

+0

Cela ne fonctionne que pour le mode démon sur les systèmes UNIX, pas Windows. –

0

je teste cela avec Bitnami DjangoStackhttp://bitnami.org/stack/djangostack et Windows XP installé sur D: \ BitNami DjangoStack et C: \ Documents and Settings \ tsurahman \ projets BitNami DjangoStack \ myproject comme répertoire de projet (installation par défaut)

comme dans http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Restarting_Apache_Processes, j'ajoute

MaxRequestsPerChild 1 

dans le fichier D: \ BitNami DjangoStack \ apps \ django \ conf \ django.conf Voir les commentaires par Graham Dumpleton

alors je créé un fichier monitor.py dans mon répertoire de projet avec un contenu en en http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring_For_Code_Changes et remplacer la méthode de _restart avec http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Restarting_Windows_Apache, voici la partie du script

.... 

_running = False 
_queue = Queue.Queue() 
_lock = threading.Lock() 

def _restart(path): 
    _queue.put(True) 
    prefix = 'monitor (pid=%d):' % os.getpid() 
    print >> sys.stderr, '%s Change detected to \'%s\'.' % (prefix, path) 
    print >> sys.stderr, '%s Triggering Apache restart.' % prefix 
    import ctypes 
    ctypes.windll.libhttpd.ap_signal_parent(1) 

def _modified(path): 
    try: 

.... 

et dans le fichier D: \ BitNami Djangos tack \ apps \ django \ scripts \ django.wsgi,

.... 

import django.core.handlers.wsgi 

import monitor 
monitor.start(interval=1.0) 
monitor.track(os.path.join(os.path.dirname(__file__), 'site.cf')) 

application = django.core.handlers.wsgi.WSGIHandler() 

puis redémarrez le serveur Apache

+0

Vous ne devez pas utiliser à la fois MaxRequestPerChild défini sur 1 et le code de moniteur en même temps. Ce sont deux techniques différentes. Le premier redémarrera à chaque requête. Ce dernier ne redémarrera que lorsqu'un changement de code est effectué. Si vous définissez la directive, le code du moniteur devient inutile car il redémarre chaque requête de toute façon. –

Questions connexes