关于django:如何安全地更新实时网站

How to safely update a live website

我们有一个相当简单的基于Django的网站来进行CRUD操作。我一直在本地进行测试和开发,然后在测试完成后将版本和数据库架构更改签到实时服务器上。发布某些类型的更改时,我们最近遇到了一个问题。想象以下事件序列:

  • 用户打开一个Web表单
  • 网站已更新,需要此表单上的新字段
  • 用户提交他们一直在处理的表格
  • 服务器返回错误,因为它希望接收在步骤2中添加的新字段
  • 其他网站如何处理此类问题?我的想法:

    • 在进行更新时,使站点脱机。这并不能真正解决问题,因为用户可以在提交表单之前无限期地打开一个Web表单,但是经过一定时间后,任何人都不太可能提交该表单。
    • 以非常低的流量时间进行自动更新。同样,这并不能真正解决问题,但是我们的网站并不受欢迎,如果我们在3:00a进行更新,我会怀疑会有很多用户。这种技术的一个关注点是自动更新失败。
    • 对表单进行版本控制,以便服务器识别出正在提交的旧表单,并提供了更加用户友好的响应。是否有自动化工具可以帮助您解决此问题?

    有何想法?


    更改已发布的API(在这种情况下,即UI)总是很棘手的。如果可能,请保持向后兼容性。对于大多数表单,我认为功能在版本之间不会改变。您可以添加或删除一个或两个字段,但这将由后端上的表单验证来处理。从本质上讲,这就是您在第4步中描述的内容。运行时错误会不时发生-只要您的应用程序能够妥善处理它并通知用户问题,那么实际上就不会出现问题。


    如果这确实是一个大问题,则可以将代码版本作为每种形式的某种隐藏变量包括在内。如果提交的版本与应用程序的当前运行版本不匹配,则可以显示正确的错误,并让他们填写表单上可能存在的任何新字段。您甚至可以走得更远,仅显示表单已更改的消息。可能根据表单的定义创建某种哈希,并将其用作隐藏字段。如果哈希错误,则表明他们提交的表单不正确。


    做到这一点的"正确"方法是拥有定义良好的视图,以妥善处理整个故障类别。如果需要在模型中添加一个新字段(我想是这样),则该视图应使用ValidationError异常处理该异常,该异常会抛出友好的错误消息并将用户发送回表单( ,当重新加载时,应具有新字段可用)。无论将什么字段添加到模型,该异常都会引发干净错误并将用户送回原处。


    我使用了许多网站(已获准,主要是在我的工作地点内),这些网站宣布"我们将在本周末从周六下午6:00到周日上午6:00进行维护。请计划当时退出系统。"虽然它并不完美,但没有什么是完美的,这似乎是一种不错的方法。只需花大量的时间来推出新的东西,对其进行测试,然后在需要时回滚到旧的东西。如果您认为有必要,可以始终设置一个简单的页面,上面写着"对不起,我们现在不可用",并在停机期间将人们引导至该页面。通常,如果您不需要您最初说的所有时间而您又早早回来,那么没人会抱怨(也许想要借口避免工作的懒散者是例外,但是他们可能无论如何都没有工作)。


    我不知道如果不进行验证编码就无法实现更新的可能性。例如。"预期"提交时字段可能已更改,并且相应地设置了默认值/拒绝。

    如何在维护窗口临近时"缩减"提交内容,以最大程度地减少那些对浏览器保持打开状态的用户的影响?