2009-07-07 4 views
4

Я пытаюсь автозагрузить мое приложение django, которое использует apache + mod_wsgi на моей локальной машине Windows.Apache Django Mod_Wsgi - auto reload

Я хотел бы знать, где добавить этот код, который ссылается в следующей статье:

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) 

ответ

1

Вы заменить функцию перезагрузки, описанное в блоке кода выше в той же статье.

+0

Где этот блок кода? – Eeyore

+1

У вас должен быть какой-то файл сценария, который использует приложение WSGI в качестве точки входа. Вот где код принадлежит. Если у вас нет этого файла, вам нужно будет найти, как это сделать, прежде чем работать с автоматической перезагрузкой. – AlbertoPL

+0

Спасибо, я попробую. – Eeyore

0

Вы заменяете функцию перезапуска в следующем блоке кода вы найдете на странице:

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

Я знаю это, но где в файловой системе этот код? Имя файла и т. Д. – Eeyore

5

Read:

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

Он говорит Вам точно, где поместить файл при использовании Джанго. Вам просто нужно внести изменения в код, которые все указывают вам в разделе документации по перезагрузке исходного кода, относящегося к Windows. Также читайте:

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

, который объясняет вариации на первый, связанные с Windows.

0

Я использую этот код на моем сервере

touch site.wsgi 

и работать. После перезагрузки страницы в браузере я получаю страницу с изменениями. Может быть, это уродливо - но просто и не нужно перезапускать apache.

+0

Это работает только в режиме демона в системах UNIX, а не в Windows. –

0

я проверить это с Bitnami DjangoStackhttp://bitnami.org/stack/djangostack и Windows XP установленной на D: \ BitNami DjangoStack и C: \ Documents и Settings \ tsurahman \ BitNami DjangoStack проекты \ MyProject в директории проекта (по умолчанию установки)

, как в http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Restarting_Apache_Processes, я добавил

MaxRequestsPerChild 1 

в файле D: \ BitNami DjangoStack \ приложения \ Джанго \ конф \ django.conf см комментарий Грэма Dumpleton

Затем я создал файл monitor.py в моем директории проекта с содержимым, в http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring_For_Code_Changes и заменить _restart метод с http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Restarting_Windows_Apache, здесь является частью сценария

.... 

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

.... 

и в файле D: \ BitNami DjangoS галс \ приложения \ Джанго \ Сценарии \ Джанго.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() 

, а затем перезапустить сервер Apache

+0

Вы не должны одновременно использовать как MaxRequestPerChild, так и код монитора. Это два разных метода. Первый будет перезагружаться по каждому запросу. Последний будет перезагружаться только при изменении кода. Если вы установите директиву, код монитора станет бессмысленным, так как он все равно перезапустит каждый запрос. –

Смежные вопросы