您的位置:首页 >聚焦 >

环球观天下!Django框架

2022-06-27 05:45:03    来源:程序员客栈

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

关键词: 应用程序 面向对象的 可以使用

相关阅读