【问题标题】:How to structure Python code to support multiple releases of MY project (i.e. not multiple versions of Python)如何构建 Python 代码以支持 MY 项目的多个版本(即不是 Python 的多个版本)
【发布时间】:2013-07-27 13:24:45
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

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

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

    例子:

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

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

    不同的请求,例如

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

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

    【讨论】:

    • 如果我没看错的话,是网站的代码调用了他的python子进程。
    • 是的,但是在一个代码修订版中实现不同的“代码版本”只是肮脏的。一个可以在更高的层次上分离不同的代码版本,这是应该做的。 “我们希望同时支持多个版本的前端”——可以将此子流程代码视为前端的一部分。如果他们部署不同的前端版本,问题就解决了。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-22
        相关资源
        最近更新 更多