无论如何使用面料将django网站置于维护模式?

时间:2011-06-10 16:34:01

标签: python django fabric maintenance-mode

我目前正在使用MaintenanceModeMiddleware将我的网站置于维护模式,但它要求您在远程服务器上的settings.py文件中进行更改。我想使用fabric远程将网站置于维护模式。有没有办法实现这个目标?或者有更好的方法吗?感谢。

[UPDATE]

感谢大家的反馈,这就是我所做的,这对我来说很有用,http://garthhumphreys.com/2011/06/11/painless-django-maintenance-mode-with-fabric/ - 我确实喜欢取消注释行的想法,但如果我在生产中这样做的话,请设置我的设置一旦我推出了新版本,它就会被覆盖,所以最终将网站从服务器级别升级到维护模式而不是django级别工作得更好,对我来说真的更容易和灵活,至少对我来说:)< / p>

3 个答案:

答案 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)

我的解决方案:

  1. 创建维护模式模板并通过urlconf链接到该模板,因此在访问/维护不足时/会显示维护页面。
  2. 然后,配置apache以测试是否存在'maintenance-mode-on'文件,如果存在则执行302重定向到维护模式页面的URL。
  3. 如果存在“maintenance-mode-off”文件,请将apache配置为将维护模式URL重定向到主页。
  4. Fabric脚本,便于在维护模式开启和维护模式关闭之间切换文件。
  5. 以下是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更灵活。