8

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

[更新]

最后感谢大家的反馈,这就是我所做的,它对我很有用,http ://garthhumphreys.com/2011/06/11/painless-django-maintenance-mode-with-fabric/ - 我喜欢取消注释行的想法,但是如果我要在生产服务器上执行此操作,那么一旦我将新版本推出,它将被覆盖,因此最终将站点从服务器级别而不是 django 级别置于维护模式工作得更好,并且真正更容易和灵活,至少对我来说:)

4

3 回答 3

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 配置为在上游关闭时使用自定义页面。

于 2011-06-10T19:13:19.170 回答
4

我的解决方案:

  1. 创建一个维护模式模板并通过 urlconf 链接到它,因此在访问 /under-maintenance/ 时会显示一个维护页面。
  2. 然后,配置 apache 以测试是否存在“maintenance-mode-on”文件,如果存在,则执行 302 重定向到维护模式页面的 url。
  3. 如果存在“maintenance-mode-off”文件,则将apache 配置为维护模式 URL 重定向到主页。
  4. 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 处理请求;最好只提供一个静态文件。

于 2013-05-24T11:03:31.497 回答
2

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

于 2011-09-06T04:16:57.997 回答