Python 零基礎(chǔ)完成網(wǎng)站搭建~~
↑↑↑點(diǎn)擊上方藍(lán)字,回復(fù)資料,10個(gè)G的驚喜
1、講解Python Web開(kāi)發(fā),必定離不開(kāi)HTTP。有多少人知道HTTP的工作流程呢?
2、我們?cè)L問(wèn)網(wǎng)站,網(wǎng)站服務(wù)器把內(nèi)容反饋給我們。網(wǎng)站服務(wù)器是什么?
3、都說(shuō)HTTP網(wǎng)站不安全,要變成HTTPS的。如何建立HTTPS網(wǎng)站?
本文就針對(duì)以上問(wèn)題做簡(jiǎn)單解答,更詳細(xì)的內(nèi)容請(qǐng)閱讀《Python高效開(kāi)發(fā)實(shí)戰(zhàn)――Django、Tornado、Flask、Twisted(第3版)》一書(shū)。
HTTP流程
HTTP是Web瀏覽器與Web服務(wù)器之間通信的標(biāo)準(zhǔn)協(xié)議,是Internet上能夠可靠地交換文件的重要基礎(chǔ)。HTTP的基本交互流程如圖1所示。

圖1 HTTP的基本交互流程
每個(gè)HTTP站點(diǎn)都有一個(gè)服務(wù)器進(jìn)程監(jiān)聽(tīng)著TCP的HTTP端口,HTTP端口默認(rèn)為80,也可由服務(wù)器進(jìn)程設(shè)置為其他端口。
當(dāng)服務(wù)器發(fā)現(xiàn)有客戶(hù)端建立連接并提交了一個(gè) HTTP 請(qǐng)求(Request)后,就根據(jù)請(qǐng)求的內(nèi)容執(zhí)行相應(yīng)的操作,并將結(jié)果返回給客戶(hù)端(Response)。
通常客戶(hù)在瀏覽器中發(fā)起一次網(wǎng)絡(luò)訪問(wèn)的步驟如下。
(1)輸入網(wǎng)址并按Enter鍵,比如訪問(wèn)http://mysite:8080/app/index.html。
(2)瀏覽器通過(guò)域名系統(tǒng)查詢(xún)mysite的真實(shí)IP,比如212.34.98.20。
(3)向服務(wù)器212.34.98.20的8080端口發(fā)起TCP連接請(qǐng)求并建立連接。
(4)發(fā)送HTTP請(qǐng)求的內(nèi)容,包括訪問(wèn)的地址/app/index.html、訪問(wèn)方式GET、瀏覽器本身的產(chǎn)品名等。
(5)服務(wù)器返回/app/index.html中的數(shù)據(jù)作為Response發(fā)送給客戶(hù)端。如果請(qǐng)求的不是一個(gè)文件,則服務(wù)器需要執(zhí)行相應(yīng)的代碼,動(dòng)態(tài)生成且返回給客戶(hù)端。
(6)瀏覽器接收到結(jié)果后關(guān)閉與服務(wù)器的TCP連接。
(7)瀏覽器將接收到的結(jié)果呈現(xiàn)在顯示器上。
注意:域名解析本身不是HTTP的一部分,客戶(hù)端應(yīng)在向服務(wù)器建立TCP連接之前就通過(guò)DNS服務(wù)器完成域名解析工作。
以上是最典型的HTTP流程,當(dāng)今的HTTP版本還允許客戶(hù)端在一次HTTP請(qǐng)求完成后不關(guān)閉TCP連接,以便第2次發(fā)送HTTP請(qǐng)求時(shí)復(fù)用該連接,從而達(dá)到減少系統(tǒng)整體開(kāi)銷(xiāo)的目的,此技術(shù)在HTTP中叫作keep-alive。
基于HTTP的網(wǎng)站開(kāi)發(fā)
經(jīng)過(guò)幾十年的發(fā)展,已經(jīng)出現(xiàn)幾個(gè)成熟的處理HTTP的知名Web服務(wù)器。
這些Web服務(wù)器可以解析(handle)HTTP,當(dāng)Web服務(wù)器接收到一個(gè)HTTP請(qǐng)求時(shí),會(huì)根據(jù)配置的內(nèi)容返回一個(gè)靜態(tài)HTML頁(yè)面或者調(diào)用某些代碼動(dòng)態(tài)生成返回結(jié)果。
Web服務(wù)器把動(dòng)態(tài)響應(yīng)(dynamic response)產(chǎn)生的委托(delegate)給其他一些程序,例如Python代碼、JSP(JavaServer Pages)腳本、Servlets、ASP(Active Server Pages)腳本等。
無(wú)論它們的目的如何,這些服務(wù)器端(server-side)的程序通常會(huì)產(chǎn)生一個(gè)HTTP響應(yīng)讓瀏覽器瀏覽。
由于目標(biāo)操作系統(tǒng)、應(yīng)用場(chǎng)景及商業(yè)目的的不同,當(dāng)今主流的Web服務(wù)器各有特色,將它們的特性簡(jiǎn)單地概括如下。
Apache:是世界上用得最多的Web服務(wù)器,市場(chǎng)占有率達(dá)60%左右。由于其卓越的性能,Tomcat或JBoss等很多其他Web服務(wù)器使用Apache為自己提供HTTP接口服務(wù)。
Nginx:是一款輕量級(jí)、高性能的HTTP和反向代理服務(wù)器。因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。
IIS:微軟的Web服務(wù)器產(chǎn)品。由于Windows的影響,IIS是目前最流行的Web服務(wù)器產(chǎn)品之一,它的最大優(yōu)勢(shì)當(dāng)然是對(duì)微軟ASP.net及其周?chē)a(chǎn)品的支持。
Tomcat:是一個(gè)開(kāi)源服務(wù)器,是Java Servlet 2.2和JavaServer Pages 1.1技術(shù)的標(biāo)準(zhǔn)實(shí)現(xiàn)。
JBoss:是一個(gè)管理EJB的容器和服務(wù)器,支持EJB 1.1、EJB 2.0和EJB 3的規(guī)范。但JBoss的核心服務(wù)不包括支持Servlet、JSP的Web容器,一般與Tomcat或Jetty綁定使用。
當(dāng)前的主流Web服務(wù)器都實(shí)現(xiàn)了主流語(yǔ)言的可調(diào)用接口標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)如下。
CGI:Common Gateway Interface,CGI規(guī)范允許Web服務(wù)器執(zhí)行外部程序,并將它們的輸出發(fā)送給Web瀏覽器,CGI將Web的一組簡(jiǎn)單的靜態(tài)超媒體文檔變成一個(gè)完整的新的交互式媒體。
ISAPI:Internet Server Application Program Interface,是微軟提供的一套面向Web服務(wù)的API接口,它能實(shí)現(xiàn)CGI提供的全部功能,并在此基礎(chǔ)上進(jìn)行了擴(kuò)展,例如提供了過(guò)濾器應(yīng)用程序的接口。
WSGI:Web Server Gateway Interface,是一套專(zhuān)為Python語(yǔ)言制定的網(wǎng)絡(luò)服務(wù)器標(biāo)準(zhǔn)接口。本書(shū)將要學(xué)習(xí)的Python Web框架均以WSGI為基礎(chǔ)標(biāo)準(zhǔn)。
從客戶(hù)端瀏覽器的角度來(lái)看,它的每次訪問(wèn)是通過(guò)HTTP訪問(wèn)Web服務(wù)器從而獲得某種服務(wù)(下載文件、查看頁(yè)面、訂購(gòu)商品等)的,但實(shí)際上Web服務(wù)器僅起到橋梁的作用,即將瀏覽器的HTTP請(qǐng)求解碼,轉(zhuǎn)換成服務(wù)器端程序能夠識(shí)別的接口調(diào)用方式,然后將服務(wù)器端程序生成的返回封裝成HTTP Response,并返回給瀏覽器。
服務(wù)器端程序、Web服務(wù)器、客戶(hù)端之間的關(guān)系如圖2所示。


圖2 服務(wù)器端程序
最簡(jiǎn)單的服務(wù)器端程序可以是直接讀取某文件或返回固定的網(wǎng)頁(yè)內(nèi)容;稍復(fù)雜一些的服務(wù)器端程序需要處理客戶(hù)端通過(guò)HTTP、URL、HTML中傳入的參數(shù)、動(dòng)態(tài)執(zhí)行邏輯代碼、在數(shù)據(jù)庫(kù)或緩存中讀寫(xiě)數(shù)據(jù)等一系列操作,才能最終生成調(diào)用結(jié)果。
實(shí)戰(zhàn)演練
建立安全的HTTPS網(wǎng)站
普通HTTP站點(diǎn)的協(xié)議與數(shù)據(jù)以明文方式在網(wǎng)絡(luò)上傳輸,而HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)是以安全為目標(biāo)的HTTP通道,即在HTTP下加入SSL層,通過(guò)SSL達(dá)到數(shù)據(jù)加密及身份認(rèn)證的功能。
目前幾乎所有的銀行、證券、公共交通的網(wǎng)站均以HTTPS方式搭建。
OpenSSL是一個(gè)強(qiáng)大的免費(fèi)Socket層密碼庫(kù),蘊(yùn)含了主要的密碼算法、常用的密鑰和證書(shū)封裝管理功能及SSL協(xié)議。目前大多數(shù)網(wǎng)站通過(guò)OpenSSL工具包搭建HTTPS站點(diǎn),其步驟如下。
在服務(wù)器中安裝OpenSSL工具包。
生成SSL密鑰和證書(shū)。
將證書(shū)配置到Web服務(wù)器。
在客戶(hù)端安裝CA證書(shū)。
本節(jié)演示在Linux Ubuntu下OpenSSL的使用方法,以及Nginx在Linux下的證書(shū)配置方式。
Windows中OpenSSL的使用方式與Linux中的完全一致,讀者可以自行嘗試。
1.在服務(wù)器中安裝OpenSSL工具包
通過(guò)如下兩條命令安裝OpenSSL:
# sudo apt-get install openssl# sudo apt-get install libssl-dev
命令運(yùn)行成功后,OpenSSL命令和配置文件將被安裝到Linux系統(tǒng)目錄中。
OpenSSL命令:/usr/bin/openssl。
配置文件:/usr/lib/ssl/*。
2.生成SSL密鑰和證書(shū)
通過(guò)如下步驟生成CA證書(shū)ca.crt、服務(wù)器密鑰文件server.key和服務(wù)器證書(shū)server.crt:
// 生成CA 密鑰# openssl genrsa -out ca.key 2048// 生成CA證書(shū),days參數(shù)以天為單位設(shè)置證書(shū)的有效期。在本過(guò)程中會(huì)要求輸入證書(shū)的所在地、公司名、站點(diǎn)名等# openssl req -x509 -new -nodes -key ca.key -days 365 -out ca.crt// 生成服務(wù)器證書(shū)RSA的密鑰對(duì)# openssl genrsa -out server.key 2048// 生成服務(wù)器端證書(shū)CSR,本過(guò)程中會(huì)要求輸入證書(shū)所在地、公司名、站點(diǎn)名等# openssl req -new -key server.key -out server.csr// 生成服務(wù)器端證書(shū) ca.crt# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
3.配置Nginx HTTPS服務(wù)器
在站點(diǎn)配置文件/etc/nginx/sites-enabled/default中添加如下server段,可以定義一個(gè)基于HTTPS的接口,該接口的服務(wù)器端程序仍舊為uWSGI接口127.0.0.1:3011。
server {listen 443; # HTTPS服務(wù)端口server_name 0.0.0.0; # 本機(jī)上的所有IP地址ssl on;ssl_certificate /etc/nginx/ssl/server.crt;ssl_certificate_key /etc/nginx/ssl/server.key;location \ {uwsgi_pass http://127.0.0.1:3011;}}
至此,我們已經(jīng)可以使用瀏覽器訪問(wèn)服務(wù)器的443端口進(jìn)行HTTPS加密通信了。

再也不用為如何學(xué)習(xí)Python迷茫了,《Python高效開(kāi)發(fā)實(shí)戰(zhàn)——Django、Tornado、Flask、Twisted(第3版)》一書(shū)本著“純碎干貨,實(shí)用至上”的原則,讓我們成為真正的全棧開(kāi)發(fā)人才。

▊《Python高效開(kāi)發(fā)實(shí)戰(zhàn)——Django、Tornado、Flask、Twisted(第3版)》
劉長(zhǎng)龍 著
暢銷(xiāo)書(shū)Python Web編程集大成之作,全面升級(jí)
Python 3.8、Django 3、Tornado 6、Flask 1.1.2、Twisted 20
作者多年P(guān)ython項(xiàng)目實(shí)踐經(jīng)驗(yàn)及代碼編寫(xiě)技巧分享
助你零基礎(chǔ)完成網(wǎng)站搭建、數(shù)據(jù)庫(kù)設(shè)計(jì)、前后端開(kāi)發(fā)
本書(shū)分為3篇:上篇是Python基礎(chǔ),帶領(lǐng)初學(xué)者實(shí)踐Python開(kāi)發(fā)環(huán)境,掌握基本語(yǔ)法,同時(shí)對(duì)網(wǎng)絡(luò)協(xié)議、Web客戶(hù)端技術(shù)、數(shù)據(jù)庫(kù)建模等網(wǎng)絡(luò)編程基礎(chǔ)進(jìn)行深入淺出的學(xué)習(xí);中篇是Python框架,學(xué)習(xí)當(dāng)前***的Python Web框架,即Django、Tornado、Flask和Twisted,達(dá)到對(duì)各種Python網(wǎng)絡(luò)技術(shù)融會(huì)貫通的目的;下篇是Python框架實(shí)戰(zhàn),分別使用4種框架進(jìn)行項(xiàng)目實(shí)踐,利用其各自的特點(diǎn)開(kāi)發(fā)適用于不同場(chǎng)景的網(wǎng)絡(luò)程序。本書(shū)內(nèi)容精練、重點(diǎn)突出、實(shí)例豐富、講解通俗,是廣大網(wǎng)絡(luò)應(yīng)用設(shè)計(jì)和開(kāi)發(fā)人員不可多得的一本參考書(shū)。
(京東滿(mǎn)100減50,快快搶購(gòu)吧!)
推薦閱讀
(點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)
23個(gè)優(yōu)秀的機(jī)器學(xué)習(xí)數(shù)據(jù)集
老鐵,三連支持一下,好嗎?↓↓↓
