让我们一起聊聊 Django 框架
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。
- 一文给你搞定Elasticsearch技术扫盲
- Go编程语言的真正优点是什么?
- 用Python爬了我的微信好友,他们是这样的...
- 字节面试也会问SPI机制?
- Volatile关键字能保证原子性么?
- 种草 Vue3 中几个好玩的插件和配置
- Vue 状态管理未来样子
- 一门语言的作用域和函数调用是如何实现的
- 关于多线程同步的一切:伪共享
- Swift 与 Go:苹果与谷歌的较量
- Android 自定义View - 柱状波形图 wave view
- Android技术分享|【Android踩坑】怀疑人生,主线程修改UI也会崩溃?
- 安卓TV插件化9.0内联崩溃原因及解决方案
- 测试员进阶技能:如何有效地利用单元测试报告?
- Tekton 实战完整示例
- 字节的前端监控 SDK 是怎样设计的
- 用Python绘制了若干张词云图,惊艳了所有人
- 马化腾:为什么你们不在乎QQ等级,不用QQ了吗?
- 几个友好Java代码习惯建议
- Python 实现单例模式的五种写法