學寫python的時候,我們多多少少都接觸到了web程序,然而你有沒有想過,當瀏覽器發送了一個http請求時,等待接收這個請求的后端代碼是一種什么樣的思想感情?
就像下面這張圖里畫的一樣,后端也許是一段java代碼,也許是php代碼,當然,如果代碼出自我手,最可能的還是一段python代碼。這就好比,當你在社交軟件上給一個陌生人發了一條消息,對面這個人可能是英國人、印度人也有可能是一只羊或者一只狗。。。那么問題來了,他們怎么知道你在說啥?當然了,在web服務的世界里沒有現實中那么復雜,我們不需要考慮后台接收請求的是一只羊。。。接下來我們就來看看,在url和代碼之間到底發生了什么見不得人的事兒~

首先,當我們寫了一段代碼可以被http訪問的時候,我們就建立了一個webserver。從下圖中我們不難看出,這就是瀏覽器和web服務器之間的日常工作,對於服務器來說,要做的5件事情中,只有第3件是根據請求的不同在發生變化的:

因此,本着解耦的思想,就有人提出了新的方案,將服務器端反復做的事情獨立出來,封裝起來,對於程序員來說,我們只需要關注處理請求的部分,有專門的邏輯替我們處理這萬年不變的4步,是不是就使得代碼簡潔了很多?
然而,當我們這么做之后,服務器和app之間就不再是緊密團結在一起的整體,服務器必須知道要講接收到的請求、參數以什么方式傳達到app端,這就是我們在django中可以使用request.method、request.POST.get等方法的原因——約好了呀,說高大上點兒,這種約定就叫做協議!

下圖是我們在寫django時經常做的事情,左側是一個http請求,右側是python代碼,我們只需要在代碼里寫一個函數,url配一配,就可以使用左側的url請求到后端的代碼,為什么如此順利,是什么讓http和python代碼之間的代溝消失了?

以Django框架為例,Django在這個過程中做了哪些事兒呢?它就是很貼心的把整個服務器要做的事情以及服務器和app交互的過程給封裝起來了呀~~~
這么說起來,Django對我們的代碼來說,真是又當爹又當媽的模范家長啊!

當然啦!除了Django之外,python還有很多其他的web框架、模塊都做了同樣的封裝,他們也能對http請求進行分析,並承擔起和后台代碼交互的重任,然而我們知道人與人之間即便是交流同樣的事情也有很多種不同的表達方式,因此,我們說,雖然同樣是做http和代碼的交互工作,但對協議的定義可能不盡相同。
下面列舉一些常見的 Python HTTP 服務器,以及它們目前的大致發展情況,以便用戶的對比選擇:
| Name | Version | http 1.1 | Flavour | Repo. | Community |
|---|---|---|---|---|---|
| Gunicorn | 0.6.4 | No | processor/thread | GIT | #gunicorn |
| uWSGI | Trunk (253) | Yes | processor/thread | repo | Mailing List |
| FAPWS3 | 0.3.1 | No | processor/thread | GIT | Google Groups |
| Aspen | 0.8 | No | processor/thread | SVN | Google Groups |
| Mod_WSGI | 3.1 | Yes | processor/thread | SVN | Google Groups |
| wsgiref | Py 2.6.4 | No | processor/thread | SVN | Mailing List |
| CherryPy | 3.1.2 | Yes | processor/thread | SVN | Planet, IRC |
| Magnum Py | 0.2 | No | processor/thread | SVN | Google Groups |
| Twisted | 10.0.0 | Yes | processor/thread | SVN | Community |
| Cogen | 0.2.1 | Yes | callback/generator | SVN | Google Groups |
| GEvent | 0.12.2 | Yes | lightweight threads | Mercurial | Google Groups |
| Tornado | 0.2 | Yes | callback/generator | GIT | Google Groups |
| Eventlet | 0.9.6 | Yes | lightweight threads | Mercurial | Mailinglist |
| Concurrence | tip | Yes | lightweight threads | GIT | Google Groups |
參考:http://www.nowamagic.net/academy/detail/1330308
