Python 是否有必要使用fabric将django站点置于维护模式?

Python 是否有必要使用fabric将django站点置于维护模式?,python,django,fabric,maintenance-mode,Python,Django,Fabric,Maintenance Mode,我目前正在使用MaintenanceModelMiddleware将我的站点置于维护模式,但它要求您在远程服务器上的settings.py文件中进行更改。我想使用fabric远程将站点置于维护模式。有没有办法做到这一点?还是有更好的方法?谢谢 [更新] 谢谢大家的反馈,最后这就是我所做的,对我来说非常好,-我很喜欢取消注释行的想法,但是如果我在生产服务器上这样做,一旦我推出新版本,它就会被覆盖,因此,最终从服务器级别而不是django级别将站点置于维护模式会更好,而且确实更容易和灵活,至少对我来

我目前正在使用MaintenanceModelMiddleware将我的站点置于维护模式,但它要求您在远程服务器上的settings.py文件中进行更改。我想使用fabric远程将站点置于维护模式。有没有办法做到这一点?还是有更好的方法?谢谢

[更新]


谢谢大家的反馈,最后这就是我所做的,对我来说非常好,-我很喜欢取消注释行的想法,但是如果我在生产服务器上这样做,一旦我推出新版本,它就会被覆盖,因此,最终从服务器级别而不是django级别将站点置于维护模式会更好,而且确实更容易和灵活,至少对我来说:)

Fabric确实有命令帮助您在
Fabric.contrib.files
中注释或取消注释给定文件中的行。请参见此处的文档:

就我个人而言,我更喜欢在前端代理而不是Django中间件中处理这个问题。我想看一看这个问题,它将Nginx配置为在上游关闭时使用自定义页面。

有一个问题允许通过在数据库中设置值来打开/关闭维护模式。例如,通过这种方式,您可以创建一个简单的管理命令来切换维护模式,并通过fabric调用它。我认为它比使用mod_rewrite更灵活。

我的解决方案:

  • 创建一个维护模式模板,并通过urlconf链接到该模板,以便在访问/维护下显示维护页面
  • 然后,配置apache以测试是否存在“maintenance mode on”(维护模式打开)文件,如果存在,则执行302重定向到维护模式页面的url
  • 如果存在“维护模式关闭”文件,则将apache配置为从维护模式URL重定向到主页
  • 结构脚本,以便于在打开和关闭维护模式之间切换文件
  • 以下是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处理请求,但它工作得很好;只要提供一个静态文件就好了。

    这可能与此相关。我对fabric了解不多,我也不想听起来很粗鲁,但是,使用SSH和更改一行设置不是很容易吗?这是一种远程方法我发现Garth Humphreys的方法不太好,因为浏览器缓存。这导致以下情况之一:-在维护模式期间看到非维护模式页面-在不处于维护模式时看到维护模式页面我将在单独的答案中列出我的调整解决方案。但是管理员/员工用户在没有503的情况下还能进入吗?中间件看起来很酷,特别是对于我们这些倾向于在生产服务器上开发的人来说。当Django项目实际停止时,Nginx 503会很好。@j_syk没有理由不能同时使用这两个工具。如果Django服务器宕机,那么中间件将无法工作,Nginx将启动。感谢所有人的反馈,最后这就是我所做的,对我来说非常有用,-我确实喜欢取消注释行的想法,但我的设置如果我在生产服务器上这样做,一旦推出新版本,它将被覆盖,因此,最终将站点从服务器级别而不是django级别设置为维护模式效果更好,而且确实更简单、更灵活,至少对我来说:)抱歉@MarkLavin我没有说谢谢你在fabric中指出了comments命令,谢谢!这一定意味着通过django提供的每个页面都需要对数据库进行额外的访问?如果由于数据库工作而导致网站处于维护模式,该怎么办?