第一部分 Python基础篇
1. 为什什么学习Python?
2. 通过什什么途径学习的Python?
3. Python和Java、PHP、C、C#、C++等其他语⾔言的对比?
python是一门解释型(程序运行时一行一行的解释,并运行),动态类型(在程序执行过程中,可以改变变量的类型)的语言,他的语法比较优美,没有那么多的{}的嵌套,而是使用了缩进
4. 简述解释型和编译型编程语言?
编译型 : 先编译再执行, 优点执行速度快 解释型 : 逐行解释并运行 , 易于调试
5. Python解释器器种类以及特点?
CPython # CPython 是默认的python实现,是用C语言写的,当执行代码的时候Pythond代码会被转化成字节码(bytecode)。 PyPy *PyPy * 是一个很多地方都和CPython很像的实现,但是这个解释器本身就是由Python写成。 Jython Jython是用java实现的一个解释器。Jython允许程序员写 Python代码,还可以把java的模块加载在python的模块中使用。
6. 位和字节的关系?
1字节=8位(二进制)
7. b、B、KB、MB、GB 的关系?
1B(byte字节) =8b(比特位) 1KB = 1024B 1MB = 1024KB 1GB = 1024MB
8. 请至少列举5个 PEP8 规范(越多越好)。
9. 通过代码实现如下转换:
- ⼆进制转换成⼗十进制:v = “0b1111011”
- 十进制转换成二进制:v = 18
- 八进制转换成⼗十进制:v = “011”
- 十进制转换成⼋八进制:v = 30
- 十六进制转换成⼗十进制:v = “0x12”
- 十进制转换成⼗十六进制:v = 87
v = '0b1111011' a = int(v,2) print(a) v = 18 a = bin(18) print(a) v = '011' a = int(v,8) print(a) v = 30 a = oct(v) print(a) v = '0x12' a = int(v,16) print(a) v = 87 a = hex(v) print(a)
10. 如 10.3.9.12 转换规则为:
- 10 00001010
- 3 00000011
- 9 00001001
- 12 00001100
再将以上⼆进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
def bian(nubmer): a = str(bin(nubmer))[2:] if len(a) % 8: b = ['0' for _ in range(8-len(a)%8)] b.append(a) return ''.join(b) a = bian(10) b = bian(10) c = bian(10) d = bian(10) d = int(a+b+c+d,2) print(d)
11. python递归的最大层数?
998 import sys sys.setrecursionlimit(1000000)
12. 求结果:
- v1 = 1 or 3
- v2 = 1 and 3
- v3 = 0 and 2 and 1
- v4 = 0 and 2 or 1
- v5 = 0 and 2 or 1 or 4
- v6 = 0 or Flase and 1
and 和 or 的短路运算 and : 前面为真返回后面的,前面为假直接返回前面的 or : 前面为真返回前面的,前面为假返回后面的 1 3 0 1 1 False
13. ascii、unicode、utf-8、gbk 区别?
ascii : 早期编码,只支持英文字母和一些符号 unicode : 万国码,能表示多种符号,在py2中可以指定4字节或二字节表示一个字符,py3中默认4字节 utf-8 : 用最短的方式表示unicode , 一个英文字符占一字节 gbk : 中文编码
14. 字节码和机器器码的区别?
机器码(machine code),学名机器语言指令,有时也被称为原生码(Native Code),是电脑的CPU可直接解读的数据 字节码(Bytecode)是一种包含执行程序、由一序列 op 代码/数据对 组成的二进制文件。字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。 通常情况下它是已经经过编译,但与特定机器码无关。字节码通常不像源码一样可以让人阅读,而是编码后的数值常量、引用、指令等构成的序列
15. 三元运算规则以及应用场景?
条件为真返回值 if 条件 else 条件为假返回值 # 用于简单的if-else判断,比如在lambda表达式中
16. 列举 Python2和Python3的区别?
# py2中bytes就是str,他还有一个专属的unicode类型,其解释器默认的编码方式是ascii # py3中str是unicode,bytes是编码后的字节,实际上传输的就是bytes,其解释器默认的编码方式是utf-8 # print语句被python3废弃,统一使用print函数 # exec语句被python3废弃,统一使用exec函数 # execfile语句被Python3废弃,推荐使用exec(open("./filename").read()) # 不相等操作符"<>"被Python3废弃,统一使用"!=" # long整数类型被Python3废弃,统一使用int #xrange函数被Python3废弃,统一使用range,Python3中range的机制也进行修改并提高了大数据集生成效率
17. 用一行代码实现数值交换:
- a = 1
- b = 2
a ,b = b ,a
20. 文件操作时:xreadlines和readlines的区别?
file.readlines()返回列表,另一个返回生成器,不过文件句柄本身就是可迭代的
21. 列举布尔值为False的常见值?
0 以及长度为0的内置对象
22. 字符串、列表、元组、字典每个常用的5个方法?
23. lambda表达式格式以及应用场景?
lambda 参数: 返回值 简单的函数,一般用作一些函数的key(max,min,map,filter)
24. pass的作用?
pass是空语句,是为了保持程序结构的完整性。 pass 不做任何事情,一般用做占位语句。
25. *arg和**kwarg作用
*arg # 接收额外的位置参数 **kwarg # 接收额外的关键字参数
26. is和==的区别
is # 比较内存地址 == # 比较值
27. 简述Python的深浅拷贝以及应用场景?
对于嵌套的数据结构,浅拷贝只拷贝了外层的不可变数据结构,内部的嵌套类型实际上还是指向的同一地址
28. Python垃圾回收机制?
29. Python的可变类型和不可变类型?
不可变类型 : 基础类型字符串,数字,布尔值,字节.另外还有一个元组 可变类型 : 数据结构列表,字典,集合
30. 求结果:
- v = dict.fromkeys(['k1','k2'],[])
- v[‘k1’].append(666)
- print(v)
- v[‘k1’] = 777
- print(v)
fromkeys使多个键指向同一值,append操作将值添加进列表,使得k1,k2都有了一个值 为k1重新赋值改变了k1的指向
31. 求结果:
6666(i变量被重新赋值)
32. 列举常见的内置函数?
enumertae:枚举,返回索引与值的元组 zip:拉链函数,接收多个可迭代对象,将对象相同索引位置放在一个元组中,返回一个迭代器,返回迭代器中元素个数由最短的可迭代对象决定 filter:过滤函数,接收一个函数和一个可迭代对象,生成一个迭代器.将可迭代对象的每一个元素带入函数中,如果返回结果为True,则把元素添加入迭代器中 map:处理函数,接收一个函数和一个可迭代对象,生成一个迭代器,将可迭代对象的每一个元素带入函数中,把返回值添加入迭代器中 callble:判断参数是不是可调用的 dir:查看内置属性和方法的字符串 super:根据__mro__属性去查找方法 isinstance:判断一个对象是不是这个类实例化出来的 iscubclass:判断一个类是不是另一个类的子类,也可以判断两个类是不是相同的类 property:在类中定义一个可控属性
33. filter、map、reduce的作用?
functools.reduce reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算, from functools import reduce reduce(lambda x,y: x+y, [1, 2, 3]) # 6 reduce(lambda x, y: x+y, [1,2,3], 9) # 15
34. 一行代码实现9*9乘法表
for i in range(1,10): for j in range(1,i+1): print('%s*%s=%s'%(j,i,i*j),end=',') print('')
35. 如何安装第三方模块?以及用过哪些第三方模块?
pip 安装 下载源码包 先执行 python setup.py build 然后执行 python setup.py install
36. 至少列举8个常用模块都有那些?
collections : 更多数据类型 os : 系统相关 loggin : 日志相关 re : 正则模块 time : 时间模块 datetime : 也是时间相关 random : 随机数字 sys : 解释器相关
37. re的match和search区别?
match # 匹配开头 search # 匹配头一个
38. 什么是正则的贪婪匹配?
import re content = 'Hello 1234567 World_This is a Regex Demo' result1 = re.match('^He.*(\d+).*Demo$', content) # 贪婪匹配,尽可能多的匹配 result2 = re.match('^He.*?(\d+).*Demo$', content) # 非贪婪匹配,尽可能少的匹配 print(result1.group(1)) # 7 print(result2.group(1)) # 1234567
39. 求结果:
- a. [ i % 2 for i in range(10) ]
- b. ( i % 2 for i in range(10) )
列表与生成器
40. 求结果:
- a. 1 or 2
- b. 1 and 2
- c. 1 < (2==2)
- d. 1 < 2 == 2
1,2,False,True
比较 :
任何两个对象都可以比较 相同类型的对象(实例),如果是数字型(int/float/long/complex),则按照简单的大小来比较;如果是非数字型,且类(型)
中定义了__cmp__(含__gt__,__lt__等)则按照__cmp__来比较,否则按照地址(id)来比较不同类型的对象(实例), 其中一个比较对象是数字型(int/float/long/complex等),则数字型的对象<其它非数字型的对象; 如果两个都是非数字型的对象,则按照类型名的顺序比较,如{} < "abc"(按照"dict" < "str"),而"abc" > [1,2],
"abc" < (1,2)。 对于自定义的类(型)实例,如果继承自基本类型,则按照基本类型的规则比较(1-3)。否则,
old-style class < new-style class, new-style class之间按照类型名顺序比较,old-style class之间按照地址进行比较 bool类型是int的子类,且True=1, False=0,比较时按照1-4来比较,如True > -1, True < 4.2, True < "abc"等
连续比较
连续不等式是python的语法糖,使用得当可以使代码变得简洁,使用不当会降低可读性。题主的代码等同于x = (3<=3 and 3>1),
两个不等式同为真,所以逻辑与为真。
41. def func(a,b=[]) 这种写法有什什么坑?
函数定义时生成默认b的列表,而不是每次调用时生成一个空列表
42. 如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
a = '1,2,3'.rsplit(',') print(a)
43. 如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
a = map(lambda x:int(x),['1', '2', '3']) print(list(a))
44. 比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 c = [(1,),(2,),(3,) ] 的区别?
a,b没有区别其中元素都是数字,c中元素是元祖
45. 如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
a = [i*i for i in range(1,11)] print(a)
46. 一行代码实现删除列列表中重复的值 ?
转为集合
47. 如何在函数中设置一个全局变量 ?
global关键字
48. logging模块的作用?以及应用场景?
记录日志
49. 请用代码简答实现stack 。
Stack():创建一个新的空栈 push(item):添加一个新的元素 item到栈顶 pop():弹出栈顶元素 peek():返回栈顶元素 is_empty():判断栈是否为空 size():返回栈的元素个数 class Stack: def __init__(self): self.items=[] def is_empty(self): return self.items==[] def push(self,item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[len(self.items)-1] def size(self): return len(self.items)
50. 常用字符串串格式化哪几种?
%以及format方法
51. 简述 生成器、迭代器、可迭代对象 以及应用场景?
生成器 : 自己实现的迭代器 迭代器 : 调用next()方法,从中取值,或抛出一个异常.也有__iter__方法 可迭代对象 : 拥有__iter__方法,返回一个迭代器 应用场景 : 处理大量数据时逐个取值
52. 用Python实现一个二分查找的函数。
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def search(zhi,li,start=0,end=None): end = len(li) if end is None else end zj = (end - start) // 2+start if start<=end: if zhi>li[zj]: return search(3,li,start=zj+1,end=end) elif zhi<li[zj]: return search(3,li,start=start,end=zj-1) else: return zj return '找不到这个值' print(search(8,li)
53. 谈谈你对闭包的理理解?
内部函数调用外部函数的变量(非全局)
54. os和sys模块的作用?
os : 系统相关
sys : 解释器相关
55. 如何生成一个随机数?
random模块
56. 如何使用python删除一个文件?
os.remove()
57. 谈谈你对面向对象的理解?
58. Python面向对象中的继承有什么特点?
59. 面向对象深度优先和广度优先是什什么?
执行方法的查找顺序 在经典类中,是深度优先,先把一条线查完(栈,) 在新式类中,广度优先(顺着一条线查,如果还有别的路可以查到一个类,这条路就终止了,换一条线查) python3中都是新式类,在python中如果你创建了一个类,并且该类没有继承任意类,那么他就是一个经典类
60. 面向对象中super的作用?
按照mro的顺序去查找并调用方法
61. 是否使用过functools中的函数?其作用是什什么?
经常使用他的装饰器修复的函数functool.wraps,还有偏函数functools.partial
62. 列举面向对象中带爽下划线的特殊方法,如:__new__、__init__
__str__ : __call__ : __getattr__ : __setattr__ : __enter__ : __exit__ : __getitem__ : __setitem__ : __iter__ :
63. 如何判断是函数还是方法?
调用者是对象就是方法,还可以根据类型来判断MethodType(方法),FunctionType(函数)
64. 静态方法和类方法区别?
静态方法 : 相当于在类作用域下的普通函数,不进行与类或实例相关的操作
类方法 : 由类调用,进行与类有关的操作
65. 列举面向对象中的特殊成员以及应用场景
python面向对象的双下划线方法,看上面就够了
66. 1、2、3、4、5 能组成多少个互不相同且无重复的三位数
5*4*3
67. 什什是反射?以及应用场景?
利用字符串获取对象的属性或方法,WEB框架的CBV,配置文件获取类
68. metaclass作用?以及应用场景?
metaclass是类的产生类,而并非继承类 通过它来控制类的产生,以及类实例化的操作 wtform中实例化自定义form类时执行了其元类的__call__方法,
69. 用尽量多的方法实现单例模式。
# 使用类 class Singleton(object): _instance = None def __new__(cls, *args, **kw): if not cls._instance: cls._instance = super(Singleton, cls).__new__(cls, *args, **kw) return cls._instance # 模块的导入时天然的单例模式 # 使用装饰器 from functools import wraps def singleton(cls): instances = {} @wraps(cls) def getinstance(*args, **kw): if cls not in instances: instances[cls] = cls(*args, **kw) return instances[cls] return getinstance @singleton class MyClass(object): a = 1 # MyClass == getinstance # 使用元类 class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] # Python2 class MyClass(object): __metaclass__ = Singleton # Python3 # class MyClass(metaclass=Singleton): # pass
70. 装饰器的写法以及应用场景。
from functools import wraps def outer(func): @wraps(func) def inner(*args,**kwargs): """我是装饰器里的函数""" func(*args,**kwargs) return inner # Django的csrf,缓存,Flask中的许多装饰器,
71. 异常处理写法以及如何主动跑出异常(应用场景)
try: 执行语句 except 异常类型: 触发异常后执行的语句 else: 没有触发异常执行的语句 findlly: 有没有异常都执行的语句 # 主动抛出异常 raise 异常类实例
72. 什么是面向对象的mro
方法查找的顺序
73. isinstance作用以及应用场景?
判断一个对象是不是某个类的实例
74. 写代码并实现:
- Given an array of integers, return indices of the two numbers such that they add up to a
- specific target.You may assume that each input would have exactly one solution, and you may
- not use the same element twice.
- Example:
- Given nums = [2, 7, 11, 15], target = 9,
- Because nums[0] + nums[1] = 2 + 7 = 9,
- return [0, 1]
for i in range(len(_list)): for j in range(i,len(_list)): if _list[i]+_list[j] ==9: return i,j
75. json序列化时,可以处理理的数据类型有哪些?如何定制支持datetime类型?
字符串,字典,列表,数字,布尔值,None 自定义cls类 class MyEncoder(json.JSONEncoder): def default(self, o): # o是数据类型 if isinstance(o,datetime.datetime): return o.strftime('%Y-%m-%d') else: return super(MyEncoder,self).default(o)
76. json序列化时,默认遇到中文会转换成unicode,如果想要保留留中文怎么办?
dumps时指定ensure_ascii
=
False
77. 什么是断言?应用场景?
断言条件为真时代码继续执行,否则抛出异常,这个异常通常不会去捕获他.我们设置一个断言目的就是要求必须实现某个条件
78. 有用过with statement吗?它的好处是什么?
文件操作时使用过. with语句下代码完成后调用求值语句返回对象的__exit__方法,可以实现一些操作,比如关闭文件
79. 使用代码实现查看列列举目录下的所有文件。
# 递归的方式 def print_directory_contents(sPath): import os for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath, sChild) if os.path.isdir(sChildPath): print_directory_contents(sChildPath) else: print(sChildPath)
80. 简述 yield和yield from关键字。
yield : 生成器函数关键字 yield from : 相当于for i in obj : yield i
第二部分 网络编程和并发
81. 简述 OSI 七层协议。
开放式系统互联参考模型,从逻辑上将网络划分为7层,它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
ISO制定的OSI参考模型的过于庞大、复杂招致了许多批评。与此对照,由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。
82. 什么是C/S和B/S架构?
c/s : 客户端/服务端
b/s : 浏览器/服务端
82.1 ARP协议
地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。
83. 简述 三次握手、四次挥手的流程。
# 三次握手 客户端 : 发出请求 服务端 : 收到请求并相应 # 说明服务端可以收到客户端的请求 客户端 : 收到响应创建连接# 说明客户端可以收到服务端的请求 # 四次挥手 任意一方: 发出断开连接请求 另一方 : 收到响应,并回复 另一方 : 发出断开连接请求 任意一方: 收到响应,断开连接
84. TCP和UDP的区别?
TCP : 通信前创建连接
UDP : 通信前不需创建连接
85. 为何基于tcp协议的通信比基于udp协议的通信更更可靠?
TCP通信前创建连接,确保了连接两方能够接收到数据
86. 什么是socket?简述基于tcp协议的套接字通信流程。
socket位于应用层与传输层之间,实现了两个相同主机或不同主机进程间的互相通信 # 服务端 创建TCP套接字对象 绑定ip端口 开始监听请求 接收发送数据 # 客户端 创建TCP套接字对象 连接指定IP端口 接收发送数据
87. 什么是粘包? socket 中造成粘包的原因是什什么? 哪些情况会发生粘包现象?
TCP是流式传送的 也就是连接建立后可以一直不停的发送 并没有明确的边界定义. 发送端-接收端都存在这一个缓冲区 由接收方造成的粘包 当接收方不能及时接收缓冲区的包,造成多个包接收就产生了粘包 客户端发送一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次 遗留的数据 由传输方造成的粘包 tcp协议中会使用Nagle算法来优化数据。发送时间间隔短,数据量小的包会一起发送,造成粘包
88. IO多路路复用的作用?
监听多个soket的状态变化
89. 什么是防火墙以及作用?
它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。 防火可以使企业内部局域网(LAN)网络与Internet之间或者与其他外部网络互相隔离、限制网络互访用来保护内部网络。
90. select、poll、epoll 模型的区别?
selete : 有最大连接数 遍历 支持win poll : 无最大连接数 遍历 支持win epoll : 无最大连接数 事件通知 不支持win
91. 简述 进程、线程、协程的区别 以及应用场景?
# 进程 一个任务,进程之间内存隔离,一个进程修改数据不会影响其他进程(创建变量,修改变量值) # 线程 线程位于进程内 一个进程内至少有一个线程,线程之间资源共享.一个线程修改数据其他进程也会受影响所以有了锁的概念 # 协程 代码级别的保存状态+切换 多线程,协程用于IO密集型,如socket,爬虫,web,抢占cpu资源 多进程用于计算密集型,如金融分析,利用多核优势
92. GIL锁是什么鬼?
全局解释器锁,是的一个进程内只有一个线程在工作
93. Python中如何使用线程池和进程池?
# 进程池 from concurrent.futures import ProcessPoolExecutor import time,os def piao(name,n): print("%s is piaoing %s"%(name,os.getpid())) # 打印了进程id time.sleep(1) if __name__ == "__main__": p = ProcessPoolExecutor(4) # 指定进程池最大进程个数 for i in range(10): obj = p.submit(piao,"alex %s"%i,i) 提交任务 # 线程池 rom concurrent.futures import ThreadPoolExecutor import time,os,random def piao(name,n): print("%s is piaoing %s"%(name,os.getpid())) # 打印了进程id time.sleep(random.randint(1,3)) if __name__ == "__main__": p = ThreadPoolExecutor(4) # 指定线程池最大线程个数,不包含控制线程 for i in range(10): obj = p.submit(piao,"alex %s"%i,i) # 提交任务
94. threading.local的作用?
创建一个对象,每个线程为该对象设置值数据都是隔离的
95. 进程之间如何进行通信?
中间介质 socket : 直接通信
96. 什么是并发和并行?
并发 : 看上去是在同时工作,实际上是cpu一直在切换着工作
并行 : 利用多核同时工作多个任务
97. 进程锁和线程锁的作用?
进程锁 : 防止进程同时操作一套文件系统
线程锁 : 防止多个线程同时修改进程内数据
98. 解释什什么是异步非阻塞?
# 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程 # 异步的概念和同步相对。当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后, # 通过状态、通知或回调来通知调用者。
99. 路由器和交换机的区别?
路由器 : 连接外部网络,有接入外部的线
交换机 : 连接内部网络,可以没有接入外部的线
100.什么是域名解析?
我们在浏览器上输入网站域名时,会去请求DNS服务器获取该域名对应的IP地址,再去访问改地址
101.如何修改本地hosts文件?
win : C:\Windows\System32\drivers\etc\hosts
linux : /etc/hosts
按格式修改即可
102.生产者消费者模型应用场景及优势?
生产者与消费者模式是通过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯, 而是利用阻塞队列来进行通讯,生产者生成数据后直接丢给阻塞队列,消费者需要数据则从阻塞队列获取,实际应 用中,生产者与消费者模式则主要解决生产者与消费者生产与消费的速率不一致的问题,达到平衡生产者与消费者 的处理能力,而阻塞队列则相当于缓冲区。 # 应用场景 由一个线程生成订单,并将其放入队列中.由多个线程去处理 # 优势 平衡生产者与消费者的处理能力
103.什么是cdn?
CDN的全称是Content Delivery Network,即内容分发网络。 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根 据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近 的服务节点上。 其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
104.LVS是什么及作用?
LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器 LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把 许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定 可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。
https://www.cnblogs.com/the-study-of-linux/p/5065109.html
105.Nginx是什么及作用?
处理静态文件 负载均衡 反向代理
106.keepalived是什么及作用?
高可用
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到, 并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived 自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务 器。
107.haproxy是什么以及作用?
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP 的应用程序代理。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前 的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构 中, 同时可以保护你的web服务器不被暴露到网络上。 HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管 理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程 序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。 包括 GitHub、Bitbucket[3]、Stack Overflow[4]、Reddit、Tumblr、Twitter[5][6]和 Tuenti[7]在内的知 名网站,及亚马逊网络服务系统都使用了HAProxy。 # 作用 负载均衡
108.什么是负载均衡?
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐 量、加强网络数据处理能力、提高网络的灵活性和可用性。 负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务 器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 # 重点 拓展网络设备
109.什么是rpc及应用场景?
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要 了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在 OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容 易。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进 程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息 到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最 后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。 # 简单来说就是客户端与服务端并不直接通信,而是通过两个管道,多客户端通过一个管道向服务端发送消息, 每个客户端都有一个管道来接收信息
110.简述 asynio模块的作用和应用场景。
111.简述 gevent模块的作用和应用场景。
112.twisted框架的使用和应用?
第三部分 数据库
113.列举常见的关系型数据库和非关系型都有那些?
关系型 : MySQL,SQL Server ,Oracle , Sybase, DB2 非关系型 : Redis, MongodDB ,
114.MySQL常见数据库引擎及比较?
InnoDB,MyISAM,NDB,Memory等
InnoDB
支持事务,特点是行锁 -- 表锁: start transaction; select * from tb for update; commit; -- 行锁,只为查到的加锁: start transaction; select id,name from tb where id=2 for update ; commit
MyISAM
-- 不支持支持事务,也没有行锁,支持全文索引 start transaction; select * from tb for update; commit;
115.简述数据三大范式?
1.第一范式:确保每列保持原子性 2.第二范式:确保表中的每列都和主键相关 3.第三范式:确保表中每一列都和主键列直接相关,而不是间接相关.
116.什什么是事务?MySQL如何支持事务?
多个修改一次提交,成功都成功,失败都失败
start transaction; -- 开始事务 update biao1 set money = money - 500 where id = '1'; update biao1 set money = money + 500 where id = '2'; commit; -- 提交事务
117.简述数据库设计中一对多和多对多的应用场景?
一对多 : 一个学校有多个老师.
多对多 : 一个老师可以带多个班级,一个班级有多个老师
118.如何基于数据库实现商城商品计数器?
119.常见SQL(必备)
详⻅见博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
120.简述触发器器、函数、视图、存储过程?
触发器 : 在执行某种操作前后一些自定义的操作 函数 : 处理参数,返回结果 视图 : 把需要的数据存放在一张临时表中 存储过程 : sql语句集,简化了一些操作.与函数不同,他可以返回一个结果集(查询结果)
121.MySQL索引种类
普通索引,唯一索引,主键索引.联合索引,联合唯一索引
122.索引在什什么情况下遵循最左前缀的规则?
联合索引
123.主键和外键的区别?
主键 : 该表中此列唯一,非空
外键 : 该列中的值必须是关联表中关联的数据
124.MySQL常见的函数?
now() -- 返回当前时间 data_format(date,format) # 时间格式化 format(x,y) -- 将数字用千分符分开,并保留y位小数 聚合函数
125.列举 创建索引但是无法命中索引的8种情况。
使用like,函数,类型不一致,不符合最左前缀不会命中索引 以下某些情况下会命中索引: or 当or条件中有未建立索引的列不会命中 != 如果是主键,则还是会走索引 <,> 如果是主键或索引是整数类型,则还是会走索引 order by 当根据索引排序时候,选择的映射如果不是索引,则不走索引
126.如何开启慢日志查询?
slow_query_log = OFF 是否开启慢日志记录 long_query_time = 2 时间限制,超过此时间,则记录 slow_query_log_file = /usr/slow.log 日志文件 log_queries_not_using_indexes = OFF 为使用索引的搜索是否记录 查看当前配置信息: show variables like '%query%' 修改当前配置: set global 变量名 = 值
127.数据库导入导出命令(结构+数据)?
mysqldump -h IP -u 用户名 -p 数据库名 > 导出的文件名 # 导入数据库(首先得创建数据,再导入) source 文件(导入数据库表)
128.数据库优化方案?
表级别的优化 不用select * 固定字段在前面 将固定数据放入内存:choice 数据库级别的优化 读写分离(数据库的主从关系) 分库 分表 横向分 : 将拥有大量字段的表分成多张表 纵向分 : 将数据量大的表分成多张 利用缓存
129.char和varchar的区别?
#char类型:定长,简单粗暴,浪费空间,存取速度快
#varchar类型:变长,精准,节省空间,存取速度慢
130.简述MySQL的执行计划?
131.在对name做了了唯⼀一索引前提下,简述以下区别:
- select * from tb where name = ‘Oldboy-Wupeiqi’
- select * from tb where name = ‘Oldboy-Wupeiqi’ limit 1
全局遍历与只取一瓢
132.1000w条数据,使⽤用limit offset 分页时,为什什么越往后翻越慢?如何解决?
越是向后,扫描的数据也就越多
解决方案:按照需求实现,可分为
- 限制浏览页数,
- 存储本页数据两端的主键,按主键查找后向前或向后取多少条
- 另外,如果数据没有缺失的话,还可以通过页数来计算主键
133.什什么是索引合并?
使用多个主键进行查询
134.什什么是覆盖索引?
查询内容在主键中可以直接查到
135.简述数据库读写分离?
建立主从关系,实现高可用,并减少主服务器的压力
136.简述数据库分库分表?(水平、垂直)
水平 : 数据库字段过多
垂直 : 数据库行数太多
137.redis和memcached比较?
(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) redis可以持久化其数据
138.redis中数据库默认是多少个db 及作用?
0-15,相当于不同的库
139.python操作redis的模块?
redis模块
140.如果redis中的某个列表中的数据量量非常大,如果实现循环显示每一个值?
def list_iter(name): """ 自定义redis列表增量迭代 :param name: redis中的name,即:迭代name对应的列表 :return: yield 返回 列表元素 """ list_count = r.llen(name) for index in xrange(list_count): yield r.lindex(name, index)
141.redis如何实现主从复制?以及数据同步机制?
在从服务器中配置 SLAVEOF
127.0
.
0.1
6380
# 主服务器IP,端口
142.redis中的sentinel的作用?
监控主机状态,实现高可用
143.如何实现redis集群?
安装集群软件
# EPEL源安装ruby支持 yum install ruby rubygems -y # 使用国内源 gem sources -a http://mirrors.aliyun.com/rubygems/ gem sources --remove http://rubygems.org/ gem sources -l gem install redis -v 3.3.3
redis配置文件
port 7000 daemonize yes pidfile /data/7000/redis.pid logfile "/var/log/redis7000.log" dbfilename dump.rdb dir /data/7000 cluster-enabled yes # 开实例的集群模式 cluster-config-file nodes.conf # 保存节点配置文件的路径 cluster-node-timeout 5000 appendonly yes
启动6个节点(要让集群正常运作至少需要三个主节点,另外三个做为从节点)
/application/redis/src/redis-server /data/7000/redis.conf /application/redis/src/redis-server /data/7001/redis.conf /application/redis/src/redis-server /data/7002/redis.conf /application/redis/src/redis-server /data/7003/redis.conf /application/redis/src/redis-server /data/7004/redis.conf /application/redis/src/redis-server /data/7005/redis.conf
ps -ef |grep 700
创建集群
/application/redis/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \ 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 # 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点 # 之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave redis-trib 会打印出一份预想中的配 # 置给你看, 如果你觉得没问题的话, 就可以输入 yes
144.redis中默认有多少个哈希槽?
16384
145.简述redis的有哪几种持久化策略略及比较?
---------rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略
---------aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合
146.列列举redis支持的过期策略略。
- voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
- allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
- allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
- no-enviction(驱逐):禁止驱逐数据
147.MySQL 里里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?
redis内存数据级上升到一定大小时,就会实行数据淘汰策略,从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
148.写代码,基于redis的列列表实现 先进先出、后进先出队列列、优先级队列列。
class Zhan: def __init__(self,conn): self.conn = conn def push(self,val): self.conn.rpush('aaa',val) def pop(self): return self.conn.rpop('aaa') class Dui: def __init__(self,conn): self.conn = conn def push(self,val): self.conn.rpush('bbb',val) def get(self): return self.conn.lpop('bbb') class Xu: def __init__(self,conn): self.conn = conn def push(self,val,count): self.conn.zadd('ccc',val,count) def get(self): a = self.conn.zrange('ccc', 0, 0)[0] self.conn.zrem('ccc', a) return a
149.如何基于redis实现消息队列列?
将列表维护成一个栈,设置获取数据的超时时间
150.如何基于redis实现发布和订阅?以及发布订阅和消息队列列的区别?
发送消息 : conn.publish(名称,消息)
接收消息 : conn.sunscribe(名称)
区别 : 消息队列,收到消息只会有一个处理者;发布订阅,所有的订阅者都会收到消息并进行处理
151.什么是codis及作用?
豌豆荚团队提供的一个分布式 Redis 解决方案
152.什么是twemproxy及作用?
Twemproxy 又称 nutcracker ,是一个memcache、redis协议的轻量级代理,一个用于sharding 的中间件。有了Twemproxy,客户端不直接访问Redis服务器,而是通过twemproxy 代理中间件间接访问。
作用 : 对redis数据分片处理
153.写代码实现redis事务操作。
import redis pool = redis.ConnectionPool(host='10.211.55.4', port=6379) conn = redis.Redis(connection_pool=pool) # transaction默认为False,只可以完成批量提交的作用,节省网络延时 # 改为True后可以实现事务功能 # pipe = r.pipeline(transaction=False) pipe = conn.pipeline(transaction=True) # 开始事务 pipe.multi() pipe.set('name', 'alex') pipe.set('role', 'sb') pipe.lpush('roless', 'sb') # 提交 pipe.execute()
154.redis中的watch的命令的作用?
加锁
155.基于redis如何实现商城商品数量计数器?
字符串的decr可以实现自减操作
156.简述redis分布式锁?
为redis集群设计的锁,防止多个任务同时修改数据库,其本质就是为集群中的每个主机设置一个会超时的字符串,当集群中有一半多的机器设置成功后就认为加锁成功,直至锁过期或解锁不会有第二个任务加锁成功
157.什么是一致性哈希?Python中是否有相应模块?
实现服务器负载均衡时候可供选择的负载均衡的算法
from hash_ring import * memcache_servers = ['192.168.0.246:11212', '192.168.0.247:11212', '192.168.0.249:11212'] ring = HashRing(memcache_servers) server = ring.get_node('my_key') print(server) # '192.168.0.247:11212' server = ring.get_node('my_keysdfsdf') print(server) # '192.168.0.249:11212'
158.如何高效的找到redis中所有以oldboy开头的key?
# 命令模式 KEYS * # *代表通配符 # redis模块 import redis con = redis.Redis() con.keys(pattern='celery*') # *代表通配符
前端框架和其他
谈谈你对http协议的认识。
http协议规定了数据传输的格式(分割),以及链接的特性(无状态,短连接)
谈谈你对websocket协议的认识。
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
什么是magic string ?
WebSocket握手时的加密字符串
魔法字符串 : 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
如何创建响应式布局?
@media (min-width: 768px) {指定分辨率生效的样式}
你曾经使用过哪些前端框架?
jquery,bootstrap,vue
什么是ajax请求?并使用jQuery和XMLHttpRequest对象实现一个ajax请求。
不刷新页面的情况下发送请求
$.ajax({}) var xmlHttp = createXMLHttpRequest(); xmlHttp.open("GET", "/ajax_get/?a=1", true); xmlHttp.send(null); xmlHttp.onreadystatechange = function() { if(xmlHttp.readyState == 4) { alert('hello'); } };
如何在前端实现轮训?
每隔固定时间发起一次请求
如何在前端实现长轮训?
前端与后端配合实现长轮循
前端 : 接受响应,做出处理
后端 : 夯住一定时间,返回状态信息
vuex的作用?
存储全局信息的仓库
vue中的路由的拦截器的作用?
验证要跳转的url,比如一个要登录才能访问的页面
axios的作用?
发送ajax请求
列举vue的常见指令。
v-bind : 属性绑定
v-on : 时间绑定
v-model : form表单关联
v-if,v-else : 判断,不会出现在dom中
v-show : 类似判断 , 会有一个隐藏的标签
简述jsonp及实现原理?
利用script标签的特性,动态生成标签
是什么cors ?
支持CORS请求的浏览器一旦发现ajax请求跨域,会对请求做一些特殊处理,对于已经实现CORS接口的服务端,接受请求,并做出回应。其本质是设置响应头,使得浏览器允许跨域请求
列举Http请求中常见的请求方式?
常见类型有GET,POST
跨域相关的有OPTION
RESTful的请求方式GET,POST,PUT,DELETE,PATCH
列举Http请求中的状态码?
200 : 成功系列
300 : 重定向系列
400 : 请求错误
500 : 服务器错误
列举Http请求中常见的请求头?
User-Agent : 浏览器信息
Host : 服务区域名
Referer : 通过哪里的链接过来的
Origin : 跨域相关
Content-Type : POST和PUT请求的数据类型
Cookie : 客户端存储的保持会话信息
X-Csrf-Token : 携带token
看图写结果:
李杰
看图写结果:
武沛齐
看图写结果:
老男孩
看图写结果:
undefined
看图写结果:
武沛齐
看图写结果:
alex
django、flask、tornado框架的比较?
django : 框架全面,内部组件丰富. session,admin,model,modelform,orm
flask : 框架比较小,但是有非常多的扩展组件
tronado : 异步非阻塞,天生支持websocket
什么是wsgi?
web服务网关接口(Web Server Gateway Interface),是一套协议。WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求.
WSGI的模块:
- wsgiref
- werkzurg
- uwsgi
以上模块本质:实现socket监听请求,获取请求后将数据封装,然后交给web框架处理。
django请求的生命周期?
经过wsgi,进入中间件process_request后匹配路由,执行视图函数,经过process_response响应信息
列举django的内置组件?
session,admin,model,modelform,orm
列举django中间件的5个方法?以及django中间件的应用场景?
process_request : 请求进来时,权限认证
process_response : 请求响应时,设置跨域响应头
process_view : 路由匹配之后,能够得到视图函数
process_exception : 异常时执行
process_template_responseprocess : 模板渲染时执行
简述什么是FBV和CBV?
FBV : 函数视图
CBV : 类视图
django的request对象是在什么时候创建的?
请求到来时django.core.handlers.wsgi.WSGIHandler得到__call__方法被执行,将environ封装成了request
如何给CBV的程序添加装饰器?
CBV时的注意事项? - 装饰器 from django.views import View from django.utils.decorators import method_decorator def auth(func): def inner(*args,**kwargs): return func(*args,**kwargs) return inner class UserView(View): @method_decorator(auth) def get(self,request,*args,**kwargs): return HttpResponse('...') - csrf的装饰器要加到dispath from django.views import View from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt,csrf_protect class UserView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return HttpResponse('...') 或 from django.views import View from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt,csrf_protect @method_decorator(csrf_exempt,name='dispatch') class UserView(View): def dispatch(self, request, *args, **kwargs): return HttpResponse('...')
列举django orm 中所有的方法(QuerySet对象的所有方法)
.save() .create() .bulk_create() .delete() .updata() # django生成的第三张表 .add() .set() .remove .clera() .filter(id__gt=1,) .exclude() .values() .values_list() .order_by() .order_by('-id') .aggregate() .anotate() .first() .laste() .get() .exsit() .reverse() distinct() .extra() .raw() F和Q .select_related() .prefetch_related()
only和defer的区别?
only : 只差指定字段
defer : 不查指定字段
select_related和prefetch_related的区别?
select_ related : 做连表
prefetch_related : 通过两次查询,第一次根据一查多的范围,第二次差多的信息.对多得信息已经存在于一之中,不会产生额外的查询
filter和exclude的区别?
filter : 选择满足条件的
exclude : 排除满足条件的
列举django orm中三种能写sql语句的方法。
.extra()
.raw()
以及获取连接
from django.db import connection, connections cursor = connection.cursor() # cursor = connections['default'].cursor()
django orm 中如何设置读写分离?
读写时指定using哪个库
或者配置类
F和Q的作用?
F : 对数据本身的值进行比较和判断
Q : 构造复杂的查询条件
values和values_list的区别?
values : 取字典的queryset
values_list : 取元组的queryset
如何使用django orm批量创建数据?
bulk_create()
django的Form和ModeForm的作用?
Form : 构建form组件字符串,以及表单数据验证
ModeForm : 根据模型类来生成Form
django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
重写构造方法
rom django.forms import Form from django.forms import fields class UserForm(Form): name = fields.CharField(label='用户名',max_length=32) email = fields.EmailField(label='邮箱') ut_id = fields.ChoiceField( # choices=[(1,'二笔用户'),(2,'闷骚')] choices=[] ) def __init__(self,*args,**kwargs): super(UserForm,self).__init__(*args,**kwargs) self.fields['ut_id'].choices = models.UserType.objects.all().values_list('id','title')
使用ModelChoiceField字段,渲染结果依赖于model的__str__方法
from django.forms import Form from django.forms import fields from django.forms.models import ModelChoiceField class UserForm(Form): name = fields.CharField(label='用户名',max_length=32) email = fields.EmailField(label='邮箱') ut_id = ModelChoiceField(queryset=models.UserType.objects.all())
django的Model中的ForeignKey字段中的on_delete参数有什么作用?
这个参数在Django2.0中变成了必须的参数,该参数制定了当该字段的值删除时,其关联的值的操作
django中csrf的实现机制?
在页面中生成一个隐藏的input标签,在提交表单时携带这个隐藏的input
或者在cookie中设置,在请求头中携带过来
django如何实现websocket?
channel插件
基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
表单中,请求头中
django中如何实现orm表中添加数据时创建一条日志记录。
给信号注册函数
django缓存如何设置?
# 全站缓存 MIDDLEWARE_CLASSES = ( ‘django.middleware.cache.UpdateCacheMiddleware’, #第一 'django.middleware.common.CommonMiddleware', ‘django.middleware.cache.FetchFromCacheMiddleware’, #最后 ) # 视图缓存 from django.views.decorators.cache import cache_page import time @cache_page(15) #超时时间为15秒 def index(request): t=time.time() #获取当前时间 return render(request,"index.html",locals()) # 模板缓存 {% load cache %} <h3 style="color: green">不缓存:-----{{ t }}</h3> {% cache 2 'name' %} # 存的key <h3>缓存:-----:{{ t }}</h3> {% endcache %}
django的缓存能使用redis吗?如果可以的话,如何配置?
pip install django-redis
配置文件参数名字要大写,大写,大写
CACHES可以设置多个缓存,根据名字使用
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", # 缓存类型 "LOCATION": "redis://127.0.0.1:6379", # ip端口 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", # "CONNECTION_POOL_KWARGS": {"max_connections": 100} # 连接池最大连接数 # "PASSWORD": "密码", } } }
使用
from django.shortcuts import render,HttpResponse from django_redis import get_redis_connection def index(request): # 根据名字去连接池中获取连接 conn = get_redis_connection("default") conn.hset('n1','k1','v1') # 存数据 return HttpResponse('...')
django路由系统中name的作用?
反向解析路由字符串
django的模板中filter和simple_tag的区别?
filter : 类似管道,只能接受两个参数第一个参数是|前的数据
simple_tag : 类似函数
django-debug-toolbar的作用?
django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。
包括查看执行的sql语句,db查询次数,request,headers,调试概览等
django中如何实现单元测试?
from django.test import TestCase from myapp.models import Animal # Django的单元测试基于unittest库 class StudentTestCase(TestCase): # 测试函数执行前执行 def setUp(self): print("======in setUp") # 需要测试的内容 def test_add(self): student = Student(name='aaa') student.save() self.assertEqual(student.name, 'aaa') # 需要测试的内容 def test_check_exit(self): self.assertEqual(0, Student.objects.count()) # 测试函数执行后执行 def tearDown(self): print("======in tearDown")
解释orm中 db first 和 code first的含义?
db first已存在数据库, 生成模型
code first已存在模型,生成数据库
django中如何根据数据库表生成model中的类?
python manage.py inspectdb
使用orm和原生sql的优缺点?
orm : 开发速度快,执行速度慢
sql : 开发速度慢,执行速度快
简述MVC和MTV
MVC MTV
模型 M M
视图 C(控制器) V
模板 V(渲染用) T
django的contenttype组件的作用?
记录App中的model
谈谈你对restfull 规范的认识?
显示特点 : 根据路由与请求方式操作数据
接口的幂等性是什么意思?
对同一接口的相同调用,不会对资源重复操作
什么是RPC?
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
Http和Https的区别?
HTTP , 明文传输
HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
为什么要使用django rest framework框架?
只响应数据,并非响应html页面
django rest framework框架中都有那些组件?
渲染器,解析器,版本,认证,权限,频率,分页,视图,路由,序列化
django rest framework框架中的视图都可以继承哪些类?
- APIview
- 简单封装了view
- GenericAPIView
- 增加了一些属性和方法,如queryset,serializer
- 其包下还有一些类,继承了mixins下的一些类和GenericAPIView,并且实现了get,post等方法
- GenericViewSet
- 其父类中重写as_view,使其接收请求方式与执行函数的关系,执行函数需自己实现
- 其包下还有一些类(主要是ModelViewSet),继承了mixins下的一些类和GenericViewSet,只要在路由里指定请求方式与list,create等函数的对应关系即可,并且可以自动生成url
简述 django rest framework框架的认证流程。
请求进来执行了as_view返回的函数,返回了dispatch的返回结果,在APIview中的dispatch中封装了新的request,并进行了初始化,在初始化中完成认证,循环认证类实例,执行authenticate方法根据返回值
django rest framework如何实现的用户访问频率控制?
同上
Flask框架的优势?
框架本身比较小巧,同样是写个helloword比django简单太多
Flask框架依赖组件?
Flask蓝图的作用?
Flask 用 蓝图(blueprints) 的概念来在一个应用中或跨应用制作应用组件和支持通用的模式。
列举使用过的Flask第三方组件?
flask-session
flask-script 支持命令行选相
flask-sqlalchemy数据库框架ORM
flask-migrate 数据库迁移
简述Flask上下文管理流程?
- 项目启动时会生成两个LocalStack实例_request_ctx_stack和_app_ctx_stack ,每个对象都有一个_local属性,是一个Local实例
- 还会产生4个LocalProxy实例,分别是request,session,current_app还有g
- Local类似于threading.local,但是Local还能够为协程来分隔数据
- 当请求来临时,会产生一个ctx即RequestContext对象,这个类封装了request和session,session在实例化是还是个None
- 然后会调用ctx的push()方法,而ctx的push回将自身作为参数,调用LocalStack实例的push方法,在LocalStack的方法中通过.的方式向_local实例中设置了一个空列表,又将RequestContext实例追加进其中,而Local的setattr方法则是完成了以进程或线程ID为键将设置的列表作为置
- 取值过程则是通过导入rsquest,或session,调用了LocalProxy中的__getattr__或__setitem__,其中有执行了类初始化时是传递的偏函数,通过LocalStack从Local中取得RequestContext,又获得了想要的属性,为此属性设置值或从此属性中取值
Flask中的g的作用?
一次请求中的全局对象
Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
Local : 他的实例数据隔离的对象
LocalStack : 通过此类实例来操作Local对象
RequestContext : 封装数据
LocalProxy : 通过此类中的方法来读写request,session
为什么要Flask把Local对象中的的值stack 维护成一个列表?
多app离线脚本嵌套时一个域内使用的对象都是本app的
Flask中多app应用是怎么完成?
from flask import Flask from werkzeug.wsgi import DispatcherMiddleware from werkzeug.serving import run_simple app01 = Flask('app01') app02 = Flask('app02') @app01.route('/login') def login(): return 'app01.login' @app02.route('/index') def index(): return 'app02.index' dm = DispatcherMiddleware(app01,{ '/app02': app02, }) if __name__ == '__main__': run_simple('localhost', 5000,dm)
其内部会去在路由中匹配注册时的键
在Flask中实现WebSocket需要什么组件?
gevent-websocket
wtforms组件的作用?
生成表单字符串,以及数据格式验证
Flask框架默认session处理机制?
加密后存在cookie中
解释Flask框架中的Local对象和threading.local对象的区别?
Local更强大,能够根据协程隔离对象
Flask中 blinker 是什么?
Blinker 是一个基于Python的强大的信号库,它既支持简单的对象到对象通信,也支持针对多个对象进行组播。Flask的信号机制就是基于它建立的。
SQLAlchemy中的 session和scoped_session 的区别?
session : 简单的创建连接
scoped_session : 为每一个线程创建连接
SQLAlchemy如何执行原生SQL?
ORM的实现原理?
类对应一张表,根据方法和参数生成sql语句
DBUtils模块的作用?
DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装
以下SQLAlchemy的字段是否正确?如果不正确请更正:
from datetime import datetime from sqlalchemyext.declarative import declarative_base from sqlalchemy import Column, Integer, String, DateTime Base =declarative_base() classUserInfo(Base): __tablename__ ='userinfo' id=Column(Integer, primary_key=True, autoincrement=True) name =Column(String(64), unique=True) ctime =Column(DateTime, default=datetime.now())
ctime的default在解释时计算出值
SQLAchemy中如何为表设置引擎和字符编码?
# 在类下定义__table_args__ __table_args__ = ( # UniqueConstraint('id', 'name', name='uix_id_name'),联合唯一 # Index('ix_id_name', 'name', 'extra'),联合索引 # 'mysql_engine': 'InnoDB', # 'mysql_charset': 'utf8' )
SQLAchemy中如何设置联合唯一索引?
同上
简述Tornado框架的特点。
异步非阻塞
简述Tornado框架中Future对象的作用?
Tornado框架中如何编写WebSocket程序?
Tornado中静态文件是如何处理的? 如: <link href="{{static_url("commons.css")}}" rel="stylesheet" />
Tornado操作MySQL使用的模块?
Tornado操作redis使用的模块?
简述Tornado框架的适用场景?
请求中io多
git常见命令作用:
简述以下git中stash命令作用以及相关其他命令。
git 中 merge 和 rebase命令 的区别。
- git merge 分支名称 将指定分支合并到当前分支
- git rebase 分支名称 合并+将提交记录合并到一条主线=> 提交记录整洁
公司如何基于git做的协同开发?
如何基于git实现代码review?
git如何实现v1.0 、v2.0 等版本的管理?
什么是gitlab?
github和gitlab的区别?
github是别人做好的
gitlab是自己搭建的
如何为github上牛逼的开源项目贡献代码?
git中 .gitignore文件的作用?
忽略设置的文件,检查时不会检查这些文件
什么是敏捷开发?
简述 jenkins 工具的作用?
公司如何实现代码发布?
简述 RabbitMQ、Kafka、ZeroMQ的区别?
RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
RabbitMQ如何对消息做持久化?
RabbitMQ如何控制消息被消费的顺序?
以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic。
简述 celery 是什么以及应用场景?
Celery是由Python开发的一个简单、灵活、可靠的处理大量任务的分发系统,它不仅支持实时处理也支持任务调度。
简述celery运行机制。
celery如何实现定时任务?
简述 celery多任务结构目录?
celery中装饰器 @app.task 和 @shared_task的区别?
app.task : 为某一个app创建可执行任务
shared_task : 为该文件下的suoyouapp创建可执行任务
简述 requests模块的作用及基本使用?
简述 beautifulsoup模块的作用及基本使用?
简述 seleninu模块的作用及基本使用?
scrapy框架中各组件的工作流程?
在scrapy框架中如何设置代理(两种方法)?
scrapy框架中如何实现大文件的下载?
scrapy中如何实现限速?
scrapy中如何实现暂定爬虫?
scrapy中如何进行自定制命令?
scrapy中如何实现的记录爬虫的深度?
scrapy中的pipelines工作原理?
scrapy的pipelines如何丢弃一个item对象?
简述scrapy中爬虫中间件和下载中间件的作用?
scrapy-redis组件的作用?
scrapy-redis组件中如何实现的任务的去重?
scrapy-redis的调度器如何实现任务的深度优先和广度优先?
简述 vitualenv 及应用场景?
简述 pipreqs 及应用场景?
在Python中使用过什么代码检查工具?
简述 saltstack、ansible、fabric、puppet工具的作用?
B Tree和B+ Tree的区别?
请列举常见排序并通过代码实现任意三种。
请列举常见查找并通过代码实现任意三种。
请列举你熟悉的设计模式?
有没有刷过leetcode?
列举熟悉的的Linux命令。
公司线上服务器是什么系统?
linux