# 3.4.4 Python
### 3.4.4 Python
Python是一門通用編程語言,由Van Rossum發明,在1994年達到了1.0版。它的應用領域十分廣泛,服務器編程只是其中一部分。
關于Python語言本身,有很多優秀的讀物可供參考。在此作者推薦OReilly出版的[《Learning Python, 5th Edition》](http://shop.oreilly.com/product/0636920028154.do)。這本書內容全面,也相當厚重,對有經驗的開發者來說也許顯得啰嗦。對后者我推薦[《Python in a Nutshell》](http://shop.oreilly.com/product/0636920012610.do?sortby=publicationDate),仍然由OReilly出版。
Python在服務器端的編程主要依賴**WSGI(Web Server Gateway Interface )**。它是一個Python的規范,定義了服務器和應用程序的交互接口[1](#fn_1)。這里“服務器”是指接受客戶端(如瀏覽器)HTTP請求的程序,而“應用程序”是指(由你編寫的)響應HTTP請求的程序。Python的現代Web編程框架都基于WSGI。
一個WSGI的Hello, world程序如下:
```
from wsgiref.simple_server import make_server
def app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['<p>Hello, WSGI!</p>']
httpd = make_server('', 8080, app)
httpd.serve_forever()
```
其中,函數app就是我們的應用程序(WSGI應用程序不僅可以是函數,還可以是具有**call**方法的對象,如后例)。按照WSGI規范,它有兩個參數:
- environ是一個dict類型對象,與CGI的環境變量類似,包含了HTTP請求在內的輸入
- start\_response是一個函數,app必須調用它來返回HTTP應答狀態代碼和頭部(header)
app返回一個iterable對象,如一個list,作為HTTP應答的消息主體(message body)。
[wsgiref](https://docs.python.org/2/library/wsgiref.html)是Python的一個WSGI工具包,包括一個供開發、測試用的服務器,由make\_server得到。
假設程序保存在文件hello.py中,在命令行上執行
```
python hello.py
```
就啟動了我們的WSGI應用程序。在瀏覽器里訪問`http://localhost:8080/`,即可看到:
```
Hello, WSGI!
```
WSGI有一個強大的功能叫做**中間件(middleware)**。舉例來說:
```
from wsgiref.simple_server import make_server
def app(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return ['<p>Hello, WSGI!</p>']
class Middleware:
def __init__(self, app):
self.wrapped_app = app
def __call__(self, environ, start_response):
result = self.wrapped_app(environ, start_response)
result.insert(0, '<h1>Middleware</h1>')
return result
httpd = make_server('', 8080, Middleware(app))
httpd.serve_forever()
```
其中,Middleware對象就是一個中間件,它接受服務器的調用參數,在內部調用下級應用,并返回結果給上級服務器(也能是另一個中間件!)。因此,中間件可以檢查、修改應用程序的輸入、輸出,進而實現各種功能,如session,訪問權限控制,日志,錯誤處理等等。
了解WSGI有助于深刻領會高級的Python Web編程框架,以及更好地使用middleware。關于Python Web編程和WSGI的更多內容,讀者可參考 <https://docs.python.org/2/howto/webservers.html>
此外,這個Wiki列出了一些使用WSGI的編程框架[https://en.wikipedia.org/wiki/Web\_Server\_Gateway\_Interface#WSGI-compatible\_applications\_and\_frameworks](https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface#WSGI-compatible_applications_and_frameworks)。[Django](https://www.djangoproject.com/)是其中比較流行的一種。
> 1. WSGI的官方文檔:<https://www.python.org/dev/peps/pep-3333/>[?](#reffn_1 "Jump back to footnote [1] in the text.")
- 前言
- 1 Web概述
- 1.1 什么是Web
- 1.2 超文本和超鏈接
- 1.3 URL
- 1.4 DNS
- 1.5 HTTP
- 1.5.1 客戶端請求
- 1.5.2 服務器應答
- 1.5.3 進一步了解HTTP
- 1.6 HTTPS
- 2 Web瀏覽器
- 2.1 HTML
- 2.1.1 文檔類型聲明
- 2.1.2 標簽和屬性
- 2.1.3 文檔結構
- 2.1.4 DOM
- 2.1.5 進一步了解HTML
- 2.2 CSS
- 2.2.1 樣式與樣式表
- 2.2.2 樣式表語法
- 2.2.3 級聯樣式表
- 2.2.4 進一步了解CSS
- 2.3 JavaScript
- 2.3.1 script標簽
- 2.3.2 操縱DOM
- 2.3.3 jQuery
- 2.3.4 進一步了解JavaScript
- 2.4 Ajax
- 2.5 移動設備與響應式Web設計
- 3 Web服務器
- 3.1 方法與資源
- 3.2 狀態代碼
- 3.3 靜態內容與動態內容
- 3.4 編程語言與技術
- 3.4.1 CGI
- 3.4.2 PHP
- 3.4.3 Java
- 3.4.4 Python
- 3.4.5 Ruby
- 3.4.6 Node.js
- 3.5 RESTful Web API
- 3.6 服務器架構
- 3.7 Web緩存
- 3.8 服務器推送
- 4 數據庫
- 4.1 關系型數據庫
- 4.2 NoSQL數據庫
- 5 Web服務器的其他組件
- 5.1 Cron
- 5.2 消息隊列
- 5.3 郵件服務器
- 6 開發工具與技術
- 6.1 Git
- 6.1.1 Git基礎操作
- 6.1.2 Git基本原理
- 6.1.3 進一步了解Git
- 6.2 敏捷開發