Django框架

大鱼仙人

共 4062字,需浏览 9分钟

 ·

2022-06-27 01:23

Django是一个python开发者都比较熟悉的一个框架,这个属于web方向的开发框架,而且Django是属于大而全的,最出名的应该属于其全自动化的管理后台了,我们只需要使用ORM,做一些简单的对象定义,就可以自动生成对应的数据库的表结构,以及全功能的管理后台


Django框架的特点


功能较为完善,有着较高的开发效率,但是呢,性能扩展比较有限,采用Django的项目,在流量达到一定的规模之后,需要对其进行重构,才能够满足性能的要求,比较适合中小型的网站


Django的设计哲学是彻底的将代码合样式进行分离,Django从根本上杜绝在模板中进行编码处理数据的可能性


Django先进的APP设计理念,APP是可以插拔的,是不可多得的思想,不需要了,可以直接删除,对系统整体影响不大


这一点作为一个常年的Java开发者来说必须说一句,这个设计我认为是和微服务思想中的Application是一个理念的,Java开发者最熟悉的莫过于spring全家桶,而spring全家桶大家也一定熟悉springboot,以及springcloud各种的服务治理


我们开发的后端服务,随着业务的发展变得越来越臃肿的时候,也就需要拆分成多个服务,而多个服务呢,做到了一个解耦合,互相调用,如果当我们需要下掉一个服务的时候,也会变得相对来说比较简单


Django框架也存在一定的缺点


Django包含了一些轻量级的不常用的功能模块,这一点不如flask框架方便


性能相对来说比较低,当然这也不完全是框架的郭,也有一部分是python的问题,python本身就是属于解释性语言,其它的python框架也有同样的问题


WSGI协议 & uwsgi & wsgiref & Gunicorn


python web程序一般来说分为两部分,服务器程序和应用程序,服务器程序负责对socket服务器进行封装,并在客户端请求服务端时将客户端请求的各种数据和信息进行整理。


应用程序则负责具体的逻辑处理,为了方便应用程序的开发就出现了很多的web框架,Django便是其中之一,服务器程序需要为不同的web框架提供不同的支持


因此就需要一个标准,只要服务器程序和应用程序也就是web框架都支持这个标准,服务器程序就可以web框架之间配合使用


WSGI就是一种规范,它规定了使用python编写的web应用程序与web服务器程序之间的接口格式。


常见的符合WSGI协议的服务器程序有uwsgi,Gunicorn,而django框架自带的服务器程序是wsgiref,当django项目上线时可以更换成uwsgi或者Gunicorn


Django的请求生命周期


                                        图片来源于网站,侵删


1、浏览器发起请求


2、WSGI创建socket服务器,接收请求HttpRequest,并将请求进行初次封装,然后将请求交给对应的web框架Flask、Django


3、中间件处理请求,帮助我们对请求进行校验或者在请求对象中添加相关的数据


4、URL路由,根据当前请求的URL找到对应的视图函数,映射


5、view视图,进行业务处理,ORM处理数据,从数据库取出数据返回给view视图,view视图将数据渲染到对应的template模板,并将数据返回


6、中间件处理响应


7、WSGI返回相应HttpResponse


8、浏览器渲染


列举django中间件的5个方法?以及django中间件的应用场景?


1.process_request:接收到客户端信息后立即执行,视图函数之前


2.process_response:返回到客户端信息前最后执行,视图函数之后


3.process_view:拿到视图函数的名称,参数,执行process_view()方法


4.process_exception:视图函数出错时执行


5.process_template_response:在视图函数执行完后立即执行,前提是视图返回的对象中有一个render()方法



Django中的ORM中常用的获取数据查询集合的方法


常用方法包括filter和exclude方法。字符串模糊匹配可以使用icontains, in等多种方法。


qs1 = Article.objects.filter(title__icontains='django')qs2 = Article.objects.filter(id__range=[1,9])qs3 = Article.objects.filter(id__in=[1, 3, 6, 7, 9])qs4 = Article.objects.filter(author=request.user).exclude(id=1)


Django中的QuerySet有哪些特性


Django的QuerySet主要有两个特性:一是惰性的(lazy),二是自带缓存。


article_list = Article.objects.filter(title__contains="django")


当我们定义article_list的时候,Django的数据接口QuerySet并没有对数据库进行任何查询。无论你加多少过滤条件,Django都不会对数据库进行查询。


只有当你需要对article_list做进一步运算时(比如打印出查询结果,判断是否存在,统计查询结果长度),Django才会真正执行对数据库的查询(见下例1)。


这个过程被称为queryset的执行(evaluation)。


Django这样设计的本意是尽量减少对数据库的无效操作,比如查询了结果而不用是计算资源的很大浪费。


什么是基于函数的视图(FBV)和基于类的视图(CBV)以及各自的优点


FBV(function base views) 就是在视图里使用函数处理请求。CBV(class base views) 就是在视图里使用类处理请求。


Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。


所以Django在后来加入了Class-Based-View,可以让我们用类写View,这样做的优点主要下面两种:


1、提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)


2、可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性


你能列举几个减少数据库查询次数的方法吗?


利用Django queryset的惰性和自带缓存的特性


使用select_related和prefetch_related方法在数据库层面进行Join操作


使用缓存


Django的模型继承有哪几种方式? 它们有什么区别以及何时使用它们?


Django的模型继承有如下3种方式:


1. 抽象模型继承(abstract model)


2. 多表模型继承(multi-table inheritance)


3. 代理模型(proxy model)


它们的区别如下:


Django不会为抽象模型在数据库中生成自己的数据表。父类Meta中的abstract=True也不会传递给子类。


如果你发现多模型有很多共同字段时,需使用抽象模型继承。


多表模型继承与抽象模型继承最大的区别在于Django也会为父类模型建立自己的数据表,同时隐式地在父类和子类之间建立一个一对一关系。


如果我们只想改变某个模型的行为方法,而不是添加额外的字段或创建额外的数据表,我们就可以使用代理模型(proxy model)。设置一个代理模型,需要在子类模型Meta选项中设置proxy=True, Django不会为代理模型生成新的数据表。


django rest framework如何实现的用户访问频率控制?


from rest_framework.throttling import SimpleRateThrottle


这里使用的节流类是继承了SimplePateThrottle类,而这个类利用了django内置的缓存来存储访问记录。


通过全局节流设置,所有的视图类默认是使用UserThrottle类进行节流,如果不想使用默认的类就自定义给throttle_classes属性变量赋值,如:“throttle_classes = [VisitThrottle,]”。


Celery 分布式任务队列


情景:用户发起 request,并等待 response 返回。在本些 views 中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等。


使用 celery 后,情况就不一样了。解决:将耗时的程序放到 celery 中执行。


将多个耗时的任务添加到队列 queue 中,也就是用 redis 实现 broker 中间人,然后用多个 worker 去监听队列里的任务去执行。


任务 task:就是一个 Python 函数。


队列 queue:将需要执行的任务加入到队列中。


工人 worker:在一个新进程中,负责执行队列中的任务。


代理人 broker:负责调度,在布置环境中使用 redis。

工作寄语


作为技术人员,技术固然重要,但是要时刻明白一个道理,技术为业务而服务,技术和业务就是躯体和灵魂,没有业务的技术就是没有灵魂的躯体,没有技术的业务无法得到实践和实现


大家在日常学习技术的同时,不要忘了去思考业务的本质


哦对了,后续所有的文章都会更新到这里,点赞关注不迷路


https://github.com/DayuMM2021/Java




浏览 87
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报