最近两个后端同事离职了,帮忙面试了些后端开发的实习生,虽然有过一些后端经验,但我不是主要写后端的,复习了下Django也稍微准备了一些主要是Django相关的面试题,数据库相关部分额外,没有在此举出,但是绝不可忽视。绝非专业,聊以记录,温故知新。
1 什么是wsgi,uwsgi, uWSGI?(简单,可跳过直接问扩展问题)(考察Django处理网络请求流程/生命周期)
wsgi协议:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。 利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;
uWSGI 是一个全功能的 HTTP 服务器,他要做的就是把 HTTP 协议转化成语言支持的网络协议。比如把 HTTP 协议转化成 WSGI 协议,让 Python 可以直接使用;
uwsgi 是一种 uWSGI 的内部协议,使用二进制方式和其他应用程序进行通信;
流程关系:
扩展问题1:既然 uWSGI 可以完成 Nginx 功能,那为什么又要用 Nginx
Nginx 更牛逼,能直接在 Nginx 层面就完成很多事情,比如静态文件、反向代理、转发等需求。
扩展问题2:nginx的作用:
1.反向代理,可以拦截一些web,保护后端的web服务器
2.负载均衡,根据轮询算法,分配请求到多节点web服务器
3.缓存静态资源,加快访问速度,释放web服务器的内存占用,专项专用
扩展问题3 django请求的生命周期(请求流程)?
(可从上面的wsgi开始说起)
1.wsgi,请求封装后交给web框架 (Flask / Django)
2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session
3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数
4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染
5.中间件,对响应的数据进行处理。
6.wsgi,将响应的内容发送给浏览器。
请求过程简单说明:浏览器发起请求–>请求处理–>请求经过中间件–>路由映射–>视图处理业务逻辑–>响应请求(template或response)
2 列举Django常用的内置组件(考察Django常用组件熟悉度)
1. ORM
数据模型与数据库的解耦
- 根据对象的类型生成表结构
- 将对象,列表的操作,转换为sql语句
- 将sql查询到的结果转换为对象,列表
2. 分页器(paginator)
from django.core.paginator import Paginator
Paginator对象: paginator = Paginator(user_list, 10)
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
page对象:page=paginator.page(1)
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表
# number 当前页
# paginator paginator对象
3. 中间件 (可从Django的生命周期的第二个周期引申出此问题)
介于request(请求)与response(响应)处理之间的一道处理过程,相对比较轻量级,位于web服务端与url路由层之间
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', #一些安全设置,比如xss脚本过滤
'django.contrib.sessions.middleware.SessionMiddleware',#session支持中间件,加入这个中间件,会在数据库中生成一个django_session的表。
'django.middleware.common.CommonMiddleware', #通用中间件,会处理一些url
'django.middleware.csrf.CsrfViewMiddleware', #跨域请求伪造中间件,加入这个中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF击。
'django.contrib.auth.middleware.AuthenticationMiddleware', #用户授权中间件。他会在每个HttpRequest对象到达view之前添加当前登录用户的user属性,也就是你可以在view中通过request访问user。
'django.contrib.messages.middleware.MessageMiddleware',#消息中间件。展示一些后台信息给前端页面。如果需要用到消息,还需要在INSTALLED_APPS中添加django.contrib.message才能有效。如果不需要,可以把这两个都删除。
'django.middleware.clickjacking.XFrameOptionsMiddleware',#防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)出现。
'A_orm.middlewares.auth.AuthenticationMiddleware',
]
内置中间件
4. form组件(一般写HTML前端用的多,考察全栈能力)
主要功能如下:
- 生成页面可用的HTML标签
- 对用户提交的数据进行校验
- 保留上次输入内容
5. ModelForm
作用:
- 手动对单表进行增,删,改,查,手动把orm操作获取的数据渲染到模块;(阶段1)
- Form组件(类),自动生成标签(input,select),并对用户输入的数据做规则验证;(阶段2)
- ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单,方便地对数据库进行增加,编辑操作和验证标签的生成
原生用的可能不多,主用DRF框架
6.cookie和session
cookies是浏览器为web服务器存储的一个信息,每次浏览器从某个服务器请求页面时,都会自动带上以前收到的cookie.cookie保存在客户端,安全性较差,注意不要保存没敢信息.
6.1 jsonwebtoken(JWT)(由sesssion/cookie引出来)
考察:原理、数据结构、使用方式、特点…
简述:
JWT(Json Web Token)是是目前最流行的跨域认证解决方案,是实现token技术的一种解决方案,JWT由三部分组成: header(头)、payload(载体)、signature(签名)。
使用方法:
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
参考:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
3 celery(考察后台的定时任务/异步任务)
分布式任务队列,用于实现异步任务处理。
4 Q查询/F查询
4.1引申问题1:关联查询
4.2引申问题2:原始SQL语句
4.3引申问题3:Django中如何配置过多个数据库
主要考察一些数据库sql相关知识。
5ModeviewSet(考察DRF相关)
5.1 drf继承过哪些视图类,他们之间的区别?
第一种:APIView
第一种遵循了CBV的模式,里面的功能比较多但是需要自己写的代码也有很多
提供了免除csrf认证,版本处理、认证、权限、节流、解析器、筛选器、分页、序列化、渲染器
第二种:ListAPIView,RetrieveAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView
第二种则在第一种的基础上,封装了许多我们需要自己的写的代码,许多功能的实现只需要给专属的变量名赋值就可以实现该功能
第三种:GenericViewSet、ListModelMixin,RetrieveModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin
第三种则重构了APIView中的as_view()方法,结合请求方法和不同Mixin类的方法名从而进行执行不同的功能。与前面两种最主要的区别是url路由中as_view()方法中需要传值。
目前使用的主要目的是把第二种的bug(查询全部数据的功能和查询单个数据的功能无法在一个类中实现)实现在一个类中!
5.2 GenericAPIView视图类的作用(DRF增删查改视图类)
总结:GenericAPIView主要为drf内部帮助我们提供增删改查的类LIstAPIView、CreateAPIView、UpdateAPIView、提供了执行流程和功能,
我们在使用drf内置类做增删改查时,就可以通过自定义 静态字段(类变量)或重写方法(get_queryset、get_serializer_class)来进行更高级的定制。
6 列举常用的Django第三方库?
7 加密模式有哪些?(举例,大致介绍如对称非对称)
8 是否关注新技术啊?golang,rust,numpy,pandas是否了解?
9 django安全防护?(比如csrf)
10常见的设计模式
单例模式、策略模式、代理模式、观察者模式、装饰模式、适配器模式、命令模式、组合模式、简单工厂模式、模板方法模式(简单概述)