我的解决方案:
- 创建一个维护模式模板并通过 urlconf 链接到它,因此在访问 /under-maintenance/ 时会显示一个维护页面。
- 然后,配置 apache 以测试是否存在“maintenance-mode-on”文件,如果存在,则执行 302 重定向到维护模式页面的 url。
- 如果存在“maintenance-mode-off”文件,则将apache 配置为从维护模式 URL 重定向到主页。
- Fabric 脚本有助于在维护模式开启和维护模式关闭之间切换文件。
这是 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]
然后是fabric脚本的相关部分:
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!')
这很好用,尽管它确实依赖于维护模式期间的 Django 处理请求;最好只提供一个静态文件。