python业务逻辑应放在Django的确切位置


26

我刚刚开始学习Django / Python / Web开发。这个问题已经困扰我一段时间了。

我正在Django中创建带有多个模板的应用程序。我有一个views.py,它基本上只是呈现对相应模板的响应,并且我有一个我在其中构造数据库的model.py。在我的一个模板中,我需要上传一个图像(我能做到),并且我需要运行一个基于上传图像特性的逻辑(尚未完成)。这种逻辑涉及许多繁重的计算。执行计算后,逻辑应将一些已处理的信息(坐标)返回到模板。

我已经能够在一个独立的python桌面应用程序中成功地完成所有这些操作,一个又一个地调用python文件。但是,由于我现在想使它成为Web应用程序,所以我开始使用Django框架。

我已经做了很多搜索,但仍然无法弄清楚应将包含所有逻辑的Python文件放在哪里。我是否应该有另一个基于类的文件(logic.py),并从中调用它view.py?我在Google上搜索后发现,许多开发人员将其业务逻辑放在Django的models.py中。但是,我认为从直觉上来说是不正确的,因为模型应该专门与后端进行通信。任何帮助将不胜感激。



找到一篇文章,广泛讨论了该主题(考虑到金字塔,而不是django)。有一些senseable thaughts:nando.oui.c​​om.br/2014/04/01/...
kratenko

Answers:


16

我已经做了很多搜索,但仍然无法弄清楚应将包含所有逻辑的Python文件放在哪里。

有多种选择,具体取决于您的要求:

  1. 将逻辑添加到例如Image模型中。如果您需要在数据库中存储每个图像的元数据,并且每个模型实例(每个图像)都由其自身处理,则这是一个有用的选项。

  2. 将逻辑添加为普通的Python Image类,例如,在名为的文件中image.py。除了viewsmodels模块中的逻辑外,Django中没有其他限制。如果图像逻辑是Django应用程序(例如,图像处理应用程序)的核心组件,则这是一个不错的选择。

  3. 创建一个单独的提供逻辑的Python项目,然后从您的视图中调用它。确保将此项目安装在Django应用的Python环境中。如果您的Django应用的目的是上传和查看图像,或显示图像处理结果以直接响应用户的请求,但其他项目也可以使用该选项,则此选项有效。

  4. 创建一个单独的应用程序以异步处理请求,并与Django应用程序分开运行。如果您需要将图像处理与应用程序的请求周期分开,处理大量图像,或者每次计算需要太多时间才能在请求周期内解决问题(例如,最多500ms至1s),则此选项很有用。

我认为从直觉上来说这是不正确的,因为模型应该专门与后端通信。

Django中没有任何东西需要模型与后端(或数据库)进行通信。我认为您正在混用Django通常认为的模型(即数据库中一个或几个表的抽象)的语义,而不是将术语模型作为设计构造(例如,在域驱动设计中)。


谢谢!这真的很有见地,我觉得3号选项对我来说应该足够了。:)
adrita 2014年

可以将答案定为否定,但请添加评论,以便我改善它
miraculixx 2014年

5

丹尼尔·格林菲尔德(Daniel Greenfeld)是《 Django的两个瓢虫》的合著者,建议业务逻辑应该在模型中“在可能的情况下,或者在必要时以表格的形式出现。”至于巴特的可能重复的话,django可能与MVC类似,但它是并非MVC,如django官方文档常见问题 @adrita中的解释,我认为您可能需要查看官方文档以帮助您更好地理解模型,视图和模板的概念。


感谢您的建议。一定会通过文档:)
adrita 2014年

很高兴您已解决问题,@ miraculixx给出了明确的解释。如果您在fb上,请加入Django Python框架组。
diek

2

在官方的Django文档https://docs.djangoproject.com/en/1.11/中,它说:

Django具有“视图”的概念,用于封装负责处理用户请求和返回响应的逻辑。通过以下链接找到所有您需要了解的视图:

Django建议将逻辑包含在视图中。


3
这不一定与业务逻辑相同。
FirstLastname '17

1
我不同意Django文档的解释。在Django文档的其他地方(例如,针对Model.clean()),更明确地暗示(如果我们仅是模型,模板和视图的真实Django项目)-业务逻辑(或至少是验证)属于模型层。请注意,我没有在表格中包含这种简化形式,这也是可以接受的。
Kye R
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.