Mi solución:
- crear una plantilla de modo de mantenimiento y enlazar con él a través de una URLconf, por lo que cuando se visita/bajo mantenimiento/se muestra una página de mantenimiento.
- Luego, configure apache para probar la presencia de un archivo 'maintenance-mode-on', y si está presente haga un 302 redirigir a la url de la página de modo de mantenimiento.
- Configure apache para redirigir desde la URL del modo de mantenimiento a la página de inicio, si el archivo 'maintenance-mode-off' está presente.
- Secuencia de comandos de la tela para facilitar el cambio de archivos entre modo de mantenimiento y modo de mantenimiento apagado.
Aquí está la sección correspondiente del archivo de configuración de Apache:
RewriteEngine On
# If this file (toggle file) exists then put the site into maintenance mode
RewriteCond /path/to/toggle/file/maintenance-mode-on -f
RewriteCond %{REQUEST_URI} !^/static.*
RewriteCond %{REQUEST_URI} !^/admin.*
RewriteCond %{REQUEST_URI} !^/under-maintenance/
# redirect to the maintenance mode page
RewriteRule ^(.*) /under-maintenance/ [R,L]
#If not under maintenance mode, redirect away from the maintenance page
RewriteCond /path/to/toggle/file/maintenance-mode-off -f
RewriteCond %{REQUEST_URI} ^/under-maintenance/
RewriteRule ^(.*)/[R,L]
A continuación, las partes pertinentes de la escritura de la tela:
env.var_dir = '/path/to/toggle/file/'
def is_in_mm():
"Returns whether the site is in maintenance mode"
return files.exists(os.path.join(env.var_dir, 'maintenance-mode-on'))
@task
def mm_on():
"""Turns on maintenance mode"""
if not is_in_mm():
with cd(env.var_dir):
run('mv maintenance-mode-off maintenance-mode-on')
utils.fastprint('Turned on maintenance mode.')
else:
utils.error('The site is already in maintenance mode!')
@task
def mm_off():
"""Turns off maintenance mode"""
if is_in_mm():
with cd(env.var_dir):
run('mv maintenance-mode-on maintenance-mode-off')
utils.fastprint('Turned off maintenance mode.')
else:
utils.error('The site is not in maintenance mode!')
Esto funciona bien, a pesar de que no depende de la manipulación de Django solicitudes durante el modo de mantenimiento; Sería bueno solo servir un archivo estático.
esta [pregunta] (http://stackoverflow.com/questions/6237514/write-to-a-remote-file-with-fabric) puede estar relacionada. No sé mucho sobre tejidos, y no quiero sonar grosero, pero ¿no es bastante sencillo usar SSH y cambiar una línea de configuración? Es un método remoto –
Encontré que el enfoque de Garth Humphreys no era excelente debido al caché del navegador.Esto condujo a situaciones en las que: - páginas de modo no de mantenimiento se vieron durante el modo de mantenimiento - la página de modo de mantenimiento se ve cuando no está en modo de mantenimiento Pondré mi solución retocada en una respuesta separada. – seddonym