【发布时间】:2022-01-16 06:10:11
【问题描述】:
我有一个 Django 应用程序,它公开以下视图:A,B,C...Z。此应用程序部署在 MACHINE-1 上。
有一个新的业务需求是在 MACHINE-2 上部署相同的 Django 应用程序,但使用这些视图的子集,比如说A,B, C。
我的简单解决方案是设置一个配置变量(RUN_ON_MACHINE_2=True 用于第二种情况,False 用于第一种情况)。总之,urls.py 文件如下所示(请注意,我在这里将视图与路径同化只是为了使其更短):
urlpatterns = [A, B, C, ... Z]
# If the env var is set to True then only load a subset of the views
if config.RUN_ON_MACHINE_2:
urlpatterns = [A, B, C]
测试工作正常,因为它们总是为A,B,C ... Z 执行,当然包括A, B, C。
但是,一些新的业务需求要求对视图 A 进行更改。我可以在视图 A 中实现更改,通过 config.RUN_ON_MACHINE_2 变量分支代码,但我得出的结论是创建一个新视图要干净得多,@ 987654330@,它只实现 MACHINE_2 所需的东西。 A_ForMachine2 必须与视图A 具有相同的接口,并且必须安装到相同的路径。所以新的urls.py 看起来像:
urlpatterns = [A, B, C, ... Z]
# If the env var is set to True then only load a subset of the views
if config.RUN_ON_MACHINE_2:
# A_ForMachine2 is mounted on the same path as A
urlpatterns = [A_ForMachine2, B, C]
现在我有 2 个视图安装到相同的路径,因此它们具有相同的 URL。
现在我的 api 测试只测试视图 A,因为默认情况下 config.RUN_ON_MACHINE_2 是 False。
我试图在我的测试用例中修补config.RUN_ON_MACHINE_2,但据我了解,当测试运行时,应用程序已经加载了所有网址A,B,..Z,因此它不会加载/装载[A_ForMachine2, B, C]。
让一个 Django 应用程序(在我的情况下是一个 DRF 应用程序)在启动时加载不同的 url(取决于某些环境变量)使其所有视图都易于测试的干净方法是什么?
干杯!
【问题讨论】:
-
您不能使用系统主机名来区分加载的视图吗?
-
这不是主机名。它是机器上设置的环境变量,实际上它有一个完全不同的名称。我试图简化整个故事。
标签: django django-rest-framework django-views python-unittest django-unittest