第一部分 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