Python后端开发(主Django)⾯试题
最近两个后端同事离职了,帮忙⾯试了些后端开发的实习⽣,虽然有过⼀些后端经验,但我不是主要写后端的,复习了下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 的内部协议,使⽤⼆进制⽅式和其他应⽤程序进⾏通信;
python单例模式流程关系:
扩展问题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)
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脚本过滤
'ib.sessions.middleware.SessionMiddleware',#session⽀持中间件,加⼊这个中间件,会在数据库中⽣成⼀个django_session的表。
'django.middlewaremon.CommonMiddleware',#通⽤中间件,会处理⼀些url
'django.middleware.csrf.CsrfViewMiddleware',#跨域请求伪造中间件,加⼊这个中间件,在提交表单的时候会必须加⼊csrf_token,cookie中也会⽣成⼀个名叫csrftoken的值,也会在header中加⼊⼀个HTTP_X_CSRFTOKEN的值来放置CSRF攻击。
'ib.auth.middleware.AuthenticationMiddleware',#⽤户授权中间件。他会在每个HttpRequest对象到达view之前添加当前登录⽤户的user属性,也就是你可以在view中通过request访问user。
'ssages.middleware.MessageMiddleware',#消息中间件。展⽰⼀些后台信息给前端页⾯。如果需要⽤到消息,还需要在INSTALLED_APP S中添加ssage才能有效。如果不需要,可以把这两个都删除。
'django.middleware.clickjacking.XFrameOptionsMiddleware',#防⽌通过浏览器页⾯跨Frame出现clickjacking(欺骗点击)攻击出现。
'A_orm.middlewares.auth.AuthenticationMiddleware',
]
内置中间件
在这⾥插⼊图⽚描述
4. form组件(⼀般写HTML前端⽤的多,考察全栈能⼒)
主要功能如下:
⽣成页⾯可⽤的HTML标签
对⽤户提交的数据进⾏校验
保留上次输⼊内容
5. ModelForm
作⽤:
1. ⼿动对单表进⾏增,删,改,查,⼿动把orm操作获取的数据渲染到模块;(阶段1)
2. Form组件(类),⾃动⽣成标签(input,select),并对⽤户输⼊的数据做规则验证;(阶段2)
3. ModelForm顾名思义就Form和Django的Model数据库模型结合体,可以简单,⽅便地对数据库进⾏增加,编辑操作和验证标签的⽣成
原⽣⽤的可能不多,主⽤DRF框架
cookies是浏览器为web服务器存储的⼀个信息,每次浏览器从某个服务器请求页⾯时,都会⾃动带上以前收到的kie保存在客户端,安全性较差,注意不要保存没敢信息.
6.1 jsonwebtoken(JWT)(由sesssion/cookie引出来)
考察:原理、数据结构、使⽤⽅式、特点…
简述:
JWT(Json Web Token)是是⽬前最流⾏的跨域认证解决⽅案,是实现token技术的⼀种解决⽅案,JWT由三部分组成: header(头)、payload(载体)、signature(签名)。
使⽤⽅法:
客户端收到服务器返回的 JWT,可以储存在 Cookie ⾥⾯,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie ⾥⾯⾃动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段⾥⾯。
另⼀种做法是,跨域的时候,JWT 就放在 POST 请求的数据体⾥⾯。
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常见的设计模式
单例模式、策略模式、代理模式、观察者模式、装饰模式、适配器模式、命令模式、组合模式、简单⼯⼚模式、模板⽅法模式(简单概述)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。