【问题标题】:Best approach to load specific urls (views) in Django project在 Django 项目中加载特定 url(视图)的最佳方法
【发布时间】: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


【解决方案1】:

ROOT_URLCONF 救援

这里是documentation

首先,永远不要将这种 if-else 架构用于不同的机器环境。

始终在 .env 文件中添加 SETTINGS 变量并创建不同的设置文件,例如 devqastageprodlocal。在您的情况下,为 Machine-1Machine-2 创建不同的设置文件。

然后在您的设置中,您根据不同环境所需的 url 更新 ROOT_URLCONF

您的主要urls.py 将转换为urls 文件夹,您可以在其中添加您的机器命名网址。然后在各自的设置中添加ROOT_URLCONF的路径。

您的urls 结构如下所示:

urls
├── __init__.py
├── common.py
├── local.py
└── production.py

您的不同设置文件将具有如下属性:

# settings/local.py
ROOT_URLCONF = 'urls.local'

还有这个

# settings/production.py
ROOT_URLCONF = 'urls.production'

主要变化将发生在urlspattern

# urls/local.py
from .common.py import urlpatterns as common_urlpatterns

urlpatterns = common_urlpatterns + [
    url(r'^A-view-path/', include(app_1.urls_for_A)),
]

您可以使两个视图的功能略有不同,但名称不同。但是将相同的 url 添加到具有一个视图的机器一和具有另一个视图的机器二。

这是一个类似的post。我从这里复制了一些关于文件夹结构的参考资料。我遇到了同样的问题,因为我只需要在测试和本地实例上而不是在 dev、qa 和 prod 实例上进行代码分析 url。那么这帮助很大。

如果您现在添加 if-else 架构,那么您将来会遇到可扩展性问题。如果你离开公司,其他新开发人员大部分时间都会摸不着头脑,因为没有人知道为什么会这样。

不要忘记添加 cmets,以便其他人知道您的确切意图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多