让我们一起聊聊 Django 框架

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

​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。​

责任编辑:武晓燕 来源: 左耳君
相关推荐

2021-08-27 07:06:10

IOJava抽象

2022-02-14 07:03:31

网站安全MFA

2023-08-02 08:35:54

文件操作数据源

2022-08-01 07:57:03

数组操作内存

2021-07-31 11:40:55

Openresty开源

2022-12-05 09:10:21

2021-11-09 23:54:19

开发SMI Linkerd

2022-08-30 13:48:16

LinuxMySQL内存

2021-11-04 06:58:31

CSS性能设备

2022-03-15 20:18:35

单元测试工具

2021-10-26 09:55:52

CAP理论分布式

2022-03-31 18:59:43

数据库InnoDBMySQL

2021-12-29 08:27:05

ByteBuffer磁盘服务器

2022-03-08 17:52:58

TCP格式IP

2021-07-15 07:23:28

Singlefligh设计

2021-11-26 07:00:05

反转整数数字

2023-04-26 00:19:18

AICSI-RSChatGPT

2022-02-14 10:16:22

Axios接口HTTP

2016-09-06 10:39:30

Dell Techno

2023-08-14 08:38:26

反射reflect结构体
点赞
收藏

51CTO技术栈公众号