0

我正在开发基于 Web 的系统的后端。我的代码将接收来自我们网站的呼叫并​​执行用户请求的操作。我们希望同时支持多个版本的前端。因此,例如,我可能会收到来自前端 V1 或 V2 的请求。我需要回应其中任何一个电话。

正如您所料,我的很多代码在不同版本中都是相同的。例如,我的函数 *get_list_access_params()* 可能会同时出现在 V1 和 V2 中(尽管其中的代码可能会有一些变化)。我的听众应该抓住请求,找出调用来自我们系统的哪个版本,然后调用正确版本的 *get_list_access_params()*。

我希望不必将函数复制和重命名为 v1_get... 和 v2_get...,而是将函数复制到两个代码文件中,一个 v1 文件和一个 v2 文件。

这一定是一个普遍的需求,但我不知道在哪里寻找答案。有没有人有一个快速的答案或者你能引导我到一个简单的地方找到它(我是 Python 新手,顺便说一句)?谢谢!

4

3 回答 3

0

您的子流程为网站提供 API。

诀窍是使子流程代码的 API v2 可以处理来自 v1 和 v2 网站的调用。这称为向后兼容性。

此外,如果 v1 网站对其接收的数据不太挑剔,并且可以处理来自子流程的 v2 答案,该答案比以前在 v1 中拥有的信息更多,那就太好了。这称为前向兼容性。Json 和 xml 是实现它的好方法,因为您可以随意添加属性和属性,而不会损害对旧属性的解析。

因此,我认为,解决方案不在于 python 技巧,而在于仔细设计子进程的 API,以便 API 不会随着子进程功能的增加而中断。

于 2013-07-27T13:36:37.880 回答
0

有几个技巧 - 他们基本上回复了开发团队部分的纪律:

  1. 发布一个 API 并坚持它所有同名的 V2 函数必须接受相同的参数并在调用时返回兼容的结果。
  2. 有一个通用接口说它fred只是包装你的 V1 函数
  3. 使用命名参数和默认参数而不是位置参数,那么如果您的版本 2 代码支持一些附加参数但默认值会导致版本 1 的行为,那么您将是黄金。
  4. 使用命名空间
  5. 如果您以fn(*arg, **agv)格式定义函数,则可以在通用接口中包含一个包装器,该包装器可以确定 V1 或 V2 函数是否用于给定调用。
  6. 您可以ifversion=1在所有可能不明确的函数中包含一个可选参数,并在您特别需要版本 2 的内容时使用它。

还有另一种非常简单的方法是让 V2 前端连接到不同的端口或在 html 请求中使用特定的标志。

于 2013-07-27T13:49:47.390 回答
0

首先,这是一个非常正常的问题,有一个直接的解决方案。该解决方案比在您的 Python 代码中的级别更高。您可能有某种暴露在互联网上的前端来接收和处理请求。其中一些请求被转发到基于 Python 的后端,其他请求被拒绝,其他请求则由前端直接回答。这样的前端通常还用于通过以某种“智能”方式将请求转发到多个后端服务器来执行负载平衡。这些天来,nginx经常用于此。如果你没有这样的前端,你应该部署一个。但是从“我的代码将收到来自我们网站的调用”,我猜你有一个实体在请求到达你的 Python 应用程序之前处理它们。

您的问题的解决方案是部署不同版本的基于 Python 的后端。只需为您的不同代码版本运行不同的“服务器”。然后,由前端决定将哪个请求转发到哪个后端,例如基于简单的 URL 解析。

例子:

http://application.com/submit_data?v=1

将由您的前端解析。它看到v=1并知道这个请求应该被传递给在 eg 处监听的后端服务器localhost:3000

不同的请求,例如

http://application.com/submit_data?v=2

配置为转发到例如localhost:3001,您的 Python 后端的一个完全独立的实例。

于 2013-07-27T13:38:12.933 回答