面试问题总结

一、WebSocket相关问题

1、client发送请求,请求头携带Sec-WebSocket-Key
2、server收到请求,解析请求头部信息,拿到Sec-WebSocket-Key
3、服务器端将magic_string(258EAFA5-E914-47DA-95CA-C5AB0DC85B11) 和 Sec-WebSocket-Key 进行sha-1加密,将hash结果进行base64编码
4、将编码结果放在响应头部Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=,返回给客户端,连接完成
请简单说明一下WebSocket的握手过程
1、Tornado的Controller匹配到响应的请求url,将其转发给处理的Handler,比如ChatHandler
2、ChatHandler需要继承tornado.websocket.WebSocketHandler
3、ChatHandler必须实现
open方法:客户端连接成功,需要执行的方法
on_message方法:客户端向服务端发送消息,执行的方法
on_close方法:客户端关闭时,执行的方法
Tornado如何处理WebSocket

二、能简单说说线程、进程和协程吗?

    1、线程:最小的调度单位

  2、协程:用户自定义的线程切换

  3、进程:

三、Http和Https的区别?

三、对于TCP/IP协议熟悉吗?三次握手,四次挥手?能简单说一下七层模型吗?

TCP/IP协议,是网络通信协议,又称传输控制协议/因特网互联协议。定义了电子设备如何连入互联网,以及数据如何在互联网相互传输的标准。

所谓三次握手就是建立TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
  (2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  (3)第三次握手:Client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK置为1,ack=K+1,并将该数据包发送给Server,Server检查ack是否为K+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。
三次握手详细

所谓四次挥手,就是指断开一个TCP连接时,客户端和服务器总共发送4个包来确认连接的断开。

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭,上图描述的即是如此。
 (1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  (2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
 (3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  (4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手。
四次挥手

七层模型,即OSI(Open System Interconnect),开放式系统互联

三、能简单说一下你了解的socket吗?

四、Python的GIL(全局解释器锁)

四、Python的with语句?优点?如何实现?

四、Python的单例模式?

四、Python垃圾回收机制?

四、Python的生成器和迭代器?

四、python的装饰器?

四、Python的with语句的使用?

四、Python函数中经常有 *args,**kwargs 这两个参数,它们是什么意思,为什么要使用它们?

四、Django的请求生命周期

用户请求到来 ,通过url进行(自上而下)的路由匹配, 匹配成功则映射到对应视图。
通过业务逻辑的处理(数据库...), 经模板渲染继而响应给用户内容

四、Django的中间件做什么?

中间件是用来处理请求和响应的插件机制,全局地处理Django的请求和响应。每个中间件都有特定功能。MiddleWare的需要在settings里面进行配置,按顺序配置上对应类的在Python中全路径。MiddleWare一般都是MiddlewareMixin的子类。通常实现process_request方法和process_response方法。
process_request是在请求来临时,尚未正则匹配前执行的函数。如果这个函数没有返回值,或者返回为None,会继续执行其他中间件的process_request方法。如果返回HttpResponse,Django将不会执行后序的中间件和views函数,直接将response返回。
process_view函数是在获取到要执行的view函数和相应参数,在view函数执行之前执行的函数。也是可以返回None或HttpResponse。
process_response是在执行完view函数,并生成response之后,执行的函数。可以对response做进一步的处理。必须返回HttpResponse对象。

四、Django的ORM怎么获取到一个name字段总数据有没有“abc”,ORM操作

四、form验证?

五、说一下线程锁,什么时候用?

六、描述你怎么用的tornado?

七、Tornado怎么做到异步的?

八、Scrapy了解多少?

八、爬虫的数据入库操作,线程需要加锁吗?

八、Mysql的优化?

九、了解装饰器吗?可以用来做什么?有什么优缺点?

十、使用过epoll?能聊聊IO多路复用吗?

原文地址:https://www.cnblogs.com/skiler/p/6952707.html