Python Web是python程序員的一大就業(yè)方向,以下是針對這一方向的面試題總結(jié)佳魔。
1.解釋一下WSGI和FastCGI的關(guān)系氧骤?
CGI全稱是"公共網(wǎng)關(guān)接口"(CommonGateway Interface),HTTP服務(wù)器與你的或其他機(jī)器上的程序進(jìn)行"交談"的一種工具,其程序必須運(yùn)行在網(wǎng)絡(luò)服務(wù)器上吃引。CGI可以用任何一種語言編寫,只要這種語言具有標(biāo)準(zhǔn)輸入刽锤、輸出和環(huán)境變量镊尺。
FastCGI像是一個(gè)常駐型的CGI,它可以一直執(zhí)行著,只要激活后并思,不會每次都要花時(shí)間去fork一次(這是CGI最為人詬病的fork-and-execute模式)庐氮。它還支持分布式的運(yùn)算,即FastCGI程序可以在網(wǎng)站服務(wù)器以外的主機(jī)上執(zhí)行并且接受來自其它網(wǎng)站服務(wù)器的請求宋彼。
FastCGI是語言無關(guān)的弄砍、可伸縮架構(gòu)的CGI開放擴(kuò)展仙畦,其主要行為是將CGI解釋器進(jìn)程保持在內(nèi)存中并因此獲得較高的性能。眾所周知音婶,CGI解釋器的反復(fù)加載是CGI性能低下的主要原因慨畸,如果CGI解釋器保持在內(nèi)存中并接受FastCGI進(jìn)程管理器調(diào)度,則可以提供良好的性能衣式、伸縮性寸士、Fail- Over特性等等。
WSGI的全程為: PythonWeb Server Gateway Interface v1.0(Python Web服務(wù)器網(wǎng)關(guān)接口)
它是Python應(yīng)用程序和Web服務(wù)器之間的一種接口碴卧。
它的作用弱卡,類似于FCGI或FASTCGI之類的協(xié)議作用。
WSGI的目標(biāo)住册,是要建立一個(gè)簡單的普遍適用的服務(wù)器與Web框架之間的接口婶博。
Flup就是使用 Python 語言對 WSGI 的一種實(shí)現(xiàn),是可以用于 Python 的應(yīng)用開發(fā)中的一種工具或者說是一種庫荧飞。
Spawn-fcgi是一個(gè)小程序凡人,這個(gè)程序的作用是管理fast-cgi進(jìn)程,那么管理wsgi進(jìn)程也是沒有問題的垢箕,功能和php-fpm類似划栓。
簡單來說,WSGI和FastCGI都是一種CGI条获,用于連接Web服務(wù)器與應(yīng)用程序忠荞,而WSGI專指Python應(yīng)用程序。而flup是WSGI的一種實(shí)現(xiàn)帅掘,Spawn-fcgi是用于管理flup進(jìn)程的一個(gè)工具委煤,可以啟動多個(gè)wsgi進(jìn)程,并管理它們修档。
2.解釋一下Django和Tornado的關(guān)系碧绞、差別
Django源自于一個(gè)新聞Web站點(diǎn),于 2005 年以開源的形式被釋放出來吱窝。
Django 框架的核心組件有:用于創(chuàng)建模型的對象關(guān)系映射為最終用戶設(shè)計(jì)的完美管理界面一流的URL設(shè)計(jì)讥邻,設(shè)計(jì)者友好的模板語言緩存系統(tǒng)等等。
它鼓勵(lì)快速開發(fā)院峡,并遵循MVC設(shè)計(jì)兴使。Django遵循BSD版權(quán)。
Django的主要目的是簡便照激、快速的開發(fā)數(shù)據(jù)庫驅(qū)動的網(wǎng)站发魄。它強(qiáng)調(diào)代碼復(fù)用,多個(gè)組件可以很方便的以"插件"形式服務(wù)于整個(gè)框架,Django有許多功能強(qiáng)大的第三方插件励幼,你甚至可以很方便的開發(fā)出自己的工具包汰寓。這使得Django具有很強(qiáng)的可擴(kuò)展性。它還強(qiáng)調(diào)跨蘇開發(fā)和DRY(Do Not RepeatYourself))原則苹粟。
Tornado是FriendFeed使用的可擴(kuò)展的非阻塞式web服務(wù)器及其相關(guān)工具的開源版本有滑。這個(gè)Web框架看起來有些像web.py或者Google的webapp,不過為了能有效利用非阻塞式服務(wù)器環(huán)境六水,這個(gè)Web框架還包含了一些相關(guān)的有用工具和優(yōu)化俺孙。
Tornado和現(xiàn)在的主流Web的服務(wù)器框架(包括大多數(shù)Python的框架)有著明顯的區(qū)別:它是非阻塞式服務(wù)器,而且速度相當(dāng)快掷贾。得利于其非阻塞的方式和對epoll的運(yùn)用睛榄,Tornado每秒可以處理數(shù)以千計(jì)的連接,這意味著對于實(shí)時(shí)Web服務(wù)來說想帅,Tornado是一個(gè)理想的Web框架场靴。我們開發(fā)這個(gè)Web服務(wù)器的主要目的就是為了處理FriendFeed的實(shí)時(shí)功能——在FriendFeed的應(yīng)用里面每一個(gè)活動用戶都會保持一個(gè)服務(wù)器連接。
3.解釋下django-debug-toolbar的使用
使用django開發(fā)站點(diǎn)時(shí)港准,可以使用django-debug-toolbar來進(jìn)行調(diào)試旨剥。在settings.py中添加’debug_toolbar.middleware.DebugToolbarMiddleware’到項(xiàng)目的MIDDLEWARE_CLASSES 內(nèi)。
4.解釋下Django使用redis緩存服務(wù)器
為了能在Django中使用redis浅缸,還需要安裝redis for Django的插件轨帜。然后在Django的settings中配置。
安裝
pip install django-redis
配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
附錄django-redis 中文文檔:http://django-redis-chs.readthedocs.io/zh_CN/latest/#
5.如何進(jìn)行Django單元測試衩椒?
Django的單元測試使用python的unittest模塊蚌父,這個(gè)模塊使用基于類的方法來定義測試。類名為django.test.TestCase,繼承于python的unittest.TestCase毛萌。
6.解釋下Http協(xié)議
HTTP是一個(gè)屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議苟弛,由于其簡捷、快速的方式阁将,適用于分布式超媒體信息系統(tǒng)膏秫。
HTTP協(xié)議的主要特點(diǎn)可概括如下:
(1).支持客戶/服務(wù)器模式
(2).簡單快速:客戶端向服務(wù)器請求服務(wù)時(shí),只需要傳送請求方法和路徑做盅。請求方法常用的有GET缤削、POST、HEAD等吹榴。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同僻他。由于HTTP服務(wù)器的程序規(guī)模小,因?yàn)橥ㄐ潘俣群芸臁?br>
(3).靈活:HTTP運(yùn)行傳輸任意類型的數(shù)據(jù)對象腊尚。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
(4).無連接:無連接的含義是限制每次連接只能處理一個(gè)請求满哪。服務(wù)器處理完客戶端的請求婿斥,并收到客戶端的應(yīng)答后劝篷,即斷開連接。采用這種方式可以節(jié)省傳輸時(shí)間民宿。
(5).無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議娇妓。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息活鹰,則它必須重傳哈恰,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面志群,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快着绷。
7.解釋下Http請求頭
Accept:指瀏覽器或其他客戶可以接受的MIME文件格式⌒吭疲可以根據(jù)它判斷并返回適當(dāng)?shù)奈募袷健?br>
Accept-Charset:指出瀏覽器可以接受的字符編碼荠医。英文瀏覽器默認(rèn)值是ISO-8859-1.
Accept-Language:指出瀏覽器可以接受的語言種類,如en或en-us,指英語桑涎。
Accept-Encoding:指出瀏覽器可以接受的編碼方式彬向。編碼方式不同于文件格式,它是為了壓縮文件并加速文件傳遞速度攻冷。瀏覽器在接收到Web響應(yīng)之后先解碼娃胆,然后再檢查文件格式。
Cache-Control:設(shè)置關(guān)于請求被代理服務(wù)器存儲的相關(guān)選項(xiàng)等曼。一般用不到里烦。
Connection:用來告訴服務(wù)器是否可以維持固定的HTTP連接。HTTP/1.1使用Keep-Alive為默認(rèn)值涉兽,這樣招驴,當(dāng)瀏覽器需要多個(gè)文件時(shí)(比如一個(gè)HTML文件和相關(guān)的圖形文件),不需要每次都建立連接枷畏。
Content-Type:用來表名request的內(nèi)容類型别厘。可以用HttpServletRequest的getContentType()方法取得拥诡。
Cookie:瀏覽器用這個(gè)屬性向服務(wù)器發(fā)送Cookie触趴。Cookie是在瀏覽器中寄存的小型數(shù)據(jù)體,它可以記載和服務(wù)器相關(guān)的用戶信息渴肉,也可以用來實(shí)現(xiàn)會話功能冗懦。
8.常見的響應(yīng)狀態(tài)碼
狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別仇祭,且有五種可能取值:
1xx:指示信息-表示請求已接收披蕉,繼續(xù)處理
2xx:成功-表示請求已被成功接收、理解、接受
3xx:重定向-要完成請求必須進(jìn)行更進(jìn)一步的操作
4xx:客戶端錯(cuò)誤-請求有語法錯(cuò)誤或請求無法實(shí)現(xiàn)
5xx:服務(wù)器端錯(cuò)誤-服務(wù)器未能實(shí)現(xiàn)合法的請求
常見狀態(tài)碼没讲、狀態(tài)描述眯娱、說明:
200 OK //客戶端請求成功
202 Accepted/接受 // 告訴客戶端請求正在被執(zhí)行,但還沒有處理完爬凑。
203 Non-Authoritative Information/非官方信息 //是表示文檔被正常的返回徙缴,但是由于正在使用的是文檔副本所以某些響應(yīng)頭信息可能不正確。這是 HTTP 1.1中新加入的嘁信。
300 Multiple Choices/多重選擇 // 表示被請求的文檔可以在多個(gè)地方找到于样,并將在返回的文檔中列出來。如果服務(wù)器有首選設(shè)置潘靖,首選項(xiàng)將會被列于定位響應(yīng)頭信息中穿剖。
400 Bad Request // 客戶端請求有語法錯(cuò)誤,不能被服務(wù)器所理解
401 Unauthorized // 請求未經(jīng)授權(quán)秘豹,這個(gè)狀態(tài)碼必須和WWW-Authenticate報(bào)頭域一起使用
403 Forbidden // 服務(wù)器收到請求携御,但是拒絕提供服務(wù)
404 Not Found // 請求資源不存在,eg:輸入了錯(cuò)誤的URL
500 Internal Server Error //服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤
503 Server Unavailable //服務(wù)器當(dāng)前不能處理客戶端的請求既绕,一段時(shí)間后可能恢復(fù)正常
9.你是如何進(jìn)行項(xiàng)目上線部署的,簡單談一下步驟
參考我的這篇文章:http://www.reibang.com/p/9c83916b404c
10.在Django項(xiàng)目中你有沒有用到cookie,是怎么使用的啄刹?
參考我的這篇文章:http://www.reibang.com/p/c8728ab807b5