pythonweb面试题及答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

pythonweb⾯试题及答案
⼀:web部分
1:谈谈你对http协议的认识。

OSI中的层功能 TCP/IP协议族
应⽤层⽂件传输,电⼦邮件,⽂件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表⽰层数据格式化,代码转换,数据加密没有协议
会话层解除或建⽴与别的接点的联系没有协议
传输层提供端对端的接⼝ TCP,UDP
⽹络层为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层以⼆进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2
http是⼀种基于应⽤层的超⽂本传输协议,(超⽂本值得就是HTML⽂档)
⼀般分为http请求和http相应:
http请求:请求⾏(包括请求⽅法),消息报头,请求正⽂
http相应:状态码,消息报头,相应正⽂。

谈谈你对websocket协议的认识。

WebSocket是⼀种在单个TCP连接上进⾏全双⼯通信的协议。

在WebSocket API中,浏览器和服务器只需要完成⼀次握⼿
(不是指建⽴TCP连接的那个三次握⼿,是指在建⽴TCP连接后传输⼀次握⼿数据),两者之间就直接可以创建持久性的连接,并进⾏双向数据传输。

socket.io
Socket.IO 本是⼀个⾯向实时 web 应⽤的 JavaScript 库,现在已成为拥有众多语⾔⽀持的Web即时通讯应⽤的框架。

Socket.IO 主要使⽤WebSocket协议
如何创建响应式布局?
使⽤bootstop库
什么是ajax请求?并使⽤jQuery和XMLHttpRequest对象实现⼀个ajax请求。

$.ajax({
type: ,
url: ,
data: ,
datatype: ,
success: ;
})
轮询
轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。

这种传统的HTTP request
的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然⽽HTTP request 的header是⾮常长的,⾥⾯包含的有⽤数据可能只是⼀个很⼩的值,这样会占⽤很多的带宽。

var xhr = new XMLHttpRequest();
setInterval(function(){
xhr.open('GET','/user');
xhr.onreadystatechange = function(){
};
xhr.send();
},1000)
长轮询:
ajax实现:在发送ajax后,服务器端会阻塞请求直到有数据传递或超时才返回。

客户端JavaScript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建⽴连接。

function ajax(){
var xhr = new XMLHttpRequest();
xhr.open('GET','/user');
xhr.onreadystatechange = function(){
ajax();
};
xhr.send();
}
web socket
轮询与长轮询都是基于HTTP的,两者本⾝存在着缺陷:轮询需要更快的处理速度;长轮询则更要求处理并发的能⼒;两者都是“被动型服务器”的体现:服务器不会主动推送信息,
⽽是在客户端发送ajax请求后进⾏返回的响应。

⽽理想的模型是"在服务器端数据有了变化后,可以主动推送给客户端",这种"主动型"服务器是解决这类问题的很好的⽅案。

Web Sockets就是这样的⽅案。

//服务器端
var Server = require('ws').Server;
var wss = new Server({
port:2000
});
wss.on('connection',function(ws){
ws.on('message',function(data){
ws.send('你好,客户端,我是服务器!');
console.log(data);
})
});
//node客户端
var WebSocket = require('ws');
var socket = new WebSocket('ws://localhost:2000/');
socket.on('open',function(){
socket.send('你好,服务器,我是客户端');
});
socket.on('message',function(event){
console.log(event);
})
//html客户端(注:浏览器客户端与node客户端只需要⼀种)
<script>
var socket = new WebSocket('ws://localhost:2000');
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
});
</script>
 vuex的作⽤
能解决多个界⾯间的共享问题,统⼀响应式管理
⽤户登陆状态,⽤户、名称、头像、地理位置等可以保存状态
商品收藏,购物车物品等【可在关闭前统⼀上传】
需要共享的状态信息
vue常见的指令
vue中常⽤v-表⽰指令,下⾯总结⼀下常⽤的指令有哪些:
插⼊⽂本:v-text
相当于元素的innerText属性,必须是双标签
插⼊HMTL:v-html
相当于元素的innerHTML属性
循环:v-for
v-for的使⽤,除了item属性,还有⼀些其他辅助属性。

假设你现在循环的对象名字为students:
如果students是数组,还有index属性,如v-for="(item,index) in students";
如果students是对象,还有value,key属性,如v-for="(value,key,index) in students";
条件渲染
第⼀种:if ... else if ...else型
是否插⼊元素
第⼆种:v-show
是否隐藏元素
属性绑定:v-bind
v-bind:属性名="常量 || 变量名",简写形式——:属性名="常量 || 变量名"
如:
复制代码
<div v-bind:属性名="变量"></div>
//可以简写成
<div :属性名="变量"></div>
//如果要赋值常量,需要给常量⽤单引号包起来,如
<div :属性名=" '常量' "></div>
复制代码
双向绑定:v-model
所谓的双向绑定,就是你在视图层⾥⾯改变了值,vue⾥⾯对应的值也会改变。

只能给具备value属性的元素进⾏双向数据绑定。

绑定事件:v-on
v-on:click = "⽅法名 || 直接改变 vue 内部变量",简写形式——@click = "⽅法名 || 直接改变 vue 内部变量"
<div v-on:click=" num = 1 "></div>
//可以简写成
<div @click=" num = 1 "></div>
可以直接更改vue内部的变量,如上⾯的num,是我在data⾥⾯定义的⼀个属性。

jsonp实现原理
jsonp是解决跨域的⼀种⽅法
浏览器有⼀种约定叫同源策略,为了保证⽤户访问的安全,现代浏览器使⽤了同源策略,即不允许访问⾮同源的页⾯,但是有三个标签是允许跨域加载资源
jsonp原理
就是利⽤上述script标签没有跨域限制的漏洞,⽹页可以得到从其他来源动态产⽣的jsonp数据。

前提条件是jsonp请求⼀定需要对⽅的服务器⽀持相应的格式,
允许⽤户传递⼀个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制⾃⼰的函数来⾃动处理返回数据了
是什么cors ?
解:CORS是跨域,域名,协议。

端⼝相同为同域,不相同为跨域。

解决⽅法:
JSONP:JSONP可以解决跨域问题,但是只能使⽤get请求,不能使⽤post请求
列举Http请求中常见的请求头?
Accept:浏览器可接受的MIME类型;
l Accept-Charset:浏览器可接受的字符集;
l Accept-Encoding:浏览器能够进⾏解码的数据编码⽅式,⽐如gzip。

Servlet能够向⽀持gzip的浏览器返回经gzip编码的HTML页⾯。

许多情形下这可以减少5到10倍的下载时间;
l Accept-Language:浏览器所希望的语⾔种类,当服务器能够提供⼀种以上的语⾔版本时要⽤到;
l Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中;
l Connection:表⽰是否需要持久连接。

如果Servlet看到这⾥的值为“Keep-Alive”,或者看到请求使⽤的是HTTP 1.1(HTTP 1.1默认进⾏持久连接),它就可以利⽤持久连接的优点,当页⾯包含多个元素时(例如Applet,图⽚),显著地减少下l Content-Length:表⽰请求消息正⽂的长度;
l Cookie:这是最重要的请求头信息之⼀;
l From:请求发送者的email地址,由⼀些特殊的Web客户程序使⽤,浏览器不会⽤到它;
l Host:初始URL中的主机和端⼝;
l If-Modified-Since:只有当所请求的内容在指定的⽇期之后⼜经过修改才返回它,否则返回304“Not Modified”应答;
l Pragma:指定“no-cache”值表⽰服务器必须返回⼀个刷新后的⽂档,即使它是代理服务器⽽且已经有了页⾯的本地拷贝;
l Referer:包含⼀个URL,⽤户从该URL代表的页⾯出发访问当前请求的页⾯。

l User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值⾮常有⽤;
什么是wsgi?
WSGI 是 web服务器的⽹管接⼝,具体来说,它定义了⼀个web服务器如何与python应⽤程序进⾏交互
使⽤python写的⽂本应⽤程序和web服务器连接起来
django的⽣命周期
1:浏览器发起请求
2:WSGI 创建socket服务。

接受http请求
3:中间件处理请求
4:url匹配路由
5:视图进⾏业务逻辑的处理(ORM数据库操作)
6:中间件处理相应
7:WSGI返回相应
8:浏览器渲染结果
列举django的内置组件?
.Admin是对model中对应的数据表进⾏增删改查提供的组件
.model组件:负责操作数据库
.form组件:1.⽣成HTML代码2.数据有效性校验3校验信息返回并展⽰
.ModelForm组件即⽤于数据库操作,也可⽤于⽤户请求的验证
列举django中间件的5个⽅法?以及django中间件的应⽤场景?.process_request : 请求进来时,权限认证
.process_view : 路由匹配之后,能够得到视图函数
.process_exception : 异常时执⾏
.process_template_responseprocess : 模板渲染时执⾏
.process_response : 请求有响应时执⾏
简述什么是FBV和CBV?
FBV和CBV本质是⼀样的,基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使⽤CBV的优点:
- .提⾼了代码的复⽤性,可以使⽤⾯向对象的技术,⽐如Mixin(多继承)
- .可以⽤不同的函数针对不同的HTTP⽅法处理,⽽不是通过很多if判断,提⾼代码可读性
django的request对象是在什么时候创建的?
如何给CBV的程序添加装饰器?
from django.utils.decorators import method_decorator
1、给⽅法加:
@method_decorator(check_login)
def post(self, request):
...
2、给dispatch加:
@method_decorator(check_login)
def dispatch(self, request, *args, **kwargs):
...
3、给类加:
@method_decorator(check_login, name="get")
@method_decorator(check_login, name="post")
class HomeView(View):
...
列举django orm 中所有的⽅法(QuerySet对象的所有⽅法)
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象。

获取不到返回None
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有⼀个。

如果符合筛选条件的对象超过⼀个或者没有都会抛出错误。

<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序
<6> reverse(): 对查询结果反向排序
<8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。

<9> first(): 返回第⼀条记录
<10> last(): 返回最后⼀条记录
<11> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<12> values(*field): 返回⼀个ValueQuerySet——⼀个特殊的QuerySet,运⾏后得到的
并不是⼀系 model的实例化对象,⽽是⼀个可迭代的字典序列
<13> values_list(*field): 它与values()⾮常相似,它返回的是⼀个元组序列,values返回的是⼀个字典序列
<14> distinct(): 从返回结果中剔除重复纪录
select_related和prefetch_related的区别?
前提:有外键存在时,可以很好的减少数据库请求的次数,提⾼性能
select_related通过多表join关联查询,⼀次性获得所有数据,只执⾏⼀次SQL查询
prefetch_related分别查询每个表,然后根据它们之间的关系进⾏处理,执⾏两次查询
filter和exclude的区别?
两者取到的值都是QuerySet对象,filter选择满⾜条件的,exclude:排除满⾜条件的.
列举django orm中三种能写sql语句的⽅法
1.使⽤execute执⾏⾃定义的SQL
直接执⾏SQL语句(类似于pymysql的⽤法)
# 更⾼灵活度的⽅式执⾏原⽣SQL语句
from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;")
ret = cursor.fetchall()
print(ret)
2.使⽤extra⽅法:queryset.extra(select={"key": "原⽣的SQL语句"})
3.使⽤raw⽅法
1.执⾏原始sql并返回模型
2.依赖model多⽤于查询
values和values_list的区别?
values : queryset类型的列表中是字典
values_list : queryset类型的列表中是元组
cookie和session的区别:
cookie:
cookie是保存在浏览器端的键值对,可以⽤来做⽤户认证
.session:
将⽤户的会话信息保存在服务端,key值是随机产⽣的字符串,value值是session的内容
依赖于cookie将每个⽤户的随机字符串保存到⽤户浏览器上
Django中session默认保存在数据库中:django_session表
flask,session默认将加密的数据写在⽤户的cookie中
如何使⽤django orm批量创建数据?
objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)]
models.Book.objects.bulk_create(objs
django的Form组件中,如果字段中包含choices参数,请使⽤两种⽅式实现数据源实时更新1.重写构造函数
def__init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")
2.利⽤ModelChoiceField字段,参数为queryset对象
authors = form_model.ModelMultipleChoiceField(queryset=models.NNewType.objects.all())//多选
 django的Model中的ForeignKey字段中的on_delete参数有什么作⽤?
删除关联表中的数据时,当前表与其关联的field的操作
django2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常
django的模板中⾃定义filter和simple_tag的区别?
⾃定义filter:{{ 参数1|filter函数名:参数2 }}
1. 1.可以与if标签来连⽤
2. 2.⾃定义时需要写两个形参
例⼦:⾃定义filter
1. 在app01下创建⼀个叫templatetags的Python包
2. 在templatetags的⽂件夹下创建py⽂件 myfilters
3. 在py⽂件中写代码
from django import template
register = template.Library()
@register.filter
def add_sb(value,arg='aaa'):
return"{}_sb_{}".formart(value,arg)
@register.filter(name='sb')
def add_sb(value,arg='aaa'):
return"{}_sb_{}".formart(value,arg)
4. 使⽤⾃定义filter
{% load myfilters %}
{{ name|add_sb:'xxx'}}
{{ name|sb:'xxx'}}
simple_tag:{% simple_tag函数名参数1 参数2 %}
1.可以传多个参数,没有限制
2.不能与if标签来连⽤
例⼦:⾃定义simpletag
创建
1 、在app01中创建⼀个名字是templatetags的包,
2、在包中创建⼀个py⽂件
3、在py⽂件中导⼊
from django import template
register = template.Library()
4、写函数
@register.simple_tag(name="plus")
return'{}+{}+{}'.format(a,b,c)
5、加装饰器@register.simple_tag(name="plus")
使⽤
1、导⼊
{% load mytag %}
2、使⽤
{% plus 1 2 3 %}
django中csrf的实现机制
第⼀步:django第⼀次响应来⾃某个客户端的请求时,后端随机产⽣⼀个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页⾯;
第⼆步:下次前端需要发起请求(⽐如发帖)的时候把这个token值加⼊到请求数据或者头信息中,⼀起传给后端;Cookies:{csrftoken:xxxxx}
第三步:后端校验前端请求带过来的token和SESSION⾥的token是否⼀致。

基于django使⽤ajax发送post请求时,都可以使⽤哪种⽅法携带csrf token?
1.后端将csrftoken传到前端,发送post请求时携带这个值发送
2.获取form中隐藏标签的csrftoken值,加⼊到请求数据中传给后端
data: {
csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
},
3.cookie中存在csrftoken,将csrftoken值放到请求头中
headers:{ "X-CSRFtoken":$.cookie("csrftoken")}
Django本⾝提供了runserver,为什么不能⽤来部署?(runserver与uWSGI的区别)
1.runserver⽅法是调试 Django 时经常⽤到的运⾏⽅式,它使⽤Django⾃带的
WSGI Server 运⾏,主要在测试和开发中使⽤,并且 runserver 开启的⽅式也是单进程。

2.uWSGI是⼀个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。

注意uwsgi是⼀种通信协议,⽽uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。

uWSGI具有
超快的性能、低内存占⽤和多app管理等优点,并且搭配着Nginx就是⼀个⽣产环境了,能够将⽤户访问请求与应⽤ app 隔离开,实现真正的部署。

相⽐来讲,⽀持的并发量更⾼,⽅便管理多进程,发挥多核的优势,提升性能。

Django如何实现websocket?
django实现websocket官⽅推荐⼤家使⽤channels。

channels通过升级http协议升级到websocket协议。

保证实时通讯。

也就是说,我们完全可以⽤channels实现我们的即时通讯。

⽽不是使⽤长轮询和计时器⽅式来保证伪实时通讯。

他通过改造django框架,使django既⽀持http协议⼜⽀持websocket协议。

官⽅⽂档地址:
django orm 中如何设置读写分离?
1. 增加slave数据库的配置
2. 创建数据库读写路由
3. .配置数据库读写路由
F和Q的作⽤?
F:主要⽤来对字段的值进⾏四则计算。

Q:⽤来进⾏复杂查询,实现"与"、"或"、"⾮"查询。

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对象删除后,⾃动触发
# 使⽤
@receiver(post_save, sender=Myclass) # 信号接收装饰器。

由于内置信号,所以直接接收
def signal_handler(sender, **kwargs): # 接收到信号后,在此处理
logger = logging.getLogger()
logger.success('保存成功')
Django 如何设置缓存
Django 的缓存配置是通过setting⽂件的CACHES配置来实现的。

本⽂仅以数据库缓存为例,其他配置⽅式请参考。

CACHES = {
'default': {
# 使⽤数据库缓存
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
# ⽤于保存缓存数据的表的名字
'LOCATION': 'my_cache_table',
}
}
然后运⾏这个命令来创建缓存表:
python manage.py createcachetable
解释ORM中 db first 和 code first的含义?
db first: 先创建库,再更新表
code first:先创建表,再更新库
django中如何根据数据库表⽣成model中的类?
python3 manage.py inspectdb
2、将模型⽂件导⼊到app当中
创建app
python3 manage.py startapp 'app名字'
将模型导⼊创建的app中
python3 manage.py inspectdb > app名字/models.py
使⽤orm和原⽣sql的优缺点?
优点
⽅便的使⽤⾯向对象,语句清晰
防注⼊『这个其实不算ORM的核⼼,因为⽐如Phalcon的SQL形式写法也可以防注⼊』
⽅便动态构造语句,对于不同的表的相同操作采⽤多态实现更优雅
⼀定程度⽅便重构数据层『⽐如改表名,字段名等』
设置钩⼦函数
缺点
不太容易处理复杂查询语句
性能较直接⽤SQL差
django的contenttype组件的作⽤?
contenttypes 是Django内置的⼀个应⽤,可以追踪项⽬中所有app和model的对应关系,并记录在ContentType表中。

每当我们创建了新的model并执⾏数据库迁移后,ContentType表中就会⾃动新增⼀条记录。

Restful是什么? 
REST是英⽂representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的⼀种架构风格;使⽤HTTP,URI,XML,JSON,HTML等⼴泛流⾏的标准和协议;轻量级,跨平台,跨语⾔的架构设计;它是⼀种设计风格,不是⼀种标准,是⼀种思想.
什么是RPC
RPC(Remote Procedure Call)远程过程调⽤,简单的理解是⼀个节点请求另⼀个节点提供的服务
Http和Https的区别?
HTTP协议传输的数据都是未加密的,也就是明⽂的,因此使⽤HTTP协议传输隐私信息⾮常不安全,为了保证这些隐私数据能加密传输,于是⽹景公司设计了SSL(Secure Sockets Layer)协议⽤于对HTTP协议传输的数据进⾏加密,从⽽就诞⽣了HTTPS。

简单来说,HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议,要⽐http协议安全。

HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,⼀般免费证书较少,因⽽需要⼀定费⽤。

2、http是超⽂本传输协议,信息是明⽂传输,https则是具有安全性的ssl加密传输协议。

3、http和https使⽤的是完全不同的连接⽅式,⽤的端⼝也不⼀样,前者是80,后者是443。

4、http的连接很简单,是⽆状态的;HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议,⽐http协议安全
django rest framework框架中都有那些组件?
1.序列化组件:serializers 对queryset序列化以及对请求数据格式校验
2.路由组件routers 进⾏路由分发
3.视图组件ModelViewSet 帮助开发者提供了⼀些类,并在类中提供了多个⽅法
4.认证组件写⼀个类并注册到认证类(authentication_classes),在类的的authticate⽅法中编写认证逻
5.权限组件写⼀个类并注册到权限类(permission_classes),在类的的has_permission⽅法中编写认证逻辑。

6.频率限制写⼀个类并注册到频率类(throttle_classes),在类的的allow_request/wait ⽅法中编写认证逻辑
7.解析器选择对数据解析的类,在解析器类中注册(parser_classes)
8.渲染器定义数据如何渲染到到页⾯上,在渲染器类中注册(renderer_classes)
9.分页对获取到的数据进⾏分页处理, pagination_class
10.版本版本控制⽤来在不同的客户端使⽤不同的⾏为
在url中设置version参数,⽤户请求时候传⼊参数。

在request.version中获取版本,根据版本不同做不同处理
django rest framework框架中的视图都可以继承哪些类?
1)APIView
2)GenericAPIView
ListModelMixin
CreateModelMixin
RetrieveModelMixin
UpdateModelMixin
DestroyModelMixin
简述 django rest framework框架的认证流程。

1:APIView 中指定认证类:
authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
2:看源码,找api_settings,在rest_framework\settings 中,指定默认的认证类
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication'
],
3:在 BasicAuthentication.authenticate(),进⾏认证,继承重写这个⽅法即可
django rest framework如何实现的⽤户访问频率控制?
1:APIView 中指定认证类:
authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
2:看源码,找api_settings,在rest_framework\settings 中,指定默认的认证类
'DEFAULT_THROTTLE_CLASSES': [],
3:直接⾃定义频率类
import time
VISIT_RECORD = {}
class MyThrottle(object):
"""⼀分钟允许访问5次"""
def__init__(self):
self.history = []
def allow_request(self,request,view):
#获取IP地址
ip = request.META.get("REMOTE_ADDR","")
if ip not in VISIT_RECORD:
VISIT_RECORD[ip] = [time.time(),]
else:
history = VISIT_RECORD[ip]
self.history = history
history.insert(0,time.time())
#确定列表时间是允许的范围之内
while self.history[0] - self.history[-1] >60:
self.history.pop()
#判断列表的长度
if not len(self.history) <= 5:
return False
return True
#等待时间
#[最近时间最⽼的时间]
def wait(self):
return 60 - (self.history[0]-self.history[-1])
View Code
Flask框架的优势
只提供了⼀些核⼼功能,⾮常简洁优雅。

它是⼀个微框架,其他的由扩展提供,但它的blueprint使它也能够很⽅便的进⾏⽔平扩展。

Flask框架依赖组件?
Route(路由)
templates(模板)
Models(orm模型)
blueprint(蓝图)
Jinja2模板引擎
Flask蓝图的作⽤?
蓝图Blueprint实现模块化的应⽤
book_bp = Blueprint(‘book’, name)创建蓝图对象
蓝图中使⽤路由@book_bp.route(‘url’)
在另⼀.py⽂件⾥导⼊和注册蓝图
from book import book_bp app.register_blueprint(book_bp)
作⽤
将不同的功能模块化
构建⼤型应⽤
优化项⽬结构
增强可读性,易于维护(跟Django的view功能相似)
列举使⽤过的Flask第三⽅组件?
flask_bootstrap
flask-WTF
flask_sqlalchemy
简述Flask上下⽂管理流程?
每次有请求过来的时候,flask 会先创建当前线程或者进程需要处理的两个重要上下⽂对象,把它们保存到隔离的栈⾥⾯,这样视图函数进⾏处理的时候就能直接从栈上获取这些信息。

Flask中的g的作⽤?
在⼀次请求的周期,可以在g中设置值,在本次的请求周期中都可以读取或复制。

相当于是⼀次请求周期的全局变量,也可以理解为是⼀个存放全局变量的空间或者类
Flask中上下⽂管理主要涉及到了那些相关的类?并描述类主要作⽤?
AppContext #封装app_ctx
LocalStack #将local对象中的数据维护成⼀个栈(先进后出)
Local #保存请求上下⽂对象和app上下⽂对象。

相关文档
最新文档