十一假期即將結(jié)束 不如復(fù)習(xí)下Python基礎(chǔ)

博客地址:https://ask.hellobi.com/blog/zhiji 歡迎大家來交流學(xué)習(xí)。

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

結(jié)尾有彩蛋

??本文偏理論,想到哪里就寫到哪里,沒有頭緒-,- 各位看官將就著看。

一、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._instance

5 . 適配器模式 將某個類的接口轉(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)、平臺和硬件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,757評論 11 349
  • 對不起,雖然我是個“稻米”,可是,盜墓筆記我只能給你兩顆星。 昨天滿懷著期望進(jìn)到電影院去看盜墓筆記,去之前朋友就提...
    十月痞子閱讀 396評論 0 1
  • 之前跟過一期麗芳老師的深度慢閱讀,可惜一直找不到方法,中間就放棄了,對于這樣晦澀難懂的工具書好像真的不是我的菜。 ...
    珍珍_708f閱讀 284評論 2 2
  • 文:羽裳 窗外,淅淅瀝瀝的雨下個不停,潮濕的空氣中伴著微風(fēng)透出侵心的涼,枯黃的...
    羽裳_閱讀 673評論 4 4

友情鏈接更多精彩內(nèi)容