关于Django Web应用架构设计开发的几个问题

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。

时间: 2024-12-06 04:39:02

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

Web网站架构设计考虑的因素

转自http://blog.csdn.net/moshengtan/article/details/8990052 1    Web负载均衡 1.1 - 使用商业硬件实现 最常用的F5 与citrix netscaler.比如12306前端的web好像用的就是F5 的BIGIP.如果公司资金足够的话,相对使用开源软件来说理方便. 优点:维护方便,性能稳定 缺点:费用太高 1.2 - 使用开源软件 可选择使用lvs或者nginx做web应用的负载均衡. Lvs工作在tcp 协议4层下,而nginx

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

框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性高.有利软件工程化管理等优点 3.采用WebAPI,客户端完全摆脱了代理和管道来直接进行交互 4.采用EasyUI前台UI界面插件,可轻松的打造出功能丰富并且美观的UI界面 5.采用Knockout,,提供了一个数据模型与用户UI界面进行关联的高层次方式(采用行为驱动开发) 6.数据访问层采用强大的

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

在前面的文章里我谈到了前后端分离的一些看法,这个看法是从宏观的角度来思考的,没有具体的落地实现,今天我将延续上篇文章的主题,从纯前端的架构设计角度谈谈前后端分离的一种具体实现方案,该方案和我原来设想有了很大的变化,但是核心思想没变,就是控制层是属于Web前端的. 在以前文章里我说道前后端分离的核心在于把mvc的控制层归为前端的一部分,原方案的构想在实际的生产开发里很难做到,我觉得核心还是控制层和视图层的技术异构性,这样后果使得系统改造牵涉面太大,导致在项目团队里,沟通.协调以及管理成本相对较高,

Django——WEB三层架构与MVC

而我发此文的目的有二:一者,让初学者能够听到一家之言,是为解惑:二者,更希望抛砖引玉,得到专家的批判. 许多学生经常问我,MVC到底和WEB三层架构有啥关系? 开始时,我也只能给他们一些模糊的回答.时间长了,自己的良心开始受到谴责.对于一个程序员来说,这个问题显得挺学究.我在跟自己的许多程序员朋友以及同 行(Java讲师)都对MVC和WEB三层架构的关系做了探讨.现在可以说对WEB三层架构和MVC之间的关系理出了头绪.此可谓教学相长. 先说说Web三层架构这个古老话题.地球人都知道web三层架构

web系统架构设计中需要知道的点(前端篇)

上周没写东西,这周写点互联网系统开发中需要了解的技术点,每个点都可以发散出去,连接更多的知识点,打算做个逐步细化的记录. 一个应用的整个生命周期中(生,老,病,死)都需要有一个整体规划. 前期 评估需求,根据需求提炼出其中隐含的非功能性要求,做为容量评估的参考.一般就是大致估算一下,技术发展到现在,如果是聊天或游戏应用,随便一个服务器单机能能维持100W-160W左右的tcp长连接并进行通讯.所以普通的创业起步阶段的应用一般不必太担心设计问题,可以等业务量慢慢上来慢慢调整系统架构. 互联网上许多

Web站点架构设计考虑的因素

转自http://blog.csdn.net/moshengtan/article/details/8990052 1    Web负载均衡 1.1 - 使用商业硬件实现 最经常使用的F5 与citrix netscaler.比方12306前端的web好像用的就是F5 的BIGIP.假设公司资金足够的话,相对使用开源软件来说理方便. 长处:维护方便,性能稳定 缺点:费用太高 1.2 - 使用开源软件 可选择使用lvs或者nginx做web应用的负载均衡. Lvs工作在tcp 协议4层下,而ngi

千万PV级别WEB站点架构设计2

在上家公司工作时,设计的千万级PV架构,现在放出来,留做纪念: 至于架构的具体细节,我就不一一解说了,直接看图吧!

自动化运维Saltstack系列(五)之中型Web网站架构设计

架构图

整合微信小程序的Web API接口层的架构设计

在我前面有很多篇随笔介绍了Web API 接口层的架构设计,以及对微信公众号.企业号.小程序等模块的分类划分.例如在<C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系>介绍了相关模块的划分,在<基于微信小程序的系统开发准备工作>介绍了Web API的架构设计思路.本篇随笔对之前介绍的架构内容进行统一的调整更新,以便更加方便实际项目的应用开发,以期达到统一.重用.清晰的目的. 1.公众号.企业号.小程序模块的划分 我们知道,目前微信企业应用,分为公众号.企业号(企业