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 的内部协议,使用二进制方式和其他应用程序进行通信;

流程关系:
在这里插入图片描述

扩展问题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

作用:

  1. 手动对单表进行增,删,改,查,手动把orm操作获取的数据渲染到模块;(阶段1)
  2. Form组件(类),自动生成标签(input,select),并对用户输入的数据做规则验证;(阶段2)
  3. 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(考察后台的定时任务/异步任务)

分布式任务队列,用于实现异步任务处理。
实现参考:https://www.cnblogs.com/wdliu/p/9530219.html


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常见的设计模式

单例模式、策略模式、代理模式、观察者模式、装饰模式、适配器模式、命令模式、组合模式、简单工厂模式、模板方法模式(简单概述)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许进进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值