django 面试题
1. 简述CBV和FBV ?
1. FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV
2. 在python中使用cbv的优点:
提高了代码的复用性,可以使用面向对象的技术
可以使用不同的请求方式来实现http的处理方法,从而不需要更多的if。。else。。 判断.
2. 请说出中间件的提供了哪几种方法?并简述哪个阶段执行?
# django提供了五个中间件的方法。
def process_request(self, request):
'''
处理请求前:在每个请求上,request对象产生之后,url匹配之前调用,返回None或HttpResponse
'''
pass
def process_view(self, request, view_func, *view_args, **view_kwargs):
'''
处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或HttpResponse对象。
'''
pass
def process_response(self, request, response):
'''
处理响应后:视图函数调用之后,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。
'''
return response
def process_exception(self, request,exception):
'''
异常处理:当视图抛出异常时调用,在每个请求上调用。
'''
pass
def process_template_response(self, request, response):
'''
函数是在视图函数执行完后立即执行的,返回一个HttpResponse对象。
'''
return response
3. Django中间件与装饰器的区别?
装饰器:主要是作用域问题。如果给视图函数上面添加装饰器,它能够保证这个视图的方法在执行之前或执行之后被执行。但是它仅仅适用于哪些视图添加装饰器,那些视图会有这些作用。
中间件:不会区分是哪个视图,所有的视图统统一视同仁,都会执行之前进行处理或请求之后进行处理。
4. Django处理http请求的生命周期?
1. wsgi,请求封装后交给web框架
2. 请求中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session -
3. 路由匹配,根据浏览器发送的不同url去匹配不同的视图函数
4. 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 -
5. 响应中间件,对响应的数据进行处理。
6. wsgi,将响应的内容发送给浏览器
5. drf中如何实现一个反序列化添加和编辑?
继承serialixer.Serializer类
添加的话需要重写 create(self,data) 方法
编辑的话需要重写 update(self,instance,data) 方法
views视图需要验证约束条件 is_valid()
如果约束返回为True,则调用save()
6. 什么是jwt,jwt的组成规范以及如何使用?
jwt: json web token 由 header(头部),payoad(载荷),signature(签名)三部分组成 头部包含 { "alg": "HS256", "typ": "JWT" } 载荷包含 { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } 签名包含 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), '密钥' )
7. 谈谈你对项目优化的理解?
提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能的优化一般包括 web 前端性能优化,应用服务器性能优化,存储服务器优化。
对前端的优化主要有:
1.减少 http 请求,减少数据库的访问量,比如使用雪碧图。
2.使用浏览器缓存,将一些常用的 css,js,logo 图标,这些静态资源缓存到本地浏览器,通过设置 http 头中的 cache-control 和 expires 的属性,可设定浏览器缓存,缓存时间可以自定义。
3 对 html,css,javascript 文件进行压缩,减少网络的通信量。
对后端的优化主要由:
1.代码优化
2.数据库优化,包括sql调优,数据库连接池,库表设计。
3.缓存 使用cdn或者本地缓存
4.异步处理 消息队列/线程池/订阅通知
5.存储数据 /nosql/时序数据/空间数据
6.分布式 集群/微服/动态扩容
7.选择合适的语言和框架。
8.限制大文件的下载和上传
9.添加防盗链
10.增加ip限流
11.增加硬件配置
8. 列举一下orm常用的方法(至少5个)
all() # 获取全部数据 first() # 查询第一条记录 filter() # 筛选过滤的条件的值 exclude() # 筛选不需要的数据 get() # 获取一条数据,如果没有则会报错 value() # 获取数据以tuple形式返回 value_list() # 获取数据以字典形式返回 update() # 更新数据 delete() # 删除数据 order_by() # 对数据进行排序 reverse() # 对查询结果反向排序 count() # 对查询结果的个数 last() # 查询结果的最后一个 exists() # 如果QuerySet包含数据,就返回True,否则返回False distinct() # 对查询数据进行去重处理
9. filter和 exclude 的区别?
filter 筛选需要的数据
exclude 筛选不需要的数据
10. value和value_list的区别?
value() 返回的数据类型为字典
value_list 返回的数据为元祖
11. 如何使用django orm 批量添加数据
bulk_create()
12. Django的Model中的ForeginKey字段中的on_delete参数的有什么作用?
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为 on_delete=models.CASCADE, # 删除关联数据,与之关联也删除 on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做 on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True) on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理) # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值') on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理) on_delete=models.SET, # 删除关联数据, a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
13. Django提供了runserver,但是部署的时候为什么不使用?
1.runserver方法是调试 Django 时经常用到的运行方式,它使用Django自带的.WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。
2.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。
uWSGI具有超快的性能、低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署 。
相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。
14. 简述MVC和MVT模式
M 全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
V 全拼为View,用于封装结果,生成页面展示的html内容。
C 全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
M 全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
V 全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
T 全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
15. http常见的状态码以及意义(至少6个)
100~199——信息性状态码
100 Continue 说明收到了请求的初始部分,请客户端继续。
101 Switching Protocols 说明服务器正在根据客户端的指定,将协议切换成Update首部所列的协议
200~299——成功状态码
200 OK 请求没问题。实体的主体部分 包含了请求的资源
201 Created 用于创建服务器对象的请求(比如,PUT)
202 Accepted 请求已被接受,但服务器还未对其执行任何动作。
203 Non-Authoritative Information 实体首部包含信息不是来至于源端服务器,而是来自资源的一份副本。
204 No Content 响应报文中包含若干首部和一个状态行,但没有实体的主体部分
205 Reset Content 另一个主要用于浏览器的代码。负责告知浏览器清除当前页面中的所有HTML表单元素
206 Partial Content 成功执行了一个部分或Range(范围)请求。
300~399——重定向状态码
300 Multiple Choices 客户端请求一个实际指向多个资源的URL时会返回这个状态码,比如服务器上有某个HTML文档的英语和法语版本,服务器可以在Location首部包含首选URL
301 Moved Permanently 在请求的URL已被移除时使用,响应的Location首部中应该包含资源现在所处的URL
302 Found 与301状态码类似,但是,客户端应该使用Location首部给出的URL来临时定位资源,将来的请求仍应使用老的URL
303 See Other 告知客户端应该用另一个URL来获取资源
304 Not Modified 客户端可以通过所包含的请求首部,使其请求变成有条件的,如果客户端发起了一个条件GET请求,而最近资源未被修改的话,就可以用这个状态码来说明资源未被修改
305 Use Proxy 用来说明必须通过一个代理来访问资源,代理的位置由Location首部给出
306 (未使用) 当前未使用
307 Temporary Redirect 与301状态码类似,但客户端应该使用Location首部给出的URL来临时定位资源。将来的请求应该使用老的URL
400~499——客户端错误状态码
400 Bad Request 用于告诉客户端它发送了一个错误的请求
401 Unauthorized 与适当的首部一同返回,在这些首部中请求客户端在获取对资源的访问权之前,对自己进行认证
402 Payment Required 现在这个状态码还未使用,但已经被保留,以作未来之用
403 Forbidden 用于说明请求被服务器拒绝了
404 Not Found 用于说明服务器无法找到所请求的URL
405 Method Not Allowed 发起的请求中带有所请求的URL不支持的方法时,使用此状态码
406 Not Acceptable 客户端可以指定参数来说明它们愿意接收什么类型的实体,服务器没有与客户端可接受的URL相匹配的资源时,使用此代码
407 Proxy Authentication Required 与401 状态类似,但用于要求资源进行认证的代理服务器
408 Request Timeout 如果客户端完成请求所花的时间太长,服务器可以回送此状态码,并关闭连接
409 Conflict 用于说明请求可能在资源上引发的一些冲突
410 Gone 与404类似,只是服务器曾经拥有过此资源,主要用于Web站点的维护
411 Length Required 服务器要求在请求报文中包含content-Length 首部时使用
412 Precondition Failed 客户端发起了条件请求,且其中一个条件失败了的时候使用
413 Request Entity Too Large 客户端发送的实体主体部分服务器能够或者希望处理的要大时,使用此状态码
414 Request URl Too Long 客户端所发请求中的请求URL比服务器能够或者希望处理的要长时,使用此状态码
415 Unsupported Media Type 服务器无法理解或无法支持客户端所发实体的内容类型时,使用此状态吗
416 Requested Range Not Satisfiable 请求报文所请求的是指定资源的某个范围,而此范围无效或无法满足时,使用此状态码
417 Expectation Failed 请求的Expect请求首部包含了一个期望,但服务器无法满足此期望时,使用此状态码
500~599——服务器错误状态码
500 Internal Server Error 服务器遇到一个妨碍它为请求提供服务的错误时,使用此状态码
501 Not Implemented 客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码
502 Bad Gateway 作为代理或网关使用的服务器从请求响应链的下一条链路上收到了一条伪响应(比如,它无法连接到其父网关)时,使用此状态码
503 Service Unavailable 用来说明服务器现在无法为请求提供服务,但将来可以。
504 Gateway Timeout 与状态码408类似,只是这里的响应来自一个网关或代理,它们在等待另一服务器对其请求进行响应时超时了
505 HTTP Version Not Supported 服务器收到的请求使用了它无法或不愿支持的协议版本时,使用此状态码
16. get和post请求的区别?
1. 收发数据来说
GET请求一般用去请求获取数据,
POST一般作为发送数据到后台时使用
2、传输数据的参数上
GET 一般放在URL中明文传输
POST 一般放在请求体中传输
3、刷新浏览器或者重复请求上(后退)来说
GET请求刷新浏览器或回退时没有影响
POST回退时会重新提交数据请求
4、数据缓存上来说
GET 请求可被缓存
POST 请求不会被缓存
5、历史记录上来说
GET 请求保留在浏览器历史记录中
POST 请求不会保留在浏览器历史记录中
6、收藏上来说
GET 请求可被收藏为书签
POST 不能被收藏为书签
7、支持编码方式来说
GET请求只能进行url编码(application/x-www-form-urlencoded)
POST支持多种编码方式(application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。)
17. Django中F 和 Q 的作用
F函数 能够解析对现有查询对象的引用的对象
Q函数 对对象进行复杂查询,并支持&(and),|(or),~(not)操作符。
18. Django路由匹配的原则是什么?
Django在接收到一个请求时,从主路由文件中的urlpatterns列表中以由上至下的顺序查找对应路由规则,如果发现规则为include包含,
则再进入被包含的urls中的urlpatterns列表由上至下进行查询。值得关注的由上至下的顺序,有可能会使上面的路由屏蔽掉下面的路由,带来非预期结果。
19. 解决跨域的常用方式是什么?
1、 通过jsonp跨域
2、 document.domain + iframe 跨域
3、 location.hash + iframe
4、 window.name + iframe 跨域
5、 postMessage跨域
6、 跨域资源共享(CORS)
7、 nginx代理跨域
8、 nodejs中间件代理跨域
9、 WebSocket协议跨域
20. Django之根据已经存在数据库中的表自动生成模型
```shell python manage.py inspectdb > model.py
22. blank=True 和 null=True 的区别?
null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空。
blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以为空。
23. Django models 如何设置一个带有枚举值的?
django中提供choice类型
gender_choice=(('1','男'),('2','女 '))
user_gender=Models.CharFied(max_length=2,choices=gender_choice)
24. 如何实现一对多的查询?
# 正向查找
对象.外键.某字段
# 反向查找
对象.类名小写_set.某字段
25. 创建Django项目以及应用的命令
django-admin startproject 项目名称
python manage.py startapp 应用名称 或者 django-admin startapp 应用名称
26. 如何进行数据迁移?
python manage.py makemigrations
python manage.py migrate
27. 请说出Django自带的密码加密方法和验证方法?
from django.contrib.auth.hashers import make_password,check_password
28. 什么是cookie?如何获取和设置cookie?
Cookie是由服务器(网站)生成的,存储在浏览器端的 键值对数据 设置cookie : response.set_cookie('键', '值',max_age) 读取cookie : request.COOKIES.get('键') 或者 request.COOKIES['键']
29. 如何使用django-redis提供的缓存方法?
from django.core.cache import cache
from django_redis import get_redis_connection
# 简单方式
cache.set(key,value,expir)
cache.get(key)
# 复杂方式
conn = get_redis_connection('default')
conn.hset('cart_1',2,{'name':'oppo30pro','price':5999,'count':1})
conn.hgetall('cart_1')
30. Query_dict和dict的区别?
QueryDict对象 ,有urlencode()方法,dict没有此方法
31. 如何给一个视图函数加上缓存?
from django.views.decorators.cache import cache_page
@cache_page(5) 5 代表缓存时间
def testpage():
pass