Django项目常见面试题

1.类视图

以函数的方式定义的视图称为函数视图,函数视图便于理解。但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时,便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。就比如说项目里面的注册时,需要先判断用户是get请求还是post请求,然后再根据这些请求来进行处理。其他模块如果也要判断是get还是post请求的话,也要在啪啦啪啦写一遍。

如果用了类视图就不一样了,我们可以定义一个类。类里面封装get方法和post方法,如果其他模块想要使用直接调用继承这个类视图就可以啦。就是说项目里面用的drf,他就是有很多类视图,就比如说APIView (以常规的方法实现get post put delet 等),我们可以直接继承,如果部分过程有改变,就可以继承之后再重写。代码的可读性就会比较好,就很方便。

2.django中间件

Django 在中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预。

1.初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件。 1.def init(): 2. pass
2.处理请求前:在每个请求上调用,返回 None 或 HttpResponse 对象。 1.def process_request(request): 2. pass
3.处理视图前:在每个请求上调用,返回 None 或 HttpResponse 对象。
''1.def process_view(request, view_func, view_args, view_kwargs): 2. pass"
4.处理模板响应前:在每个请求上调用,返回实现了 render 方法的响应对象。
"1.def process_template_response(request, " response):2. pass
5.处理响应后:所有响应返回浏览器之前被调用,在每个请求上调用,返回 HttpResponse 对象。
"1.def process_response(request, " response): 2. pass
6.异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个 HttpResponse 对象。
“1.def process_exception(request,exception): 2. pass”

中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
还可以自定义些中间件
常用5个

3.Django中间件与装饰器的区别

Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。

我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。

作用:在视图函数执行之前先去进行处理,在视图函数执行之后再去进行收尾工作。
在Django创建的时候,Django默认会给我们加6个中间件。
“比如session和csrf,在视图函数执行前,我们就需要对它进行处理,可以使用装饰器来做,也可以使用中间件来处理。”
区别:

装饰器:主要是作用域问题。如果给视图函数上面添加装饰器,它能够保证这个视图的方法在执行之前或执行之后被执行。但是它仅仅适用于哪些视图添加装饰器,那些视图会有这些作用。
中间件:不会区分是哪个视图,所有的视图统统一视同仁,都会执行之前进行处理或请求之后进行处理。

如果是做一个普遍的处理,不去区分视图的话,就用middleware避免编写重复功能的代码

本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
可以用于登录时的黑名单验证

可以自定义一个模块文件做登录校验的中间件,然后 在settings.py里的下面列表中添加自定义的中间件来激活该中间件

详见:
Django学习(三):中间件:https://blog.csdn.net/hua1011161696/article/details/80820228

说一下中间件
“middleware是用于处理的,就比如说request对象进来,首先它会经过request的middleware进行处理,它会返回两个结果,如果它是返回None,它就会继续下去,如果它返回一个response,它就会进入response的middleware,就直接返回到前端了。如果是返回None就会进入到下面一步,就是那个url的config,对他的路由进行处理。然后后面的话就是进入view的middleware.就是说的话,他的middleware就像跟一个钩子一样,它就对整个流程里的某一步的部分处理和调整,获得的一些结果。就大概是这个情况。”

4. django处理http过程

一个 HTTP 请求,首先被转成一个 HttpRequest对象,然后该对象被传递给Request中间件处理,如果该中间件返回了Response,则直接传递给 Response 中间件做收尾处理。
否则的话 Request 中间件将访问 URL 配置,确定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时候,系统会把 request 传递给view中间件处理器进行处理,如果该中间件返回了Response,那么该 Response 直接被传递给Response中间件进行后续处理,
否则将执行确定的view函数处理并返回Response,
在这个过程中如果引发了异常并抛出,会被 Exception 中间件处理器进行处理。

>一个http请求,								
初始化转为HttpRequest对象====》到request中间件处理===》返回response===》response中间件处理								
							|
							|
							访问url配置,确定view来处理request
							|
							|
							view的中间件进行处理===》返回response===》response中间件处理
							|
							|出现异常===》exception中间件进行处理
							|
							view函数处理并返回response			

5.drf序列化器与反序列化器

序列化:

将对象的状态信息转换为可以存储或传输的形式的过程。(百度定义)
对应到drf中,序列化即把模型对象转

你可能感兴趣的:(python基础)