我的面试笔记
本文最后更新于:2024年7月6日 早上
python基础
- 为什么学习Python?
一、WEB框架
1. 请简述django请求生命周期
- 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端
- 服务端的wsgiref模块接收用户请求并将请求进行初次封装
- 将请求交给Django的中间件
- 通过中间件之后将请求交给url,根据浏览器发送的不同url去匹配不同的视图函数
- 视图函数根据业务逻辑调用数据库获取相应的数据,然或根据模板渲染页面
- 视图函数将响应的页面依次通过中间件
- 到达wsgi,封装数据后反馈给客户端
2. 什么wsgi
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。
WSGI区分为两个部分:一为“服务器”或“网关”,另一为“应用程序”或“应用框架”。在处理一个WSGI请求时,服务器会为应用程序提供环境信息及一个回调函数(Callback Function)。当应用程序完成处理请求后,透过前述的回调函数,将结果回传给服务器。
所谓的 WSGI 中间件同时实现了API的两方,因此可以在WSGI服务器和WSGI应用之间起调解作用:从Web服务器的角度来说,中间件扮演应用程序,而从应用程序的角度来说,中间件扮演服务器。“中间件”组件可以执行以下功能:
- 重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。
- 允许在一个进程中同时运行多个应用程序或应用框架。
- 负载均衡和远程处理,通过在网络上转发请求和响应消息。
- 进行内容后处理,例如应用XSLT样式表。
实现该协议的模块:
- wsgiref
- werkzurg
- uwsig
3.视图的玩法
FBV——url —— 函数
CBV——url —— view
4.RESTful规范
什么是RESTful架构:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。
5.django rest framework框架
1. 路由
- 可以通过as_view传参数,根据请求方式不同执行相应的方法
- 可以在url中设置一个结尾,类似于: .json
2. 视图
- 帮助开发者提供了一些类,并在类中提供了多个方法以供我们使用
3. 版本
- 在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同做不同处理
4. 认证
写一个类并注册到认证类,在类的的authticate方法中编写认证逻辑。
- 认证成功(user,auth)
- raise AuthticateFaild(….)
- None
5. 权限
写一个类并注册到权限类,在类的的has_permission方法中编写认证逻辑。
- True
- False
6. 频率限制
写一个类并注册到频率类,在类的的 allow_request/wait 方法中编写认证逻辑。
1 |
|
7. 解析器
根据ContentType请求头,选择不同解析器对 请求体中的数据进行解析。
POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:url-formendo…. \r\n\r\nuser=alex&age=123
POST /index/ http1.1.\r\nhost:11.11.11.11\r\nContent-Type:application/json\r\n\r\n{….}
8. 分页
- 对从数据库中获取到的数据进行分页处理: SQL -> limit offset
6. 页码越大速度越慢,为什么以及如何解决?
原因:页码越大向后需要扫描的行数越多,因为每次都是从0开始扫描。
解决:
- 限制显示的页数
- 记录当前页数据ID最大值和最小值,再次分页时,根据ID现行筛选,然后再分页。
7. 三次握手与四次挥手
答案详解:TCP握手与挥手
8.简述什么是FBV和CBV
FBV(function base views) ——在视图里使用函数处理请求。
CBV(class base views) ——在视图里使用类处理请求。
其实没有本质的区别
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:
提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
9.谈一谈你对ORM的理解
1 |
|
二、 项目相关:
1. 请讲一下你做的在线商城的表结构
- 课程(13表)
- 课程大类
- 课程子类
- 学位课
- 讲师
- 奖学金
- 专题课(学位课模块表)
- 价格策略(contenttype)
- 课程详细(o2o -> 水平分表)
- 常见问题
- 课程大纲
- 章节
- 课时
- 作业
- 深科技(4+2)
- 用户表
- 用户token
- 文章来源
- 文章表
- 通用评论表
- 通用收藏表
2. 支付宝功能
- 加密方式:rsa
- 公钥私钥:
- 商户私钥
- 支付宝公钥
- 商户私钥
- 支付成功后,断电宕机
- 成功:return HttpResponse(‘success’)
3. 数据库页数越大速度越慢,如何解决
- 限制页数
- 记录当前页最大ID、最小ID
- 错误答案:
- 扫描索引表
- 再去数据库表中获取数据
4. redis是什么?
用于操作内存的软件。
可以做持久化:
- AOF
- RDB
相当于是大字典
单进程单线程
三、 Django
1. 讲述一些ORM操作
select_related,连表操作,相当于主动做join
prefeth_related,多次单表操作,先查询想要的数据,然后构造条件,如:id=[1,2,3],再次查询其他表根据id做条件。
only
defer
F
Q
通过ORM写偏原生SQL:
- extra
1 |
|
- raw
1 |
|
- 原生SQL
1 |
|
- 选择数据库
1 |
|
?、其他
1. git的作用是什么
进行版本控制,实现协同开发
2. git命令与意义
- git init
- git add
- git status
- git commit
- git log
- git reflog
- git reset –hard
- git checkout