Django 如何安全地更新实时网站

Django 如何安全地更新实时网站,django,deployment,schema,versioning,Django,Deployment,Schema,Versioning,我们有一个相当简单的Django网站,用于执行CRUD操作。我一直在本地进行测试和开发,然后在测试完成后将版本和数据库模式更改签出到live server上。我们最近在发布某些类型的更改时遇到了一个问题。想象一下以下事件的顺序: 用户打开一个web表单 网站已更新,需要在此表单上添加新字段 用户提交他们正在处理的表单 服务器返回错误,因为它希望接收在步骤2中添加的新字段 其他网站如何处理此类问题?我的想法是: 在进行更新时将网站脱机。这并不能真正解决问题,因为用户可以在提交web表单之前将其打

我们有一个相当简单的Django网站,用于执行CRUD操作。我一直在本地进行测试和开发,然后在测试完成后将版本和数据库模式更改签出到live server上。我们最近在发布某些类型的更改时遇到了一个问题。想象一下以下事件的顺序:

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

    • 在进行更新时将网站脱机。这并不能真正解决问题,因为用户可以在提交web表单之前将其打开无限长的时间,但在一定时间后,不太可能有人提交表单
    • 在流量非常低的时候进行自动更新。同样,这并不能真正解决问题,但我们的网站并没有那么受欢迎,如果我们在凌晨3点进行更新,我怀疑会有很多用户。这种技术的一个问题是自动更新失败
    • 对表单进行版本控制,以便服务器识别正在提交的旧表单,并提供更为用户友好的响应。是否有自动化工具可以帮助实现这一点

    想法?

    如果不在验证中编码更新的可能性,我看不出您如何实现这一点。例如,“预期”提交时字段可能已更改,并相应地设置默认值/拒绝


    随着维护窗口的临近,“缩小”提交内容的比例,将受影响的用户减少到浏览器未打开的用户,怎么样?

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

    对已发布的API(本例中为UI)进行更改总是很棘手的。如果可能,保留向后兼容性。对于大多数表单,我认为功能在版本之间不会改变。您可以添加或删除一两个字段,但这将由后端的表单验证来处理。这就是您在步骤4中描述的内容。我真的不认为这是一个很大的问题;运行时错误时有发生——只要你的应用程序处理得当并将问题告知用户,那么就没有问题了。

    我使用的很多网站(大多是我工作地点的内部网站)都会发布类似的消息“我们将在本周末从周六下午6:00到周日上午6:00进行维护。请计划在那个时候退出系统。”虽然它并不完美,但什么都不完美,这似乎是一个不错的方法。只需腾出足够的时间发布新的内容,测试它,并在需要时回滚到旧的。如果你觉得有必要,你可以随时设置一个简单的页面,上面写着“对不起,我们现在不可用”“并在休息时间指导人们去做。通常情况下,如果你不需要你最初陈述的所有时间,而且你很早就回来了,没有人会抱怨(也许那些想找个借口逃避工作的懒汉是个例外,但他们可能无论如何都不工作).

    正确的方法是使用定义良好的视图,优雅地处理这类故障。在向模型中添加一个必需的新字段的情况下(我假设这就是发生的情况),视图应该使用ValidationError异常来处理该问题,该异常会抛出一条友好的错误消息,并将用户发送回表单(在重新加载时,表单应该有可用的新字段)。无论向模型中添加了哪些字段,异常都会抛出一个干净的错误并将用户发回。

    问题——用户在升级过程中提交表单——是否足够常见,足以让您绞尽脑汁?或者这是一个假设的“有一天可能会发生”的问题?@S.Lott,如果我们不担心角落案例,我们就不会是好的程序员。我认为真正的问题是“什么是升级实时网站的好方法?”当然,如果用户提交的表单中添加了必填字段,你想让它给他们一个错误,并要求填写新字段?否则这显然不是必需的。丹尼尔是对的。您会得到一个表单验证错误,这是正常的,也是预期的行为。AFAICT所展示的用例不是问题。