django面试三
1.Django、 Flask、Tornado框架的比较?
Django:
对于django,大而全的框架它的内部组件比较多,内部提供:ORM、Admin、中间件、Form、ModelForm、Session、缓存、信号、CSRF;功能也都挺完善的
Flask :
flask,微型框架,内部组件就比较少了,但是有很多第三方组件来扩展它,比如说有那个wtform(与django的modelform类似,表单验证)、flask-sqlalchemy(操作数据库的)、flask-session、flask-migrate、flask-script、blinker可扩展强,第三方组件丰富。所以对他本身来说有那种短小精悍的感觉
Tornado:
是一个轻量级的Web框架,异步非阻塞+内置WebSocket功能。
'目标':通过一个线程处理N个并发请求(处理IO)。
内部组件:
a.内部自己实现socket
b.路由系统
c.视图
d.模板
e.cookie
f.csrf
共同点:
django和flask的共同点就是,他们2个框架都没有写socket,所以他们都是利用第三方模块wsgi;而Tornado自带socket组件。
不同点:
但是内部使用的wsgi也是有些不同的:django本身运行起来使用wsgiref,而flask使用werkzeug wsgi,还有一个区别就是他们的请求管理不太一样:django是通过将请求封装成request对象,再通过参数传递,而flask是通过上下文管理机制
2. Django请求的生命周期?
用户请求进来先走到 wsgi,然后将请求交给 django的中间件,穿过django中间件(方法是process_request),接着就是路由匹配,路由匹配成功之后就执行相应的视图函数,在视图函数中可以调用orm做数据库操作,再从模板路径将模板拿到,然后在后台进行模板渲染,模板渲染完成之后就变成一个字符串,再把这个字符串经过所有中间件(方法:process_response)和wsgi 返回给用户
3.列举Django的内置组件?
form组件:
- 对用户请求的数据进行校验
- 生成HTML标签
PS:
- form对象是一个可迭代对象。
- 问题:choice的数据如果从数据库获取可能会造成数据无法实时更新
- 重写构造方法,在构造方法中重新去数据库获取值。
- ModelChoiceField字段
信号:
django的信号其实就是django内部为开发者预留的一些自定制功能的钩子。只要在某个信号中注册了函数,那么django内部执行的过程中就会自动触发注册在信号中的函数。
场景:
在数据库某些表中添加数据时,可以进行日志记录。
CSRF(跨站点请求伪造):
目标:防止用户直接向服务端发起POST请求。
它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。
对所有的post请求做验证/ 将Django生成的一串字符串发送给客户端,一种是从请求体发过来,一种是放在隐藏的标签里面用的是process_view
方案:先发送GET请求时,将token保存到:cookie、Form表单中(隐藏的input标签),以后再发送请求时只要携带过来即可。
目前防御 CSRF 攻击主要有三种策略:1).验证 HTTP Referer 字段;2).在请求地址中添加 token 并验证;3).在 HTTP 头中自定义属性并验证
ContentType:
ContentType是django的一个组件(app),为我们找到django程序中所有app中的所有表并添加到记录中。可以使用它再加上表中的两个字段实现:一张表和N张表创建FK(字段)关系。(简单理解为进行多表之间的关联作用)
- 字段:表名称
- 字段:数据行ID
应用:内部购买系统之表优惠券。
中间件:
对所有的请求进行批量处理,在视图函数执行前后进行自定义操作。
应用:用户登录校验
问题:为甚么不使用装饰器?
如果不使用中间件,就需要给每个视图函数添加装饰器,太繁琐
认证组件:
只有认证通过的用户才能访问指定的url地址,比如:购买物品信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件
Auth模块是Django自带的用户认证模块
详情:https://www.cnblogs.com/liuqingzheng/articles/9628105.html
权限组件:
用户登录后,将权限放到session中,每次请求进来都在中间件里,根据当前的url去session中匹配,判断当前用户是否有权限访问当前url,有权限就继续访问,没有就返回,(检查的东西就可以放到中间件中进行统一处理)在process_request方法里面做的,我们的中间件是放在session后面,因为中间件需要到session里面取数据
详情:https://www.cnblogs.com/liuqingzheng/articles/9628105.html
session:
cookie与session区别:
(a)cookie是保存在浏览器端的键值对,而session是保存的服务器端的键值对,但是依赖cookie。(也可以不依赖cookie,可以放在url,或请求头但是cookie比较方便)
(b)以登录为例,cookie为通过登录成功后,设置明文的键值对,并将键值对发送客户端存,明文信息可能存在泄漏,不安全;session则是生成随机字符串,发给用户,并写到浏览器的cookie中,同时服务器自己也会保存一份。
(c)在登录验证时,cookie:根据浏览器发送请求时附带的cookie的键值对进行判断,如果存在,则验证通过;session:在请求用户的cookie中获取随机字符串,根据随机字符串在session中获取其对应的值进行验证
缓存:
常用的数据放在缓存里面,就不用走视图函数,请求进来通过所有的process_request,会到缓存里面查数据,有就直接拿,没有就走视图函数
关键点:1:执行完所有的process_request才去缓存取数据
2:执行完所有的process_response才将数据放到缓存
关于缓存问题
1:为什么放在最后一个process_request才去缓存
因为需要验证完用户的请求,才能返回数据
2:什么时候将数据放到缓存中
第一次走中间件,缓存没有数据,会走视图函数,从数据库里面取数据,
当走完process_response,才将数据放到缓存里,因为走process_response的时候可能给我们的响应加处理
为什么使用缓存
将常用且不太频繁修改的数据放入缓存。
以后用户再来访问,先去缓存查看是否存在,如果有就返回
否则,去数据库中获取并返回给用户(再加入到缓存,以便下次访问)
5.列举Django中间件的5个方法?以及django中间件的应用场景?
process_request(self,request) 先走request 通过路由匹配返回
process_view(self, request, callback, callback_args,callback_kwargs)
(1)执行完所有中间件的request方法‘
(2)url匹配成功
(3)拿到 视图函数的名称、参数,(注意不执行) 再执行process_view()方法
(4)最后去执行视图函数
process_template_response(self,request,response) 当视图函数的返回值对象中有render方法时,该方法才会被调用
process_exception(self, request, exception) 在视图函数执行出错时,返回错误信息
process_response(self, request, response)
6.FBV与CBV的区别
- 没什么区别,因为他们的本质都是函数。CBV的.as_view()返回的view函数,view函数中调用类的dispatch方法,在dispatch方法中通过反射执行get/post/delete/put等方法。
非要说区别的话:
- CBV比较简洁,GET/POST等业务功能分别放在不同get/post函数中。FBV自己做判断进行区分。
7.Django orm 中如何设置读写分离?
方式一:手动使用queryset的using方法
方式二:写配置文件
8.基于Django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
方式一:给每个ajax都加上请求头
方式二:需要先下载jQuery-cookie,才能去cookie中获取token
方式三:搞个函数ajaxSetup,当有多的ajax请求,即会执行这个函数
9.Django中如何实现orm表中添加数据时创建一条日志记录。
给信号注册函数:
使用django的信号机制,可以在添加、删除数据前后设置日志记录
pre_init # Django中的model对象执行其构造方法前,自动触发
post_init # Django中的model对象执行其构造方法后,自动触发
pre_save # Django中的model对象保存前,自动触发
post_save # Django中的model对象保存后,自动触发
pre_delete # Django中的model对象删除前,自动触发
post_delete # Django中的model对象删除后,自动触发
10.谈谈你对RESTful 规范的认识?
RESTful其实就是一套编写接口的'协议',规定如何编写以及如何设置返回值、状态码等信息。
# 最显著的特点:
# 用restful:
给用户一个url,根据method不同在后端做不同的处理
比如:post创建数据、get获取数据、put和patch修改数据、delete删除数据。
# 不用restful:
给调用者很多url,每个url代表一个功能,比如:add_user/delte_user/edit_user/
# 当然,还有协议其他的,比如:
'版本'来控制让程序有多个版本共存的情况,版本可以放在 url、请求头
(accept/自定义)、GET参数
'状态码'200/300/400/500
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
'url中尽量使用名词'restful也可以称为“面向资源编程”
'api标示'
api.sex.com 尽量将API部署在专用域名(会存在跨域问题)
www.sex.com/api/
11.什么是RPC?
'远程过程调用协议'是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
进化的顺序: 先有的RPC,然后有的RESTful规范
12.为什么要使用django rest framework框架?
内部帮助我们提供了很多方便的组件,我们通过配置就可以完成相应操
作,如:'序列化'可以做用户请求数据校验+queryset对象的序列化称为json,'解析器'获取用户请求数据request.data,会自动根据content-type请求头的不能对数据进行解析,'分页'将从数据库获取到的数据在页面进行分页显示。
还有其他组件:'认证'、'权限'、'访问频率控制
Flask
1.Flask的优势?
Flask自由、灵活,可扩展性强,透明可控,第三方库的选择面广,开发时可以结合最流行最强大的Python库。
2.Flask框架依赖组件有哪些?
依赖jinja2模板引擎
依赖werkzurg协议
3.Flask蓝图的作用
blueprint把实现不同功能的module分开.也就是把一个大的App分割成各自实现不同功能的module.
在一个blueprint中可以调用另一个blueprint的视图函数, 但要加相应的blueprint名.
4.简述Flask上下文管理流程?
# a、简单来说,falsk上下文管理可以分为三个阶段:
1、'请求进来时':将请求相关的数据放入上下文管理中
2、'在视图函数中':要去上下文管理中取值
3、'请求响应':要将上下文管理中的数据清除
# b、详细点来说:
1、'请求刚进来':
将request,session封装在RequestContext类中app,g封装在AppContext类中,并通过LocalStack将RequestContext和 AppContext放入Local类中
2、'视图函数中':
通过localproxy--->偏函数--->localstack--->local取值
3、'请求响应时':
先执行save.session()再各自执行pop(),将local中的数据清除
5.Flask中的g的作用?
g是贯穿于一次请求的全局变量,当请求进来将g和current_app封装为一个AppContext类,再通过LocalStack将AppContext放入Local中,取值时通过偏函数在LocalStack、local中取值;响应时将local中的g数据删除:
6.Flask执行流程?
7.什么是偏函数?
简单说functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单
举例:
#假设对int(x, base = 10),进行二次封装
#通常做法
def to_int2(x):
return int(x, base = 2)
print(to_int2(‘101‘))
#偏函数 做法
import functools
to_int2_partial = functools.partial(int, base = 2)
print(to_int2_partial(‘101‘,base=2))
#partial的函数声明
#def __init__(self, func, *args, **keywords):
#由此处可以看到其实就是做了
#int(**keywords) ==>kw = {‘base‘ = 2} 然而‘101’会以*args的形式传入到函数
print(to_int2_partial(‘101‘,base=10))
#result --> 101
django面试三的更多相关文章
- django笔记三之admin的管理
django笔记三之admin的管理 设置自动admin应用 vim todos/settings.py INSTALLED_APPS = ( 'django.contrib.admin', 新版本已 ...
- Django - Xadmin (三) 分页、搜索和批量操作
Django - Xadmin (三) 分页.搜索和批量操作 分页和 ShowList 类 因为 list_view 视图函数里面代码太多,太乱,所以将其里面的用于处理表头.处理表单数据的关键代码提取 ...
- day 53-1 Django基础三之视图函数
Django基础三之视图函数 本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...
- day 67 Django基础三之视图函数
Django基础三之视图函数 本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
- Django面试集锦(1-50)
目录 1.Django ORM查询中select_related和prefetch_related的区别? 2.only与defer的用法? 3.Django ORM是什么? 4.Django创建项目 ...
- python 学习第二十一天,django知识(三)
一,django的url路由系统总结 1,url(/index/,函数或者类) 2,url(/index/(\d+), 函数或者类) 3,url(/index/(?P<nid>\d+),函 ...
- Django(三)
1.Django请求的生命周期 路由系统 -> 视图函数(获取模板+数据-->渲染) -> 字符串返回给用户 2.路由系统 /index/ ...
- [Java面试三]JavaWeb基础知识总结.
1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...
随机推荐
- 『流畅的Python』第9章笔记_对象
一.Python风格 以一个二元素向量对象为例 import math from array import array class Vector2d: typecode = 'd' def __ini ...
- Docker实现原理之Namespace,CGroup
找了几篇这方面的文章,写的还不错,跟大家共享:DOCKER基础技术:LINUX NAMESPACE(上)DOCKER基础技术:LINUX NAMESPACE(下)DOCKER基础技术:LINUX CG ...
- IntelliJ IDEA2017创建web工程并实现远程部署tomca【转载】
[IntelliJ IDEA2017创建web工程并实现远程部署tomcat] 作者:https://segmentfault.com/a/1190000012762629 将应用打成war包方式 步 ...
- 网络编程socket方法
1.理解socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...
- Django之cookie+session
前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...
- Jupyter 快速入门——写python项目博客非常有用!!!
from:https://blog.csdn.net/m0_37338590/article/details/78862488 一.简介: Jupyter Notebook(此前被称为 IPython ...
- python javar send
# -*- coding: utf-8 -*-import jpypeimport os.pathjarpath = os.path.join(os.path.abspath('.'), 'axja' ...
- DLL的Export和Import及extern "C"
今天使用Unrar.dll,在调用RARProcessFileW时,VS总是提示“error LNK2001: 无法解析的外部符号”. Unrar.dll中是使用 extern "C&quo ...
- Ubuntu Windows双系统重装windows后看不到ubuntu启动引导
1.下载并安装Easy BCD 2.点击编辑引导菜单,看到只有windows一项 3.点击“添加新条目”,添加引导菜单,选择linux/bsd ,类型选择GRUB 2,然后输入名称,选择Ubuntu所 ...
- js 敏感词过滤
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...