1、关于分层,做过传统JEE应用的同学肯定知道JEE应用会分很多个设计层。根据传统Web应用架构设计一般从上到下分这么几个层(太懒了,不画图了):Web前端层、Web后端交互层、业务层、基础数据设施层,Web前端层在浏览器里面由JavaScript来做,暂时不表,数据设施层,Django的数据操作接近Active Record模式,相当完善,基本不用再做封装加工,重点谈谈交互层和业务层,交互层主要接受请求数据,调用业务逻辑完成用户交互.

2、关于业务层的独立存在问题,Django中业务层独立有没有必要,说实话,我刚开始用它做互联网应用的时候,一是互联网场景都是弱业务弱事务环境:业务逻辑比较简单,二是Django的的数据设施层非常完善,用来直接做交互层,代码量也很小,但是在产品系统不断发胀的过程中,系统的规模和结构不断复杂化的过程中,对系统结构管理的要求就会逐渐浮现出来,这个时候对业务层独立实现的设计要求就会逐渐明显。产品是变化的,系统是变化的,业务层独立化重构的要求是在变化的场景下逐渐出现的,当然有的系统一步到位的要求比较高,也许从刚开始就得做独立的业务层。

3、业务层的设计实现问题,Django中的业务层以什么样的方式存在,首先企业应用架构模式中说Active Record模式下的业务层应该和Models放在一起.其次Django其实提供了一种标准的业务层实现方式,就是对models.Manager做扩展,然后把其实例传给Model类的objects对象.这种方式的好处是,直接从Model类的引用可以调用到业务逻辑方法,缺点是,它和具体Model类的连接有点过于紧密,对于涉及多Model类的业务逻辑,其实也可以在Models模块中直接以函数的方式来定义.

4、交互层做了什么,首先Django中的输入验证是在表单类定义代码中完成,简单的CreateUpdate操作也可以用表单的save直接完成,那么之前讲到交互层要调用业务层的问题,其实都是业务逻辑相对复杂情况下的行为,关于调用,方法调用自然要传参,在交互层实现Form表单对象的初始化和输入验证通过后,把表单对象传给业务层是比较适合的,1是表单的数据是经过清洗过滤处理的,2是传递一个表单对象,这样的效果类似的JEE中的DTO,传参处理比较干净。

5、事务层放在哪儿,在业务逻辑涉及到多次数据读写的时候,事务特性还是很重要的,首先Django提供的事务特性使用方式比较多样化,首先用事务装饰view函数是一个一劳永逸比较懒的做法,其次事务的本质其实是和业务有关系的,在业务层方法上添加事务装饰,是一种更严格的设计实现。这种嵌套的多级事务在Django事务特性中完美支持。

6、关于异常处理,首先Django本身提供500错误页面机制,也就是说异常出错以后的转向页面显示我们不用管,我们需要管的异常处理是什么?就是这些异常和正常的业务逻辑相关的那些异常:它们发生的时候,业务逻辑转向了另外的一个正常处理分支.

7、Django Signals的一个应用场景,Django的Signals机制并不是异步消息机制,他基本接近装饰器,是一种同步挂钩模式,同步就限制了它的业务设计场景,但是在实现设计角度还是有用的:Python的import会有死锁循环问题,Linux的执行环境比较严格,像字符串编码和import循环的问题会比windows更容易发生,import循环这个问题,从设计的角度讲就需要严格的架构分层设计,同层之间调用要尽量限制,跨层反向要绝对禁止,但是任何模块调用是复杂的,不可能绝对满足约束,singals的挂钩机制,隔离le 调用方,应该可以解决跨层反向调用的Import问题.(此方案未经实际应用测试)

8、再谈循环Import的架构层解决,在Django中跨App的Model依赖有可能比较平常,这种同层依赖甚至逆架构层方向的反向依赖都有可能导致import循环,对于逆架构层反向依赖这种现象应该是尽量避免,对于同层之间的数据依赖,应该尽量坚持view和所有的model属于同一个app之内,那么跨App依赖怎么解决?1、前端异步依赖,可以在前端再加载依赖的数据,异步数据提供接口当然放在Model所在App内,2、模板标签,正常的标签肯定不会在其它py文件里面被依赖,它正常情况下只被最顶端的模板代码所依赖,这种情况下肯定不可能循环。3、model类之间的外键依赖循环,这个比较致命,不过解决办法也很简单,用字符串形式引用model会直接避免import,就没有执行依赖了,不过这种方式要求必须把引用model所在的app加到settings的INSTALLED_APPS设置里。

9、Django Session里面如果放置列表此类的引用数据,在修改操作时,应该是赋值取出来,修改操作完,再赋值放回去,原处操作可能无效。后台技术原因可能是因为Session串行化的原因

10、前端表单里面没有的model字段一定要在Form定义里面Exclude掉,只在Model里面定义blank和null只能做到验证规则的定义,不能防止恶意用户构造假表单填充这些model字段。后补:用fields meta信息定义要比exclude要好一点。

11、Django 代码封装的一个特殊优势:当封装代码片段的操作对象是一个Model实例对象时,这个时候应该考虑借鉴Active Record的封装设计,把这个代码封装成Model类的实例方法,这种封装方式比Manager方法封装要更Nice,应该说这是大多数业务逻辑可以优先考虑的封装方式,起码调用方式更Nice。

关于Django Web应用架构设计开发的几个问题的更多相关文章

  1. Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)

    Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔)  Louis Rosenfeld(路易斯·罗森菲尔德) ...

  2. 前后端分离之Web前端架构设计

    架构设计:前后端分离之Web前端架构设计 在前面的文章里我谈到了前后端分离的一些看法,这个看法是从宏观的角度来思考的,没有具体的落地实现,今天我将延续上篇文章的主题,从纯前端的架构设计角度谈谈前后端分 ...

  3. PHP-学习大规模高并发Web系统架构及开发推荐书籍

    以下书籍内容涵盖大型网站开发中几个关键点:高可用.高性能.分布式.易扩展.如果想对大规模高并发Web系统架构及开发有很系统的学习,可以阅读以下书籍,欢迎补充! 一.<Linux企业集群—用商用硬 ...

  4. 大型 web 前端架构设计-面向抽象编程入门

    https://mp.weixin.qq.com/s/GG6AtBz6KgNwplpaNXfggQ 大型 web 前端架构设计-面向抽象编程入门 曾探 腾讯技术工程 2021-01-04   依赖反转 ...

  5. 建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发

    框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性 ...

  6. Web信息架构:设计大型网站(第3版) [美]Peter Morville 中文PDF扫描版

    新版Web信息架构设计大型网站针对新技术做了全面更新——搭配新颖范例.全新场景及最佳实践信息——但是,其焦点依然放在基础原理上.其结构严谨,图文并貌,内容涵盖了信息架构基本原理和实践应用的方方面面. ...

  7. 架构设计:前后端分离之Web前端架构设计

    在前面的文章里我谈到了前后端分离的一些看法,这个看法是从宏观的角度来思考的,没有具体的落地实现,今天我将延续上篇文章的主题,从纯前端的架构设计角度谈谈前后端分离的一种具体实现方案,该方案和我原来设想有 ...

  8. Django——WEB三层架构与MVC

    而我发此文的目的有二:一者,让初学者能够听到一家之言,是为解惑:二者,更希望抛砖引玉,得到专家的批判. 许多学生经常问我,MVC到底和WEB三层架构有啥关系? 开始时,我也只能给他们一些模糊的回答.时 ...

  9. [转]轻量级 Java Web 框架架构设计

    工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...

随机推荐

  1. 盘点:2016中国百强地产CIO高峰论坛的8大看点

    2016年中国百强地产CIO高峰论坛将于2016年6月16日至18日在浙江湖州举行,届时百余位地产公司CIO将出席大会,共同探讨新形势下如何重塑IT价值,增强地产公司的市场竞争力和盈利能力. 此次大会 ...

  2. ROS_Kinetic_10 ROS程序基础Eclipse_C++(一)

    ROS_Kinetic_10 ROS程序基础Eclipse_C++(一) 编写简单的消息发布器和订阅器 (C++) http://wiki.ros.org/cn/ROS/Tutorials/Writi ...

  3. XML Publisher Report Issues, Recommendations and Errors

    In this Document   Purpose   Questions and Answers   References APPLIES TO: Oracle Process Manufactu ...

  4. 数据结构-自平衡二叉查找树(AVL)详解

    介绍: 在计算机科学中,AVL树是最先发明的自平衡二叉查找树. 在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树. 查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  5. 简单的C语言猜数字小游戏

    猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...

  6. Intellij Idea配置提高速度

    主要介绍一下Intellij Idea的关于速度和最大最大方法数目 提高速度 1.命令: 2.找到./Library/Preferences/IntelliJIdea2016.1/idea.vmopt ...

  7. XBMC源代码分析 3:核心部分(core)-综述

    前文分析了XBMC的整体结构以及皮肤部分: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) 本文以及以后的文章主要分析XBMC的VC工程中的源代码. ...

  8. 从驱动层分析android的Binder机制-android学习之旅(83)

    前言及知识准备 Binder驱动程序 Service组件的注册和启动 Clinet应用获取服务 本次主要介绍Android平台下Binder进程间机制.从机制的组成出发,将按照Binder驱动程序.B ...

  9. AngularJS进阶(二十七)实现二维码信息的集成思路

    AngularJS实现二维码信息的集成思路        赠人玫瑰,手留余香.若您感觉此篇博文对您有用,请花费2秒时间点个赞,您的鼓励是我不断前进的动力,与君共勉!      注:点击此处进行知识充电 ...

  10. ros_indigo使用keyboard键盘控制虚拟或实际机器人

    首先,上参考网址: http://wiki.ros.org/Robots/TIAGo http://wiki.ros.org/teleop_twist_keyboard 第一个,使用TIAGo的gaz ...