Django:将业务逻辑与视图逻辑分离

Posted

技术标签:

【中文标题】Django:将业务逻辑与视图逻辑分离【英文标题】:Django: separating business logic from view logic 【发布时间】:2013-12-15 03:05:36 【问题描述】:

可能的参考:Separation of business logic and data access in django

在我的 Django 应用程序中,我试图找出在哪里包含我的业务逻辑。该逻辑不适合任何模型(假设它是一个没有任何模型的单页应用程序)所以我想添加一个包含逻辑的模块。例如,

项目/应用程序/my_logic.py

def calculate(number_one, number_two):
  return number_one + number_two

然后,我会使用类似的逻辑,

项目/app/views.py

def index(request):
  number = my_logic.calculate(1, 2) #can I do this?
  return HttpResponse("the number is: %s " % number)

问题:

    my_logic.py 的正确放置位置在哪里? 是传统的吗? 有什么更好的方法?

注意:这是您导入模块的方式(如果其他人试图弄清楚如何做)

project/app/your_module/your_module.py
project/app/your_module/__init__.py

来自views.py,

from app.your_module import your_module

【问题讨论】:

【参考方案1】:

取决于,但如果它是一个逻辑单元,那么一个单独的 python 模块将是一个好的开始,你当然会为它编写自己的单元测试(与 Django 与 TestClient 的内置集成测试相反)。

如果它需要在模型中工作,那么模型上的属性会更好。

【讨论】:

如果我想让它成为一个单独的python模块,我必须将my_module.py放在django项目目录中的哪个位置? 我只是把它作为应用程序中的一个新文件夹。所以 app/stats/logic.py。稍后您可以将其移动到它自己的 python 依赖项(不要忘记将 init.py 添加到文件夹中,这样它是可导入的)。 那么,在views.py,我应该做import stats,使用logic.calculate()这样的方法,对吧?如何从 django shell 导入 stats 包? Import stats 工作,但 stats.my_module.calculate() 引发 module object has no attribute "my_module" 错误。 from stats import my_module; my_module.calculate()

以上是关于Django:将业务逻辑与视图逻辑分离的主要内容,如果未能解决你的问题,请参考以下文章

Django:DRY 与逻辑分离有根本冲突吗?

WPF程序中用户界面和业务逻辑相分离有啥好处?

将 Eloquent 模型与业务逻辑分离

Django进阶篇

Django 简介

将存储与业务逻辑分离的技术(RDBMS 和 NoSQL)