Python Web開發相關的面試題(Django )
Python Web開發相關的面試題(Django )
解釋一下 WSGI 和 FastCGI 的關係?
CGI全稱是“公共閘道器介面”(CommonGateway Interface),HTTP伺服器與你的或其它機器上的程式進行“交談”的一種工具,其程式須執行在網路伺服器上。 CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。如php,perl,tcl等。
FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要啟用後,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute模式)。它還支援分散式的運算, 即 FastCGI 程式可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。
FastCGI是語言無關的、可伸縮架構的CGI開放擴充套件,其主要行為是將CGI直譯器程序保持在記憶體中並因此獲得較高的效能。眾所周知,CGI直譯器的反覆載入是CGI效能低下的主要原因,如果CGI直譯器保持在記憶體中並接受FastCGI程序管理器排程,則可以提供良好的效能、伸縮性、Fail- Over特性等等。
WSGI的全稱為: PythonWeb Server Gateway Interface v1.0 (Python Web 伺服器閘道器介面),
它是 Python 應用程式和 WEB 伺服器之間的一種介面。它的作用,類似於FCGI 或 FASTCGI 之類的協議的作用。WSGI 的目標,是要建立一個簡單的普遍適用的伺服器與 WEB 框架之間的介面。
Flup就是使用 Python 語言對 WSGI 的一種實現,是可以用於 Python 的應用開發中的一種工具或者說是一種庫。
Spawn-fcgi是一個小程式,這個程式的作用是管理fast-cgi程序,那麼管理wsgi程序也是沒有問題的,功能和php-fpm類似。故,簡單地說,WSGI和FastCGI都是一種CGI,用於連線WEB伺服器與應用程式,而WSGI專指Python應用程式。而flup是WSGI的一種實現,Spawn-fcgi是用於管理flup程序的一個工具,可以啟動多個wsgi程序,並管理它們。
解釋一下 Django 和 Tornado 的關係、差別
Django
Django 框架的核心元件有:
用於建立模型的物件關係對映為終端使用者設計的完美管理介面一流的 URL 設計設計者友好的模板語言快取系統等等
它鼓勵快速開發,並遵循MVC設計。Django遵守 BSD版權,最新發行版本是Django1.4,於2012年03月23日釋出.Django的主要目的是簡便、快速的開發資料庫驅動的網站。它強調程式碼複用,多個元件可以很方便的以“外掛”形式服務於整個框架,Django有許多功能強大的第三方外掛,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴充套件性。它還強調快速開發和DRY(Do Not RepeatYourself)原則。
Tornado是 FriendFeed使用的可擴充套件的非阻塞式 web 伺服器及其相關工具的開源版本。這個 Web 框架看起來有些像 web.py 或者 Google 的 webapp,不過為了能有效利用非阻塞式伺服器環境,這個 Web 框架還包含了一些相關的有用工具和優化。
Tornado 和現在的主流 Web 伺服器框架(包括大多數Python 的框架)有著明顯的區別:它是非阻塞式伺服器,而且速度相當快。得利於其 非阻塞的方式和對epoll的運用,Tornado 每秒可以處理數以千計的連線,這意味著對於實時 Web服務來說,Tornado 是一個理想的 Web 框架。我們開發這個 Web 伺服器的主要目的就是為了處理 FriendFeed 的實時功能 ——在 FriendFeed 的應用裡每一個活動使用者都會保持著一個伺服器連線。(關於如何擴容 伺服器,以處理數以千計的客戶端的連線的問題。
解釋下django-debug-toolbar的使用
使用django開發站點時,可以使用django-debug-toolbar來進行除錯。在settings.py中新增’debug_toolbar.middleware.DebugToolbarMiddleware’到專案的MIDDLEWARE_CLASSES 內。
解釋下Django使用redis快取伺服器
為了能在Django中使用redis,還需要安裝redis for Django的外掛。然後在Django的settings中配置了。現在連線和配置都已經完成了,接下來是一個簡單的例子:
from django.conf import settings
from django.core.cache import cache
import json
# read cache user id
def read_from_cache(self, user_name):
key = 'user_id_of_'+user_name
value = cache.get(key)
if value == None:
data = None
else:
data = json.loads(value)
return data
def write_to_cache(self, user_name):
key = 'user_id_of_'+user_name
cache.set(key, json.dumps(user_name), settings.NEVER_REDIS_TIMEOUT)
Django的單元測試使用python的unittest模組,這個模組使用基於類的方法來定義測試。類名為django.test.TestCase,繼承於python的unittest.TestCase。如何進行Django單元測試
from django.test import TestCasefrom
from myapp.models import Animal
class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name='lion', sound ='roar')
Animal.objects.create(name='cat', sound ='meow')
def test_animals_can_speak(self):
lion = Animal.objects.get(name='lion')
cat = Animal.objects.get(name='cat')
self.assertEqual(lion.speak(), 'The lion says "roar"')
self.assertEqual(cat.speak(), 'The cat says "meow"')
執行目錄下所有的測試(所有的test*.py檔案):執行測試的時候,測試程式會在所有以test開頭的檔案中查詢所有的test cases(inittest.TestCase的子類),自動建立測試集然後執行測試。
1 |
$ python manage.py test |
執行animals專案下tests包裡的測試:
1 |
$ python manage.py testanimals.tests |
執行animals專案裡的test測試:
1 |
$ python manage.py testanimals |
單獨執行某個test case:
1 |
$ python manage.py testanimals.tests.AnimalTestCase |
單獨執行某個測試方法:
1 |
$ python manage.py testanimals.tests.AnimalTestCase.test_animals_can_speak |
為測試檔案提供路徑:
1 |
$ python manage.py testanimals/ |
通配測試檔名:
1 |
$ python manage.py test—pattern=“tests_*.py” |
啟用warnings提醒:
1 |
$ python –Wall manage.py test |
解釋下Http協議
HTTP是一個屬於應用層的面向物件的協議,由於其簡捷、快速的方式,適用於分散式超媒體資訊系統。
HTTP協議的主要特點可概括如下:
1.支援客戶/伺服器模式。
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
3.靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
4.無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
解釋下Http請求頭和常見響應狀態碼
Accept:指瀏覽器或其他客戶可以接愛的MIME檔案格式。可以根據它判斷並返回適當的檔案格式。
Accept-Charset:指出瀏覽器可以接受的字元編碼。英文瀏覽器的預設值是ISO-8859-1.
Accept-Language:指出瀏覽器可以接受的語言種類,如en或en-us,指英語。
Accept-Encoding:指出瀏覽器可以接受的編碼方式。編碼方式不同於檔案格式,它是為了壓縮檔案並加速檔案傳遞速度。瀏覽器在接收到Web響應之後先解碼,然後再檢查檔案格式。
Cache-Control:設定關於請求被代理伺服器儲存的相關選項。一般用不到。
Connection:用來告訴伺服器是否可以維持固定的HTTP連線。HTTP/1.1使用Keep-Alive為預設值,這樣,當瀏覽器需要多個檔案時(比如一個HTML檔案和相關的圖形檔案),不需要每次都建立連線。
Content-Type:用來表名request的內容型別。可以用HttpServletRequest的getContentType()方法取得。
Cookie:瀏覽器用這個屬性向伺服器傳送Cookie。Cookie是在瀏覽器中寄存的小型資料體,它可以記載和伺服器相關的使用者資訊,也可以用來實現會話功能。
狀態程式碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示資訊–表示請求已接收,繼續處理
2xx:成功–表示請求已被成功接收、理解、接受
3xx:重定向–要完成請求必須進行更進一步的操作
4xx:客戶端錯誤–請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤–伺服器未能實現合法的請求
常見狀態程式碼、狀態描述、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //伺服器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //伺服器發生不可預期的錯誤
503 Server Unavailable //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常
eg:HTTP/1.1 200 OK (CRLF)