我目前正在使用MaintenanceModeMiddleware将我的网站置于维护模式,但它要求您在远程服务器上的settings.py文件中进行更改。我想使用fabric远程将网站置于维护模式。有没有办法实现这个目标?或者有更好的方法吗?感谢。
[UPDATE]
感谢大家的反馈,这就是我所做的,这对我来说很有用,http://garthhumphreys.com/2011/06/11/painless-django-maintenance-mode-with-fabric/ - 我确实喜欢取消注释行的想法,但如果我在生产中这样做的话,请设置我的设置一旦我推出了新版本,它就会被覆盖,所以最终将网站从服务器级别升级到维护模式而不是django级别工作得更好,对我来说真的更容易和灵活,至少对我来说:)< / p>
答案 0 :(得分:9)
Fabric有一些命令可以帮助您在fabric.contrib.files
中对给定文件中的行进行注释或取消注释。请参阅此处的文档:http://docs.fabfile.org/en/1.0.1/api/contrib/files.html
我个人更喜欢在前端代理而不是Django中间件中处理这个问题。我会看一下这个问题Show a custom 503 page if upstream is down,它将Nginx配置为在上游关闭时使用自定义页面。
答案 1 :(得分:4)
我的解决方案:
以下是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]
然后是结构脚本的相关部分:
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在维护模式下处理请求;只提供一个静态文件会很好。
答案 2 :(得分:2)
有fork of django-maintenancemode允许通过在数据库中设置值来打开/关闭维护模式。这样,您可以创建一个简单的管理命令来切换维护模式并通过结构调用它。我认为它比使用mod_rewrite更灵活。