2009-07-07 5 views
4

Ich versuche, meine Django-App neu zu laden, die Apache + mod_wsgi auf meiner lokalen Windows-Maschine verwendet.Apache Django Mod_Wsgi - automatisches Nachladen

Ich mag würde wissen, wo ich diesen Code hinzufügen, die in dem folgenden Artikel verwiesen hat:

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) 

Antwort

1

Sie ersetzen die Restart-Funktion, die oben in dem Codeblock erwähnt wird in der gleiche Artikel.

+0

Wo ist der Code-Block? – Eeyore

+1

Sie sollten eine Art Skriptdatei haben, die Ihre WSGI-Anwendung als Einstiegspunkt verwendet. Das ist, wo der Code gehört. Wenn Sie diese Datei nicht haben, müssen Sie nachsehen, wie Sie vor dem automatischen Neuladen vorgehen. – AlbertoPL

+0

Danke, ich werde das versuchen. – Eeyore

0

ersetzen Sie die Restart-Funktion in dem folgenden Code-Block Sie auf der Seite zu finden:

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

Ich weiß das, aber wo im Dateisystem ist dieser Code? Der Name der Datei, etc ... – Eeyore

5

lesen:

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

Es sagt Ihnen genau, wo die Datei platzieren bei der Verwendung von Django. Sie müssen lediglich die Codeänderung vornehmen, auf die Sie alle im Abschnitt zum Nachladen von Quellcodes verweisen, der sich auf Windows bezieht. Lesen Sie auch:

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

, die die Variationen auf dem ersten im Zusammenhang mit Windows erläutert.

0

Ich benutze diesen Code auf meinem Server

touch site.wsgi 

und es funktioniert. Nach dem Laden der Seite im Browser bekomme ich eine Seite mit Änderungen. Vielleicht ist es hässlich - aber einfach und ohne Neustart Apache.

+0

Das funktioniert nur im Daemon-Modus auf UNIX-Systemen, nicht Windows. –

0

Ich teste diese mit Bitnami DjangoStackhttp://bitnami.org/stack/djangostack und Windows XP installiert D: \ BitNami DjangoStack und C: \ Dokumente und Einstellungen \ tsurahman \ BitNami DjangoStack projects \ myproject als Projektverzeichnis (Standard-Installation

)

wie in http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Restarting_Apache_Processes, fügte ich

MaxRequestsPerChild 1 

in Datei D: \ BitNami DjangoStack \ apps \ django \ conf \ django.conf siehe Kommentar von Graham Dumpleton

dann habe ich eine Datei monitor.py in meinem Projektverzeichnis mit Inhalt als in http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring_For_Code_Changes und die mit http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Restarting_Windows_Apache_restart Methode ersetzen, hier ist der Teil des Skripts

.... 

_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: 

.... 

und in der Datei 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() 

und starten Sie den Server Apache

+0

Sie sollten nicht MaxRequestPerChild auf 1 und den Überwachungscode gleichzeitig verwenden. Sie sind zwei verschiedene Techniken. Der erste wird bei jeder Anfrage neu gestartet. Letzteres wird nur neu gestartet, wenn eine Codeänderung vorgenommen wird. Wenn Sie die Anweisung festlegen, wird der Überwachungscode sinnlos, da er jede Anforderung trotzdem neu startet. –