面试知识点整理1
1、django请求生命周期
2、什么是wsgi
web服务器网关接口,它的作用就是在协议之间进行转换。更多详细信息
PythonWeb服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接 口,是一种协议,实现该协议的模块有uwsgi、wsgiref和werkzeug,这些模块本质上就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)。
3、FBV和CBV本质是一样的,没有优劣之分,可根据不同的需求来使用。
4、RESTFul规范
5、什么是接口?
URL或者Java中的引用数据类型(interface)
6、rest framework框架(10大组件)&& 谈谈你对 django rest framework框架的认识?
-- 路由
可以通过as_view传参数,根据请求方式不同执行相应的方法
-- 视图
帮助开发者提供了一些类,并在类中提供了多个方法以供我们使用
-- 版本
在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同做不同处理
-- 认证
写一个类并注册到认证类,在类的的authticate方法中编写认证逻辑
认证成功(user, auth)
认证失败(raise exceptions.AuthenticationFailed({"code": 200, "error": "用户身份认证失败!"}))
-- 权限
写一个类并注册到权限类,在类的的has_permission方法中编写认证逻辑,返回True或False
-- 频率限制
写一个类并注册到频率类,在类的的 allow_request/wait 方法中编写认证逻辑
allow_request返回True或False,如果返回False,那么就要执行wait
-- 解析器
根据ContentType请求头,选择不同解析器对请求体中的数据进行解析
-- 分页
对从数据库中获取到的数据进行分页处理;更多
问题:为什么页码越大速度越慢,以及如何解决?
原因:页码越大向后需要扫描的行数越多,因为每次都是从0开始扫描。
解决:①限制显示的页数②记录当前页数据ID最大值和最小值,再次分页时,根据ID现行筛选,然后再分页。
-- 序列化
对queryset序列化以及对请求数据格式校验
-- 渲染器
根据URL中传入的后缀,决定数据如何渲染到到页面上。
-- 面试题:你写的视图类都继承过哪些类?
class View(object): class APIView(View): class GenericAPIView(views.APIView): class GenericViewSet(ViewSetMixin, GenericAPIVie): class ModelViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, GenericViewSet):
7、为什么会出现跨域问题?
跨域:指从一个域名的网页去请求另一个域名的资源。
浏览器出于安全的考虑,不允许不同源的请求:
因为浏览器的同源策略的限制,从一个域上加载的脚本不允许访问另外一个域的文档属性。
同源策略:
同源策略:不同的域名、不同端口、不同的协议不允许共享资源,保障浏览器安。所谓同源是指,域名、端口、协议相同。现在所有支持JS的浏览器都会使用这个策略。
处理方法:
1.jsonp 跨域(只有get请求)
同源策略会阻止ajax请求;但不阻止具有src属性的标签,所以动态创建script标签即可。jsonp原理:通过script标签的跨域特性来绕过同源策略。
具体操作:我们创建一个 script 标签,请求页面中的数据,同时传入一个回调函数的名字。服务器端得到名字后,拼接函数执行格式的字符串。发送回浏览器。script 在下载代码以后并执行, 执行的就是这个函数调用形式的字符串,因此就将本地函数调用了,同时拿到了从服务器端得到的数据。
2.CORS跨域
非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。 非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。 "预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。 浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复, 浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
JSONP与CORS比较:
- JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。
-
使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。
-
JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS。
8、面试题:JS作用域等问题,点击查看
9、你理解的Http协议?
-- 建立在tcp之上
-- 一次请求一次响应然后断开连接(无状态、短连接)
-- 请求和响应:
请求:请求头\r\n\r\n请求体
响应:响应头\r\n\r\n响应体
我之前在学习django框架的时候,是从socket服务端开始学起。自己创造了一个socket服务器来充当网站,浏览器当socket客户端,使我更清楚的明白了http协议是什么。
# 常见的请求头: Content-Type 原则上浏览器会根据Content-Type来决定显示返回的消息体内容的格式 User-Agent 告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本 referer 提供了Request的上下文信息的服务器,告诉服务器我是从哪个链接过来的,可以做图片防盗链 Host 请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来 cookie 最重要的请求头,将cookie的值发送给HTTP服务器 # 常见的状态码: 200 # 请求成功 302 # 重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request 304 # 代表上次的文档已经被缓存了, 还可以继续使用 400 # 客户端请求与语法错误,不能被服务器所理解 403 # 服务器收到请求,但是拒绝提供服务,比如没有找到cookie 404 # 请求资源不存在(输错了URL) 500 # 服务器发生了不可预期的错误 503 # 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 # 常见的请求方法: GET/POST/DELETE/PUT/PATCH/OPTIONS # 常见的请求体: Form表单提交: POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=pd&password=123&... Ajax请求: POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=pd&password=123&... POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\n{"username":"pd","password":123} # 补充:django中获取请求体 request.POST request.body
10、中间件
中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。
每个中间件组件都负责做一些特定的功能;说的直白一点中间件是帮助我们在视图函数执行之前和执行之后做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。
# 中间件的5个方法 process_request(self,request) process_view(self, request, view_func, view_args, view_kwargs) process_exception(self, request, exception) process_template_response(self,request,response) process_response(self, request, response)
面试题:你使用中间件做过什么?
# 内置 csrf、session # 自定义中间件 登录认证:不再需要在每个函数中添加装饰器 权限认证:当用户登录时候获取当前用户所有权限并放入session,然后用户再次访问其他页面,获取当前url并在session中进行匹配。如果没有匹配成功,则在中间件返回"无权访问"
11、如何实现的访问频率控制?
使用IP或者用户账号作为键,每次的登陆时间戳作为值,构造一个字典形式的数据存起来,每次登陆时把时间戳列表的元素进行判断,把超时的删掉,再计算列表剩余的元素数就能做到频率限制了。
匿名用户:使用IP控制,但是无法完全控制,因为用户可以代理IP
登录用户:使用账号控制,但是如果有很多账号,也无法限制
12、django组件:contenttype的作用
13、原生AJAX,使用XMLHttpRequest对象实现
14、ORM相关(重要),看博客
15、支付宝支付相关(重新学一遍)
16、git rebase的作用?
保持提交记录的整洁。更多内容
17、使用git时,如果代码出现bug,你们是如何解决的?
创建一个bug分支进行bug处理,处理完毕后,合并到master分支;然后删除bug分支;最后回到dev分支继续开发。
18、redis是什么?
用于操作内存的软件。
- 相当于是大字典 - 单进程单线程 - 5大数据类型 字符串 列表 字典 集合 有序集合
数据存储模式有2种:cache-only和persistence
- cache-only即只做为"缓存"服务,不持久数据,数据在服务终止后消失,此模式下也将不存在"数据恢复"的手段,是一种安全性低、效率高、容易扩展的方式;
-
persistence即为内存中的数据持久备份到磁盘文件,在服务重启后可以恢复,此模式下数据相对安全。
对于persistence持久化存储,Redis提供了两种持久化方法:
# Redis DataBase(简称RDB) RDB是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。 优点: 使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能。 缺点: RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候。 # Append-only file (简称AOF) Append-only file,将"操作 + 数据"以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,"日志文件"保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。AOF相对可靠,它和mysql中bin.log、apache.log、zookeeper中txn-log简直异曲同工。AOF文件内容是字符串,非常容易阅读和解析。 优点: 可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且如果日志写入不完整,将支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的flushall)。 缺点: AOF文件比RDB文件大,且恢复速度慢。
19、redis中使用连接池
本质,维护一个已经和服务端连接成功的socket。以后再次发送数据时,直接获取一个socket,直接send数据。查看更多
20、代码review
如何做代码review?
创建review分支
谁来做代码review?
组长或者带你的人
21、怎么在github上给别人修改代码?
- fork:先fork下别人的代码,于是你的github上就出现了同名的项目,这个项目就属于你自己了,你把这个自己的项目git clone到本地,修修改改,然后push到你自己的项目里;
- pull request:在github上你的项目页面有个按钮,叫pull request,对,你点它就会把你的修改发到对方的项目里,别人会收到邮件,由原项目主人决定是否接受你的修改。
22、如何在django中使用redis?
2.使用第三方组件
23、关于微信消息推送(重新学一遍)
24、osi七层协议
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层

每层运行常见物理设备:
传输层:四层交换机、四层路由器
网络层:路由器和三层交换机
数据链路层:网桥、以太网交换机、网卡
物理层:中继器、集线器和双绞线
每层运行常见的协议:
传输层:TCP和UDP协议
网络层:IP协议
数据链路层:arp协议
25、理解socket
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
其实socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。
26、TCP协议和UDP协议(点击查看)
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
27、理解TCP协议中的三次握手和四次挥手
建立连接的三次握手:
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK[1],并最终对对方的 SYN 执行 ACK确认。这种建立连接的方法可以防止产生错误的连接。
TCP三次握手的过程如下:
- 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
- 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
- 三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。

首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
断开连接的四次挥手:
假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

28、TCP协议中为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
29、TCP协议中在断开连接时,为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。
30、接口的幂等性?(是否会造成2次伤害)
一个接口通过1次相同的访问,再对该接口进行N次相同的访问时候,对资源不造影响,那么就认为接口具有幂等性。
GET 第一次获取结果,第二次也是获取结果对资源都不会造成影响,幂等。
POSt 第一次新增数据,第二次也会再次新增,非幂等。
PUT 第一次更新数据,第二次不会再次更新,幂等。
PATCH 第一次更新数据,第二次不会再次更新,非幂等。
DELTE 第一次删除数据,第二次不在再删除,幂等。
31、Https与Http的区别?
- https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
- http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
32、路飞学成相关
购物车购买数量有限制吗?
有,防止有人恶意破坏,把大量商品加入购物车不购买,占用redis的负担
购物车是否设置超时时间?
可以设置,也可以不设置,其实只设置一下购物车购买数量即可。
为什么把购物车信息放入redis?
- 购物车的操作只是个临时状态,不需要放入数据库;
- 需要频繁对购物车进行修改,放入redis的话操作速度快。
为什么要开发这个项目?
a.提高在线教育的完课率(学成率)
b.项目的具体内容有:
- 课程分两种,学位课和专题课
- 购买课程时,可以选择不同的价格策略来进行学习
- 闯关式学习,对于学位课来说,我们不会一次性把全部课程的视频给学员,会进行闯关式学习,只有当当前阶段通过导师测试后,学员才有资格进行下一步的学习导师筛选,我们对导师会有很严格的筛选,只有通过我们的严格考核,才有资格做我们的导师导师监督,人都有惰性心理,所以我们会对我们导师有严格的要求,导师必须对学员负责,每天都要有跟进记录不管是电话还是QQ、微信,都要有记录上传系统,这些都会和他们的奖惩关联
- 导师答疑时间,不同的课程,不同的价位,会有不同的答疑时间限制,在规定时间内,导师必须给学员进行回复
- 报名时学员有权利选择导师,在学习期间,学员也有权利提出更换导师
- 奖惩措施,对于导师来说,每一个导师带领一个学员时,我们都会给导师账户存入一定的奖金,直到学员毕业后才能提现,在学员学习期间,如果导师有不负责现象,我们会做出相应的惩罚措施,做一定扣除奖金机制;对于学员来说,学员能够按时或者提前在规定时间内学习完一个模块,作业和测试成绩优异的话,我们会给一定的奖励。
这个项目的开发周期和团队构成?
周期:初期开发到上线时间是大约四个月,之后一直在做网站的维护,bug的处理,开展一些活动,广告之类的,还有一些小功能的开发
团队构成:
开发
导师后台:stark组件和rbac 大约需要1人
管理后台:stark组件和rbac 大约需要1人
主站:
vue.j 大约需要1人
api接口 3个人,组长偶尔会负责一些,不算是整个人力
运维(1人)
测试(1人)
产品经理(1人)
UI设计(1人)
运营(1人)
销售(5人)
购买课程流程?
- 加入购物车
- 去结算中心
- 去支付
路飞的主站业务?
课程:
课程列表
课程详细
课程大纲、导师、推荐课程
价格策略
加入购物车
课程章节和课时
常见问题
评论
深科技:
文章列表
文章详细
收藏
点赞
评论
推荐其他优秀文章
支付:
购物车
结算中心
立即支付
知识点:
redis
支付宝支付
微信消息推送
构建数据结构
优惠券+贝里+支付宝支付
个人中心
课程中心
播放视频?
cc视频
33、Django、Flask和Tornado区别?
Django:简单的说Django是一个大而全的Web框架,内置了很多组件,ORM、admin、Form、ModelForm、中间件、信号和缓存等。基于wsgi协议部署的,使用wsgiref模块实现此协议。
Flask:微型的小而精的Web框架,可扩展性强,内置的组件很少,需要引入第三方组件实现功能业务,如果开发简单的项目,使用Flask比较快速和方便。如果开发大型项目,需要引入大量的第三方组件,这时Flask会越来越像Django框架。基于wsgi协议部署,使用werkzeug模块实现此协议,模板系统由 Jinja2提供。
Tornado:是一个轻量级的Web框架,可扩展性强,内置WebSocket功能,用于快速开发强大的异步非阻塞程序。
34、Flask知识点?
34、threading.local
作用:为每个线程创建一个独立的空间,使得线程对自己空间中的数据进行操作(数据隔离)。
应用:DBUtils 中为每个线程创建一个数据库连接。注意:Flask中并没有使用 threading.local ,而是使用了LocalStack,细化到了协程。
35、在类中什么是函数,什么是方法?
class Foo(object): def func(self): pass obj = Foo() # 执行方式一 obj.func() # 方法 # 执行方式二 Foo.func() # 函数
36、什么是响应式布局?
简而言之,就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本。这个概念是为解决移动互联网浏览而诞生的。
优点:
- 面对不同分辨率设备灵活性强
- 能够快捷解决多设备显示适应问题
缺点:
- 兼容各种设备工作量大,效率低下
- 代码累赘,会出现隐藏无用的元素,加载时间加长
- 其实这是一种折中性质的设计解决方案,多方面因素影响而达不到最佳效果
- 一定程度上改变了网站原有的布局结构,会出现用户混淆的情况
原理:使用了媒介查询:@media属性
48、MySQL 数据库的引擎
1.Innodb引擎
- 支持事务
- 支持锁
- 行锁和表锁:但是当SQL语句没有指定要锁定的具体行范围的话,Innodb 也会锁全表。
- 支持外键约束
2.MyIASM引擎
- MyIASM是MySQL默认的引擎,不支持事务,也不支持行级锁和外键,只支持表级锁。
两种引擎的比较:
大尺寸的数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题。大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是Update语句在InnoDB下则会更快一些,尤其是在并发量大的时候。
49、MySQL 数据库的索引
索引作用:加速查找+约束。
索引种类:
- 主键索引:加速查找、不重复、非空
- 唯一索引:加速查找、不重复
- 普通索引:加速查找
- 联合索引:加速查找
- 联合唯一索引:加速查找、不重复
- PS:联合索引遵循最左前缀原则。
id name pwd email # 数据表中有上面4个字段,如果把 name pwd email 设成联合索引,只有下面的情况能命中索引: select * from tb where name='x' select * from tb where name='x' and pwd='123' select * from tb where name='x' and email='123@qq.com' select * from tb where name='x' and pwd='123' and email='xs' # 当下面两种情况的时候不会命中索引 select * from tb where pwd='123' select * from tb where pwd='123' and email='123@qq.com'
覆盖索引:在索引文件中就可以把想要的数据得到。MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,包函所有满足查询需要的数据的索引称为覆盖索引。
注意:如果使用覆盖索引,一定要注意select列表中只取出需要的列,不可select * ,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。
索引合并:使用多个单列索引去查找数据。
- 索引合并是把几个索引的范围扫描合并成一个索引。
- 索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引。
- 这些需要合并的索引只能是一个表的。不能对多表进行索引合并。
创建索引,但无法命中索引:点击查看
mysql数据库授权:点击查看
50、MySQL 数据库视图
视图是一种虚拟存在的表。其内容与真实的表相似,包含一系列带有名称的列和行数据。但是视图并不在数据库中以存储的数据的形式存在。行和列的数据来自定义视图时查询所引用的基本表,并且在具体引用视图时动态生成。
视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。
51、MySQL触发器
MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。在对某张表进行:增、删、改的前后自定义操作。
52、MySQL函数、点击查看
53、MySQL存储过程
存储过程简介:
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟,它允许控制数据的访问方式。
存储过程的优点:
- 增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
- 标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
- 较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
- 减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。
- 作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。
54、类的私有化Vue:
一般情况下,类的私有化对象是不能调用的,如果想调用,就要写成这种形式的。
class Foo(object): def __init__(self, name, age): self.name = name self.__age = age def func(self): print(self.__age) # 一定能使用 obj = Foo('pd', 18) print(obj._Foo__age) # 对象调用类的私有属性的方法(不建议使用) obj.func() # 建议使用 # 注意:私有化,在子类父类之间是不能互相调用的
55、Vue
用户登录
this.$axios
this.$qs
vue-cookies 保持用户登录状态
vuex
做全局变量
某个页面需要登录才能查看
拦截器
登录成功后,携带token访问
PS: api统一放在store中保存
56、REST ful 用到知识
在 REST ful 序列化用到了new方法,如果mang=True,返回的是ListSerializer对象对它进行序列化,如果many=Fales,当前类对它进行序列化。
在 REST ful 中权限组件等使用了列表生成式。

浙公网安备 33010602011771号