Apache Django Mod_Wsgi - 自动重新加载

时间:2009-07-07 17:41:19

标签: django apache mod-wsgi

我正在尝试自动重新加载我的django应用程序,该应用程序在我的本地Windows机器上使用apache + mod_wsgi。

我想知道在哪里添加以下文章中引用的代码:

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)

6 个答案:

答案 0 :(得分:5)

读:

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

它告诉您使用Django时确切放置文件的位置。您只需要在与Windows相关的源代码重新加载文档部分中进行每个人都指出的代码更改。另请阅读:

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

解释了第一个与Windows相关的变体。

答案 1 :(得分:1)

您可以替换同一篇文章中上面代码块中提到的重启功能。

答案 2 :(得分: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)

答案 3 :(得分:0)

我在我的服务器上使用此代码

touch site.wsgi

它有效。在浏览器中重新加载页面后,我得到了更改页面。 可能是丑陋的 - 但很简单,没有必要重启apache。

答案 4 :(得分:0)

我在 D:\ BitNami DjangoStack C上安装 Bitnami DjangoStack http://bitnami.org/stack/djangostack Windows XP 进行测试:\ Documents and Settings \ tsurahman \ BitNami DjangoStack projects \ myproject 作为项目目录(默认安装)

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Restarting_Apache_Processes一样,我添加了

MaxRequestsPerChild 1
>

在文件 D:\ BitNami DjangoStack \ apps \ django \ conf \ django.conf 请参阅Graham 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 DjangoStack \ 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()

然后重启Apache服务器

答案 5 :(得分:0)

在您的虚拟主机配置文件中添加以下内容:

WSGIScriptReloading On

然后重新加载Apache

systemctl reload apache2

享受!

参考enter image description here