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面试三的更多相关文章

  1. django笔记三之admin的管理

    django笔记三之admin的管理 设置自动admin应用 vim todos/settings.py INSTALLED_APPS = ( 'django.contrib.admin', 新版本已 ...

  2. Django - Xadmin (三) 分页、搜索和批量操作

    Django - Xadmin (三) 分页.搜索和批量操作 分页和 ShowList 类 因为 list_view 视图函数里面代码太多,太乱,所以将其里面的用于处理表头.处理表单数据的关键代码提取 ...

  3. day 53-1 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  4. day 67 Django基础三之视图函数

    Django基础三之视图函数   本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Dja ...

  5. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  6. Django面试集锦(1-50)

    目录 1.Django ORM查询中select_related和prefetch_related的区别? 2.only与defer的用法? 3.Django ORM是什么? 4.Django创建项目 ...

  7. python 学习第二十一天,django知识(三)

    一,django的url路由系统总结 1,url(/index/,函数或者类) 2,url(/index/(\d+), 函数或者类) 3,url(/index/(?P<nid>\d+),函 ...

  8. Django(三)

    1.Django请求的生命周期         路由系统 -> 视图函数(获取模板+数据-->渲染) -> 字符串返回给用户   2.路由系统         /index/    ...

  9. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

随机推荐

  1. 『MXNet』第十二弹_再谈新建计算节点

    上一节我们已经谈到了计算节点,但是即使是官方文档介绍里面相关内容也过于简略,我们使用Faster-RCNN代码中的新建节点为例,重新介绍一下新建节点的调用栈. 1.调用新建节点 参数分为三部分,op_ ...

  2. element-ui radio 再次点击取消选中

    <el-radio-group v-model="radio2"> <el-radio @click.native.prevent="clickitem ...

  3. PAT 1035 Password

    1035 Password (20 分)   To prepare for PAT, the judge sometimes has to generate random passwords for ...

  4. 1003. Check If Word Is Valid After Substitutions Medium检查替换后的词是否有效

    网址:https://leetcode.com/problems/check-if-word-is-valid-after-substitutions/ 参考:https://leetcode.com ...

  5. 2017-3-30/HTTP协议2

    1. http的状态码有哪些? 状态代码由三位数字组成,第一个数字定义了响应的类别,共分五种类别: 1xx:指示信息--表示请求已接收,继续处理 2xx:成功--表示请求已被成功接收.理解.接受 3x ...

  6. Hadoop格式化 From hu-hadoop1/192.168.11.11 to hu-hadoop2:8485 failed on connection exception: java.net.

    192.168.11.12:8485: Call From hu-hadoop1/192.168.11.11 to hu-hadoop2:8485 failed on connection excep ...

  7. sqlmap sql注入工具

    下载地址: https://github.com/sqlmapproject/sqlmap 参数可以在sqlmap.conf里指定 url = http://localhost:55556/crm/u ...

  8. flex入门----基础知识

    传统的页面布局   在flex出现之前,双列布局,三列布局,动态盒居中,绝对居中布局等常见的布局均是采用dispaly+float+定位来布局的,一般包括以下几种布局策略: normal flow(文 ...

  9. 【Java算法】求质数的算法

    计算100以内的质数 1.质数:大于1的整数中,只能被自己和1整除的数为质数. 如果这个数,对比自己小1至2之间的数字,进行求余运算,结果都不等于0,则可以判断该数为质数. public class ...

  10. Win10系列:VC++媒体播放控制1

    在MediaElement控件中定义了用于控制视频播放的函数,如Play.Pause和Stop等函数.本小节将在20.6.1小节所新建的项目基础上继续来介绍如何为视频添加播放控制,并在最后一部分给出项 ...