博客地址:https://ask.hellobi.com/blog/zhiji 歡迎大家來交流學(xué)習(xí)。
十一小長長長長長長長長假還有一天,
然而,
你不愿再沖進(jìn)擁擠的人潮,
不愿再涌向苦等的隊伍,
不愿再成為那個躺在床上
觀看別人朋友圈的人。
或許,
我可以將你的焦慮、你的不安、你的無聊,
統(tǒng)統(tǒng)劃掉!并且還將帶給你一大波(python)豪(基)禮(礎(chǔ)),
對,你沒看錯!快來手把手跟我復(fù)習(xí)Python基礎(chǔ)。

??本文偏理論,想到哪里就寫到哪里,沒有頭緒-,- 各位看官將就著看。
一、python是什么?
- Python是一種解釋型語言。這就是說,與C語言和C的衍生語言不同,Python代碼在運行之前不需要編譯。其他解釋型語言還包括PHP和Ruby。
- Python是動態(tài)類型語言,指的是你在聲明變量時,不需要說明變量的類型。你可以直接編寫類似x=111和x="I'm a string"這樣的代碼,程序不會報錯。
- Python非常適合面向?qū)ο蟮木幊蹋∣OP),因為它支持通過組合(composition)與繼承(inheritance)的方式定義類(class)。Python中沒有訪問說明符(access specifier,類似C++中的public和private),這么設(shè)計的依據(jù)是“大家都是成年人了”。
- 在Python語言中,函數(shù)是第一類對象(first-class objects)。這指的是它們可以被指定給變量,函數(shù)既能返回函數(shù)類型,也可以接受函數(shù)作為輸入。類(class)也是第一類對象。
- Python代碼編寫快,但是運行速度比編譯語言通常要慢。好在Python允許加入基于C語言編寫的擴展,因此我們能夠優(yōu)化代碼,消除瓶頸,這點通常是可以實現(xiàn)的。numpy就是一個很好地例子,它的運行速度真的非常快,因為很多算術(shù)運算其實并不是通過Python實現(xiàn)的。
- Python用途非常廣泛——網(wǎng)絡(luò)應(yīng)用,自動化,科學(xué)建模,大數(shù)據(jù)應(yīng)用,等等。它也常被用作“膠水語言”,幫助其他語言和組件改善運行狀況。
- Python讓困難的事情變得容易,因此程序員可以專注于算法和數(shù)據(jù)結(jié)構(gòu)的設(shè)計,而不用處理底層的細(xì)節(jié)。
1.python數(shù)據(jù)結(jié)構(gòu)
Python中常見的數(shù)據(jù)結(jié)構(gòu)可以統(tǒng)稱為容器(container)。序列(如列表和元組)、映射(如字典)以及集合(set)是三類主要的容器。
2.設(shè)計模式
設(shè)計模式(Design pattern)代表了最佳的實踐,通常被有經(jīng)驗的面向?qū)ο蟮能浖_發(fā)人員所采用。設(shè)計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。
1 . 抽象工廠模式 為一個產(chǎn)品族提供了統(tǒng)一的創(chuàng)建接口。當(dāng)需要這個產(chǎn)品族的某一系列的時候,可以從抽象工廠中選出相應(yīng)的系列創(chuàng)建一個具體的工廠類。
2 . 工廠方法模式 定義一個接口用于創(chuàng)建對象,但是讓子類決定初始化哪個類。工廠方法把一個類的初始化下放到子類。
3 . 生成器模式 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
4 . 單例模式 確保一個類只有一個實例,并提供對該實例的全局訪問。
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) return cls._instance5 . 適配器模式 將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口表示。適配器模式可以消除由于接口不匹配所造成的類兼容性問題。
6 . 觀察者模式 在對象間定義一個一對多的聯(lián)系性,由此當(dāng)一個對象改變了狀態(tài),所有其他相關(guān)的對象會被通知并且自動刷新。
3.棧和隊列
1.什么是棧
想象一摞被堆起來的書,這就是棧。這堆書的特點是,最后被堆進(jìn)去的書,永遠(yuǎn)在最上面。從這堆書里面取一本書出來,取哪本書最方便?肯定是最上面那本。棧這種數(shù)據(jù)結(jié)構(gòu)的特點就是如此:后進(jìn)先出(Last In First Out - LIFO),即最后被堆進(jìn)去的數(shù)據(jù),最先被拿出來。
2.棧的Python實現(xiàn)
class Stack(object):
# 初始化棧為空列表
def __init__(self):
self.items = []
# 判斷棧是否為空,返回布爾值
def is_empty(self):
return self.items == []
# 返回棧頂元素
def peek(self):
return self.items[len(self.items) - 1]
# 返回棧的大小
def size(self):
return len(self.items)
# 把新的元素堆進(jìn)棧里面(程序員喜歡把這個過程叫做壓棧,入棧,進(jìn)棧……)
def push(self, item):
self.items.append(item)
# 把棧頂元素丟出去(程序員喜歡把這個過程叫做出?!? def pop(self, item):
return self.items.pop()
Python里面實現(xiàn)棧,就是把list包裝成一個類,再添加一些方法作為棧的基本操作。其他的數(shù)據(jù)結(jié)構(gòu)在Python中也是以類似的方式實現(xiàn)的。
3.隊列Queue()
隊列是一種列表,不同的是隊列只能在隊尾插入元素,在隊首刪除元素。隊列用于存儲按順序排列的數(shù)據(jù),先進(jìn)先出,這點和棧不一樣,在棧中,最后入棧的元素反而被優(yōu)先處理。
隊列是一種先進(jìn)先出(First-In-First-Out,F(xiàn)IFO)的數(shù)據(jù)結(jié)構(gòu)。隊列被用在很多地方,比如提交操作系統(tǒng)執(zhí)行的一系列進(jìn)程、打印任務(wù)池等,一些仿真系統(tǒng)用隊列來模擬銀行或雜貨店里排隊的顧客。
隊列的兩種主要操作是:向隊列中插入新元素和刪除隊列中的元素。插入操作也叫做入隊,刪除操作也叫做出隊。入隊操作在隊尾插入新元素,出隊操作刪除隊頭的元素。
4.python的垃圾回收機制
通過“引用計數(shù)”(reference counting)來跟蹤和回收垃圾。
在引用計數(shù)的基礎(chǔ)上,還可以通過“標(biāo)記-清除”(mark and sweep)解決容器對象可能產(chǎn)生的循環(huán)引用的問題。
通過“分代回收”(generation collection)以空間換取時間來進(jìn)一步提高垃圾回收的效率。
5.組合和繼承?
組合和繼承我們傾向于選擇組合,繼承體現(xiàn)的是一種專門化的概念而組合則是一種組裝的概念
6.python代碼中使用try except的優(yōu)缺點?
優(yōu)點: 正常操作代碼的控制流不會和錯誤處理代碼混在一起. 當(dāng)某種條件發(fā)生時, 它也允許控制流跳過多個框架;集中報錯。
缺點: 可能會導(dǎo)致讓人困惑的控制流. 調(diào)用庫時容易錯過錯誤情況。
7.SOCKET編程
Socket是進(jìn)程通訊的一種方式,即調(diào)用這個網(wǎng)絡(luò)庫的一些API函數(shù)實現(xiàn)分布在不同主機的相關(guān)進(jìn)程之間的數(shù)據(jù)交換。
適用場合:socket是位于傳輸層的網(wǎng)絡(luò)編程了,一般用于需要自己定義應(yīng)用層的協(xié)議的應(yīng)用程序。
socket的結(jié)構(gòu):socket的結(jié)構(gòu)很簡單,只有三個元素,協(xié)議,端口號,IP地址。Socket=Ip address+ TCP/UDP + port
TCP和UDP的區(qū)別:(TCP)傳輸控制協(xié)議,是一種提供可靠數(shù)據(jù)傳輸?shù)耐ㄓ脜f(xié)議。(UDP)用戶數(shù)據(jù)報協(xié)議,是一個面向無連接的協(xié)議。采用該協(xié)議不需要兩個應(yīng)用程序先建立連接。UDP協(xié)議不提供差錯恢復(fù),不能提供數(shù)據(jù)重傳,因此該協(xié)議傳輸數(shù)據(jù)安全性差。
8.樂觀鎖和悲觀鎖?
- 悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作
- 樂觀鎖:假設(shè)不會發(fā)生并發(fā)沖突,只在提交操作時檢查是否違反數(shù)據(jù)完整性。
9.三次握手
1.客戶端通過向服務(wù)器端發(fā)送一個SYN來創(chuàng)建一個主動打開,作為三次握手的一部分。客戶端把這段連接的序號設(shè)定為隨機數(shù) A。
2.服務(wù)器端應(yīng)當(dāng)為一個合法的SYN回送一個SYN/ACK。ACK 的確認(rèn)碼應(yīng)為 A+1,SYN/ACK 包本身又有一個隨機序號 B。
3.最后,客戶端再發(fā)送一個ACK。當(dāng)服務(wù)端受到這個ACK的時候,就完成了三路握手,并進(jìn)入了連接創(chuàng)建狀態(tài)。此時包序號被設(shè)定為收到的確認(rèn)號 A+1,而響應(yīng)則為 B+1。
10.四次揮手
TCP的連接的拆除需要發(fā)送四個包,因此稱為四次揮手(four-way handshake)。客戶端或服務(wù)器均可主動發(fā)起揮手動作,在socket編程中,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作。
(1)客戶端A發(fā)送一個FIN,用來關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送。
(2)服務(wù)器B收到這個FIN,它發(fā)回一個ACK,確認(rèn)序號為收到的序號加1。和SYN一樣,一個FIN將占用一個序號。
(3)服務(wù)器B關(guān)閉與客戶端A的連接,發(fā)送一個FIN給客戶端A。
(4)客戶端A發(fā)回ACK報文確認(rèn),并將確認(rèn)序號設(shè)置為收到序號加1。
11.HTTP和HTTPS
HTTPS(全稱:Hypertext Transfer Protocol over Secure Socket Layer),是以安全為目標(biāo)的HTTP通道,簡單講是HTTP的安全版。
超文本傳輸協(xié)議 (HTTP-Hypertext transfer protocol) 是一種詳細(xì)規(guī)定了瀏覽器和萬維網(wǎng)服務(wù)器之間互相通信的規(guī)則,通過因特網(wǎng)傳送萬維網(wǎng)文檔的數(shù)據(jù)傳送協(xié)議。
HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全。
HTTPS和HTTP的區(qū)別主要如下:
1、https協(xié)議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
2、http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
3、http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
4、http的連接很簡單,是無狀態(tài)的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比http協(xié)議安全。
12.Python2和3一些區(qū)別
1. __future__模塊
from __future__ import division 如果你希望在Python 2環(huán)境下寫的代碼也可以在Python 3.x中運行,那么建議使用__future__模塊。
2.print函數(shù)
Python 2中的print語句被Python 3中的print()函數(shù)取代,這意味著在Python 3中必須用括號將需要輸出的對象括起來。
3.整數(shù)除法
整型除法返回浮點數(shù),要得到整型結(jié)果,在python3中使用//
Python2中: 3 / 2 = 1
Python3中:3 / 2 = 1.5
4.Unicode
Python 3中,終于有了Unicode(utf-8)字符串,以及兩個字節(jié)類:bytes和bytearrays。
5.Xrange
在Python 3中,range()的實現(xiàn)方式與xrange()函數(shù)相同,所以就不存在專用的xrange()(在Python 3中使用xrange()會觸發(fā)NameError)。
6.異常處理
Python 3中的異常處理也發(fā)生了一點變化。在Python 3中必須使用“as”關(guān)鍵字。
try:
.......
except NameError as err:
Python2:
try:
.......
except NameError, err:
7.Python 3改進(jìn)了input()函數(shù),這樣該函數(shù)就會總是將用戶的輸入存儲為str對象。在Python 2中,為了避免讀取非字符串類型會發(fā)生的一些危險行為,不得不使用raw_input()代替input()。
13.GIL 含義、多線程、多線程、 協(xié)程區(qū)別
進(jìn)程有哪幾種基本狀態(tài)?
1、就緒狀態(tài) 當(dāng)進(jìn)程已分配到除 CPU 以外的所有必要的資源,只要獲得
處理機便可立即執(zhí)行,這時的進(jìn)程狀態(tài)稱為就緒狀態(tài)。2、執(zhí)行狀態(tài) 當(dāng)進(jìn)程已獲得處理機,其程序正在處理機上執(zhí)行,此時的進(jìn)程狀態(tài)稱為執(zhí)行狀態(tài)。
3、阻塞狀態(tài) 正在執(zhí)行的進(jìn)程,由于等待某個事件發(fā)生而無法執(zhí)行時,便放棄處理機而處于阻塞狀態(tài)。引起進(jìn)程阻塞的事件可有多種,例如,等待 I/O 完成、申請緩沖區(qū)不能滿足、等待信件(信號)等。
- GIL,即全局解釋器鎖(Global Interpreter Lock),是計算機程序設(shè)計語言解釋器用于同步線程的工具,使得任何時刻僅有一個線程在執(zhí)行。CPython 中用
GIL 來控制線程的執(zhí)行,只有拿到 GIL 的線程才能執(zhí)行。在 CPython 的運行中,有些內(nèi)部資源不是線程安全的,所以需要有一個全局鎖來保護(hù)。這就造成了即使在多核CPU中,多線程也只是做著分時切換而已。意義只是每條語句宏觀上并發(fā)執(zhí)行,并不能提升效率,只是并發(fā),而沒有并行。
注意:GIL 只存在于CPython 中,其他 PyPy、IronPython、Jython 沒有這個問題。
進(jìn)程:進(jìn)程之間不共享任何狀態(tài),進(jìn)程的調(diào)度由操作系統(tǒng)完成,每個進(jìn)程都有自己的獨立的內(nèi)存空間,進(jìn)程間的通訊主要是通過信號傳遞的方式來實現(xiàn)的,實現(xiàn)的方式有多種,信號量,管道,事件等,任何一種方式的通訊效率都需要通過內(nèi)核,導(dǎo)致通訊效率比較低。由于是獨立的內(nèi)存空間,上下文切換的時候需要先保存調(diào)用棧的信息,CPU 各寄存器的信息,虛擬內(nèi)存,以及打開的相關(guān)句柄等信息,所以導(dǎo)致上下文進(jìn)程間切換開銷很大,通訊麻煩。
線程:線程之間共享變量,解決了通訊麻煩的問題,但對變量的訪問需要鎖,線程的調(diào)度主要也是有操作系統(tǒng)完成,一個進(jìn)程可以擁有多個線程,但是其中每個線程會共享父進(jìn)程向操作系統(tǒng)申請資源,這個包括虛擬內(nèi)存,文件等,由于是共享資源,所以創(chuàng)建線程所需要的系統(tǒng)資源占用比進(jìn)程小很多,相應(yīng)的可創(chuàng)建的線程數(shù)量也變得相對多很多。線程時間的通訊除了可以使用進(jìn)程之間通訊的方式之外還可以通過共享內(nèi)存的方式進(jìn)行通信,所以這個速度比通過內(nèi)核要快很多。另外在調(diào)度方面也是由于內(nèi)存是共享的,所以上下文切換的時候需要保存的東西就相對少一些,這樣一來上下文切換也變得高效
協(xié)程:協(xié)程的調(diào)度完全由用戶控制,一個線程可以有多個協(xié)程,用戶創(chuàng)建了幾個協(xié)程,然后每個協(xié)程都是循環(huán)按照指定的任務(wù)清單順序完成不同的任務(wù),當(dāng)任務(wù)被堵塞的時候執(zhí)行下一個任務(wù),當(dāng)恢復(fù)的時候再回來執(zhí)行這個任務(wù),任務(wù)之間的切換只需要保存每個任務(wù)的上下文內(nèi)容,就像直接操作棧一樣的,這樣就完全沒有內(nèi)核
14.裝飾器、生成器 、迭代器
-
迭代器:迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。
特點:
1.訪問者不需要關(guān)心迭代器內(nèi)部的結(jié)構(gòu),僅需通過next()方法不斷去取下一個內(nèi)容
2.不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問
3.訪問到一半時不能往回退
4.便于循環(huán)比較大的數(shù)據(jù)集合,節(jié)省內(nèi)存 -
生成器:一個函數(shù)調(diào)用時返回一個迭代器,那這個函數(shù)就叫做生成器(generator),如果函數(shù)中包含yield語法,那這個函數(shù)就會變成生成器。
這個yield的主要效果呢,就是可以使函數(shù)中斷,并保存中斷狀態(tài),中斷后,代碼可以繼續(xù)往下執(zhí)行,過一段時間還可以再重新調(diào)用這個函數(shù),從上次yield的下一句開始執(zhí)行。 - 裝飾器:裝飾器(Decorator)是python中最吸引人的特性,可以讓已有的函數(shù)不做任何改動的情況下增加功能。

二、數(shù)據(jù)庫
1.數(shù)據(jù)庫升序降序
數(shù)據(jù)庫 中使用order by語句進(jìn)行排序,其中升序用asc,降序用desc。
如:
select * from t order by 列a asc; -- 這是升序 asc可以省略不寫
select * from t order by 列a desc; -- 這是降序
2.Mysql優(yōu)化
- 大部分 MySQL 服務(wù)器都有查詢緩存功能。這是提高性能的最有效的方法之一,這是由數(shù)據(jù)庫引擎私下處理的。當(dāng)同一個查詢被多次執(zhí)行,結(jié)果會直接從緩存里提取,這樣速度就很快。
- 獲取唯一行時使用 LIMIT 1
有時當(dāng)你查表時,你已經(jīng)知道你正在查找的結(jié)果只有一行。你可能正在獲取唯一記錄,或者你可能只是查詢是否存在滿足你的 WHERE 子句條件的記錄。
在這種情況下,將 LIMIT 1 添加到查詢條件中可以提高性能。這樣,數(shù)據(jù)庫引擎將在找到剛剛第一個記錄之后停止掃描記錄,而不是遍歷整個表或索引 - 避免使用 SELECT *
- 索引搜索字段
3.Mysql 的連接查詢有哪些
INNER JOIN(內(nèi)連接,或等值連接):取得兩個表中存在連接匹配關(guān)系的記錄。
LEFT JOIN(左連接):取得左表(table1)完全記錄,即是右表(table2)并無對應(yīng)匹配記錄。
RIGHT JOIN(右連接):與 LEFT JOIN 相反,取得右表(table2)完全記錄,即是左表(table1)并無匹配對應(yīng)記錄。
4.mysql 常用的引擎InnoDB(我用的是InnoDB)
優(yōu)點:InnoDB 支持事務(wù),事務(wù)是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原;支持外鍵;
缺點:清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。
5.redis 基本類型
Redis 支持五種數(shù)據(jù)類型:string(字符串)、hash(哈希)、list(列表)、set(集合)及 zset(sorted set:有序集合)。
6.數(shù)據(jù)庫的隔離級別
(一)可讀取未確認(rèn)(Read uncommitted)
寫事務(wù)阻止其他寫事務(wù),避免了更新遺失。但是沒有阻止其他讀事務(wù)。
存在的問題:臟讀。即讀取到不正確的數(shù)據(jù),因為另一個事務(wù)可能還沒提交最終數(shù)據(jù),這個讀事務(wù)就讀取了中途的數(shù)據(jù),這個數(shù)據(jù)可能是不正確的。
解決辦法就是下面的“可讀取確認(rèn)”。
(二)可讀取確認(rèn)(Read committed)
寫事務(wù)會阻止其他讀寫事務(wù)。讀事務(wù)不會阻止其他任何事務(wù)。
存在的問題:不可重復(fù)讀。即在一次事務(wù)之間,進(jìn)行了兩次讀取,但是結(jié)果不一樣,可能第一次id為1的人叫“李三”,第二次讀id為1的人就叫了“李四”。因為讀取操作不會阻止其他事務(wù)。
解決辦法就是下面的“可重復(fù)讀”。
(三)可重復(fù)讀(Repeatable read)
讀事務(wù)會阻止其他寫事務(wù),但是不會阻止其他讀事務(wù)。
存在的問題:幻讀??芍貜?fù)讀阻止的寫事務(wù)包括update和delete(只給存在的表加上了鎖),但是不包括insert(新行不存在,所以沒有辦法加鎖),所以一個事務(wù)第一次讀取可能讀取到了10條記錄,但是第二次可能讀取到11條,這就是幻讀。
解決辦法就是下面的“串行化”。
(四)可串行化(Serializable)
讀加共享鎖,寫加排他鎖。這樣讀取事務(wù)可以并發(fā),但是讀寫,寫寫事務(wù)之間都是互斥的,基本上就是一個個執(zhí)行事務(wù),所以叫串行化。
7.數(shù)據(jù)庫的ACID
ACID,是指在可靠數(shù)據(jù)庫管理系統(tǒng)(DBMS)中,事務(wù)(transaction)所應(yīng)該具有的四個特性:/原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)
8.同步異步、阻塞非阻塞
同步和異步關(guān)注的是消息通信機制 (synchronous communication/ asynchronous communication)。
- 所謂同步,就是在發(fā)出一個調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回。
但是一旦調(diào)用返回,就得到返回值了。
換句話說,就是由調(diào)用者主動等待這個調(diào)用的結(jié)果。 - 而異步則是相反,調(diào)用在發(fā)出之后,這個調(diào)用就直接返回了,所以沒有返回結(jié)果。換句話說,當(dāng)一個異步過程調(diào)用發(fā)出后,調(diào)用者不會立刻得到結(jié)果。而是在調(diào)用發(fā)出后,被調(diào)用者通過狀態(tài)、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個調(diào)用。
舉個通俗的例子:
你打電話問書店老板有沒有《分布式系統(tǒng)》這本書,如果是同步通信機制,書店老板會說,“你稍等,我查一下”,然后開始查啊查,等查好了(可能是 5 秒,也可能是一天)告訴你結(jié)果(返回結(jié)果)。
而異步通信機制,書店老板直接告訴你我查一下啊,查好了打電話給你,然后直接掛電話了(不返回結(jié)果)。然后查好了,他會主動打電話給你。在這里老板通過“回電”這種方式來回調(diào)。
阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時的狀態(tài).
阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回。
非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會阻塞當(dāng)前線程。

三、Web框架
1.CGI和WSGI
CGI是通用網(wǎng)關(guān)接口,是連接web服務(wù)器和應(yīng)用程序的接口,用戶通過CGI來獲取動態(tài)數(shù)據(jù)或文件等。
CGI程序是一個獨立的程序,它可以用幾乎所有語言來寫,包括perl,c,lua,python等等。
WSGI, Web Server Gateway Interface,是Python應(yīng)用程序或框架和Web服務(wù)器之間的一種接口,WSGI的其中一個目的就是讓用戶可以用統(tǒng)一的語言(Python)編寫前后端。
2.XSRF和XSS
- CSRF(Cross-site request forgery)跨站請求偽造
- XSS(Cross Site Scripting)跨站腳本攻擊
CSRF重點在請求,XSS重點在腳本
3.Django 的架構(gòu)
Django 采用 MVT 的架構(gòu)模式:M 為 Model 模型層,是對數(shù)據(jù)庫的數(shù)據(jù)的抽象與映射;V 為 View 視圖層,在此層中進(jìn)行業(yè)務(wù)邏輯的處理,包括操作 model和為模版層提供數(shù)據(jù);T 為 Template 模版層,負(fù)責(zé)前端頁面的展示。
4.django 對數(shù)據(jù)查詢結(jié)果排序怎么做,降序怎么做,查詢大于某個字段怎么做。
- 排序使用
order_by(),如Entry.objects.order_by('blog__name', 'headline'); - 降序需在排序的字段名前加-,如
Entry.objects.order_by('-pub_date'); - 查詢字段大于某個值:使用 filter(字段名__gt=值),如
Entry.objects.filter(pubdate__gt='2006-01-01')
5.Django處理request的流程
- 用戶通過瀏覽器請求一個頁面
- 請求到達(dá)Request Middlewares,中間件對request做一些預(yù)處理或者直接response請求
- URLConf通過urls.py文件和請求的URL找到相應(yīng)的View
- View Middlewares被訪問,它同樣可以對request做一些處理或者直接返回response
- 調(diào)用View中的函數(shù)
- View中的方法可以選擇性的通過Models訪問底層的數(shù)據(jù)
- 所有的Model-to-DB的交互都是通過manager完成的
- 如果需要,Views可以使用一個特殊的Context
- Context被傳給Template用來生成頁面
- Template使用Filters和Tags去渲染輸出
- 輸出被返回到View
- HTTPResponse被發(fā)送到Response Middlewares
- 任何Response Middlewares都可以豐富response或者返回一個完全不同的response
- Response返回到瀏覽器,呈現(xiàn)給用戶
Middleware(中間件,包括request, view, exception, response),URLConf(url映射關(guān)系),Template(模板系統(tǒng))
6.Django 的 queryset 使用
在進(jìn)行數(shù)據(jù)查詢時,使用 all()、filter()、exclude()等會返回 Queryset,在對Queryset 進(jìn)行過濾鏈?zhǔn)讲僮鞯臅r候返回的還是 Queryset,我們可以對返回的Queryset 進(jìn)行排序、切片、過濾、去重等操作。
7.Django 與 Tornado 的對比
Django 是一個大而全的框架,其設(shè)計初衷是為了快速開發(fā),所以提供了豐富的套件供開發(fā)使用。其框架的所有業(yè)務(wù)與其內(nèi)置的 ORM 緊密相關(guān),還提供了自動化的 Admin 管理后臺。
而 Tornado 不僅僅是 Web 框架,其還提供了一個高性能的 Web 服務(wù)器,其設(shè)計初衷就是為了解決性能瓶頸問題,目的要打造一個高性能的開發(fā)框架。 Tornado 作為 Web 框架要比 Django 輕量的多,沒有提供豐富的套件,比如沒有ORM、管理后臺、表單系統(tǒng),甚至沒有 session 機制,但是提供了異步機制、 WebSocket 等 Django 沒有的功能,屬于靈活的輕量級框架。
8.Torando 的優(yōu)缺點
Tornado 的優(yōu)點是利用 epoll 機制實現(xiàn)了高性能,并以此提供了異步機制,可以達(dá)到異步非阻塞;框架輕量靈活;
其缺點是:Tornado 的運行是單進(jìn)程的,一旦在處理一個請求時出現(xiàn)了阻塞,將影響整體性能,所有在 Tornado 的開發(fā)中要避免阻塞,出現(xiàn)阻塞的地方使用異步,而對于接入的第三方庫或 SDK 往往并沒有提供對 Tornado 框架的異步支持,所以使用第三方接口時需要我們重復(fù)造輪子,自己封裝針對于 Tornado 異步的接口調(diào)用庫。
9.Tornado 的工作原理
1.ioloop 是 tornado 運行的核心
2.ioloop 封裝了操作管理 epoll 的工作
3.當(dāng) ioloop 實例啟動時,ioloop 將服務(wù)器監(jiān)聽的 socket 添加到 epoll 容器中,然后循環(huán)等待 epoll 返回可處理的 socket
4.當(dāng)有客戶端發(fā)起連接后,ioloop 從 epoll 容器中拿到了服務(wù)器監(jiān)聽的 socket,并調(diào)用服務(wù)器實例處理該監(jiān)聽 socket 的方法,接收連接請求,并將新的與客戶端對應(yīng)的 socket 添加到 epoll 容器中,然后繼續(xù)循環(huán)等待 epoll 返回可處理的 socket
5.當(dāng)客戶端發(fā)送過來請求數(shù)據(jù)后,ioloop 從 epoll 中拿到了接收數(shù)據(jù)的 socket,并調(diào)用服務(wù)器實例處理該傳輸 socket 的方法,從 socket 中讀取出 http 報文數(shù)據(jù),解析后調(diào)用 Application 的實例,進(jìn)行路由分發(fā),實例化具體的 RequestHandler,執(zhí)行其中的具體 http 方法,生成響應(yīng)數(shù)據(jù)并打包成 http 報文寫入到緩沖區(qū)中。
6.當(dāng)與客戶端對應(yīng)的 socket 可寫時,ioloop 從 epoll 中拿到了對應(yīng)可寫的 socket,將緩沖區(qū)中對應(yīng)的響應(yīng)報文數(shù)據(jù)寫入到 socket 中傳回給客戶端,完成請求處理。
7.epoll 每次只返回給 ioloop 可以處理的 socket,然后 ioloop 對拿到的 socket 依次進(jìn)行處理,有效充分地利用了 cpu 時間,進(jìn)而達(dá)到提升支持高并發(fā)的能力。
10.apache和nginx的區(qū)別
nginx 相對 apache 的優(yōu)點:
- 輕量級,同樣起web 服務(wù),比apache 占用更少的內(nèi)存及資源
- 抗并發(fā),nginx 處理請求是異步非阻塞的,支持更多的并發(fā)連接,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能
- 配置簡潔
- 高度模塊化的設(shè)計,編寫模塊相對簡單
- 社區(qū)活躍
apache 相對nginx 的優(yōu)點:
- rewrite ,比nginx 的rewrite 強大
- 模塊超多,基本想到的都可以找到
- 少bug ,nginx 的bug 相對較多
- 超穩(wěn)定
11.SOAP
SOAP(原為Simple Object Access Protocol的首字母縮寫,即簡單對象訪問協(xié)議)是交換數(shù)據(jù)的一種協(xié)議規(guī)范,使用在計算機網(wǎng)絡(luò)Web服務(wù)(web service)中,交換帶結(jié)構(gòu)信息。SOAP為了簡化網(wǎng)頁服務(wù)器(Web Server)從XML數(shù)據(jù)庫中提取數(shù)據(jù)時,節(jié)省去格式化頁面時間,以及不同應(yīng)用程序之間按照HTTP通信協(xié)議,遵從XML格式執(zhí)行資料互換,使其抽象于語言實現(xiàn)、平臺和硬件。
