1、講解Python Web開發,必定離不開HTTP。有多少人知道HTTP的工作流程呢?
2、我們訪問網站,網站服務器把內容反饋給我們。網站服務器是什麼?
3、都說HTTP網站不安全,要變成HTTPS的。如何建立HTTPS網站?
本文就針對以上問題做簡單解答,更詳細的內容請閱讀《Python高效開發實戰――Django、Tornado、Flask、Twisted(第3版)》一書。
PART.01 HTTP流程
HTTP是Web瀏覽器與Web服務器之間通信的標準協議,是Internet上能夠可靠地交換文件的重要基礎。HTTP的基本交互流程如圖1所示。
圖1 HTTP的基本交互流程
每個HTTP站點都有一個服務器進程監聽著TCP的HTTP端口,HTTP端口默認為80,也可由服務器進程設置為其他端口。
當服務器發現有客戶端建立連接並提交瞭一個 HTTP 請求(Request)後,就根據請求的內容執行相應的操作,並將結果返回給客戶端(Response)。
通常客戶在瀏覽器中發起一次網絡訪問的步驟如下。
(1)輸入網址並按Enter鍵,比如訪問http://mysite:8080/app/index.html。
(2)瀏覽器通過域名系統查詢mysite的真實IP,比如212.34.98.20。
(3)向服務器212.34.98.20的8080端口發起TCP連接請求並建立連接。
(4)發送HTTP請求的內容,包括訪問的地址/app/index.html、訪問方式GET、瀏覽器本身的產品名等。
(5)服務器返回/app/index.html中的數據作為Response發送給客戶端。如果請求的不是一個文件,則服務器需要執行相應的代碼,動態生成且返回給客戶端。
(6)瀏覽器接收到結果後關閉與服務器的TCP連接。
(7)瀏覽器將接收到的結果呈現在顯示器上。
註意:域名解析本身不是HTTP的一部分,客戶端應在向服務器建立TCP連接之前就通過DNS服務器完成域名解析工作。
以上是最典型的HTTP流程,當今的HTTP版本還允許客戶端在一次HTTP請求完成後不關閉TCP連接,以便第2次發送HTTP請求時復用該連接,從而達到減少系統整體開銷的目的,此技術在HTTP中叫作keep-alive。
PART.02 基於HTTP的網站開發
經過幾十年的發展,已經出現幾個成熟的處理HTTP的知名Web服務器。
這些Web服務器可以解析(handle)HTTP,當Web服務器接收到一個HTTP請求時,會根據配置的內容返回一個靜態HTML頁面或者調用某些代碼動態生成返回結果。
Web服務器把動態響應(dynamic response)產生的委托(delegate)給其他一些程序,例如Python代碼、JSP(JavaServer Pages)腳本、Servlets、ASP(Active Server Pages)腳本等。
無論它們的目的如何,這些服務器端(server-side)的程序通常會產生一個HTTP響應讓瀏覽器瀏覽。
由於目標操作系統、應用場景及商業目的的不同,當今主流的Web服務器各有特色,將它們的特性簡單地概括如下。
- Apache:是世界上用得最多的Web服務器,市場占有率達60%左右。由於其卓越的性能,Tomcat或JBoss等很多其他Web服務器使用Apache為自己提供HTTP接口服務。
- Nginx:是一款輕量級、高性能的HTTP和反向代理服務器。因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
- IIS:微軟的Web服務器產品。由於Windows的影響,IIS是目前最流行的Web服務器產品之一,它的最大優勢當然是對微軟http://ASP.net及其周圍產品的支持。
- Tomcat:是一個開源服務器,是Java Servlet 2.2和JavaServer Pages 1.1技術的標準實現。
- JBoss:是一個管理EJB的容器和服務器,支持EJB 1.1、EJB 2.0和EJB 3的規范。但JBoss的核心服務不包括支持Servlet、JSP的Web容器,一般與Tomcat或Jetty綁定使用。
當前的主流Web服務器都實現瞭主流語言的可調用接口標準,這些標準如下。
- CGI:Common Gateway Interface,CGI規范允許Web服務器執行外部程序,並將它們的輸出發送給Web瀏覽器,CGI將Web的一組簡單的靜態超媒體文檔變成一個完整的新的交互式媒體。
- ISAPI:Internet Server Application Program Interface,是微軟提供的一套面向Web服務的API接口,它能實現CGI提供的全部功能,並在此基礎上進行瞭擴展,例如提供瞭過濾器應用程序的接口。
- WSGI:Web Server Gateway Interface,是一套專為Python語言制定的網絡服務器標準接口。本書將要學習的Python Web框架均以WSGI為基礎標準。
從客戶端瀏覽器的角度來看,它的每次訪問是通過HTTP訪問Web服務器從而獲得某種服務(下載文件、查看頁面、訂購商品等)的,但實際上Web服務器僅起到橋梁的作用,即將瀏覽器的HTTP請求解碼,轉換成服務器端程序能夠識別的接口調用方式,然後將服務器端程序生成的返回封裝成HTTP Response,並返回給瀏覽器。
服務器端程序、Web服務器、客戶端之間的關系如圖2所示。
圖2 服務器端程序
最簡單的服務器端程序可以是直接讀取某文件或返回固定的網頁內容;稍復雜一些的服務器端程序需要處理客戶端通過HTTP、URL、HTML中傳入的參數、動態執行邏輯代碼、在數據庫或緩存中讀寫數據等一系列操作,才能最終生成調用結果。
PART.03 實戰演練
建立安全的HTTPS網站
普通HTTP站點的協議與數據以明文方式在網絡上傳輸,而HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)是以安全為目標的HTTP通道,即在HTTP下加入SSL層,通過SSL達到數據加密及身份認證的功能。
目前幾乎所有的銀行、證券、公共交通的網站均以HTTPS方式搭建。
OpenSSL是一個強大的免費Socket層密碼庫,蘊含瞭主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議。目前大多數網站通過OpenSSL工具包搭建HTTPS站點,其步驟如下。
- 在服務器中安裝OpenSSL工具包。
- 生成SSL密鑰和證書。
- 將證書配置到Web服務器。
- 在客戶端安裝CA證書。
本節演示在Linux Ubuntu下OpenSSL的使用方法,以及Nginx在Linux下的證書配置方式。
Windows中OpenSSL的使用方式與Linux中的完全一致,讀者可以自行嘗試。
1.在服務器中安裝OpenSSL工具包
通過如下兩條命令安裝OpenSSL:
命令運行成功後,OpenSSL命令和配置文件將被安裝到Linux系統目錄中。
- OpenSSL命令:/usr/bin/openssl。
- 配置文件:/usr/lib/ssl/*。
2.生成SSL密鑰和證書
通過如下步驟生成CA證書ca.crt、服務器密鑰文件server.key和服務器證書server.crt:
上述命令生成服務器端證書時,必須在Common Nanme(CN)字段中如實輸入站點的訪問地址。即如果站點通過http://www.mysite.com訪問,則必須定義CN=http://www.mysite.com;如果通過IP地址訪問,則需設置CN為具體的IP地址。
3.配置Nginx HTTPS服務器
在站點配置文件/etc/nginx/sites-enabled/default中添加如下server段,可以定義一個基於HTTPS的接口,該接口的服務器端程序仍舊為uWSGI接口127.0.0.1:3011。
務器密鑰的全路徑文件名。
至此,我們已經可以使用瀏覽器訪問服務器的443端口進行HTTPS加密通信瞭。
再也不用為如何學習Python迷茫瞭,《Python高效開發實戰——Django、Tornado、Flask、Twisted(第3版)》一書本著“純碎幹貨,實用至上”的原則,讓我們成為真正的全棧開發人才。
▊《Python高效開發實戰——Django、Tornado、Flask、Twisted(第3版)》
劉長龍 著
- 暢銷書Python Web編程集大成之作,全面升級
- Python 3.8、Django 3、Tornado 6、Flask 1.1.2、Twisted 20
- 作者多年Python項目實踐經驗及代碼編寫技巧分享
- 助你零基礎完成網站搭建、數據庫設計、前後端開發
本書分為3篇:上篇是Python基礎,帶領初學者實踐Python開發環境,掌握基本語法,同時對網絡協議、Web客戶端技術、數據庫建模等網絡編程基礎進行深入淺出的學習;中篇是Python框架,學習當前***的Python Web框架,即Django、Tornado、Flask和Twisted,達到對各種Python網絡技術融會貫通的目的;下篇是Python框架實戰,分別使用4種框架進行項目實踐,利用其各自的特點開發適用於不同場景的網絡程序。本書內容精練、重點突出、實例豐富、講解通俗,是廣大網絡應用設計和開發人員不可多得的一本參考書。