Python中WEB開發(一)
CS即客戶端、伺服器程式設計:
客戶端、服務端之間需要使用Socket,約定協議、版本(往往使用的協議是TCP或者UDP),制定地址和埠,就可以通訊了。
客戶端、服務端傳輸資料,資料可以有一定的格式,雙方必須線約定好。
BS程式設計,即Browser、Server開發:
Browser瀏覽器,一種特殊的客戶端,支援HTTP(s)協議,能夠通過URL向服務端發起請求,等待服務端返回HTML等資料,並在瀏覽器內視覺化展示的程式。
Server,支援HTTP(s)協議,能夠接受眾多客戶端發起的HTTP協議請求,經過處理,將HTML等資料返回給瀏覽器。
本質上來說,BS是一種特殊的CS,即客戶端必須是一種支援HTTP協議且能解析並渲染HTML的軟體,服務端必須是能夠接收客戶端HTTP訪問的服務軟體。
HTTP協議底層基於TCP協議實現。
BS開發分為兩端開發:
(1) 客戶端開發,或稱前端開發。HTML,CSS,JavaScript等。
(2)服務端開發,Python有WSGI、Flask、Tornado等。
HTTP協議
協議
HTTP協議是無狀態協議。
同一個客戶端的兩次請求之間沒有任何關係,從伺服器端角度來說,它不知道這兩個請求來自同一個客戶端。
cookie
鍵值對資訊。
瀏覽器發起每一請求時,都會把cookie資訊發給伺服器端。
是一種客戶端、服務端傳遞資料的技術。
服務端可以通過判斷這些資訊,來確定這次請求是否和之前的請求有關聯。
一般來說cookie資訊實在伺服器端生成,返回給客戶端的。
客戶端可以自己設定cookie資訊。
URL組成
URL可以說就是地址,uniform resource locator 統一資源定位符,每一個連結指向一個資源供客戶端訪問。
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
例如,通過下面URL訪問網頁:
http://www.magedu.com/pathon/index.html?id=5&name=python
訪問靜態資源時,通過上面的這個URL訪問的是網站的某路徑下的Index.html檔案,而這個檔案對應磁碟上的真實的檔案。就會從磁碟上讀取這個檔案,並把檔案的內容發揮瀏覽器端。
scheme模式、協議:
http、ftp、https、file、mailto等等。mysql等都是類似這樣寫。
host:port :
www.magedu.com:80,80埠是預設埠可以不寫。域名會使用DNS解析,域名會解析成IP才能使用。實際上會對解析後返回的IP的TCP的80埠發起訪問。
/path/to/resource:
path,指向資源的路徑。
?key1=value1&key2=value2:
query string , 查詢字串,問號分割,後面key=value形式,且使用&符號分割。
HTTP訊息
訊息分為Request、Response。
Request:瀏覽器向伺服器發起的請求。
Response:伺服器對客戶端請求的響應。
請求和響應訊息都是由請求行、Header訊息報頭、Body訊息正文組成。
請求
請求訊息行:請求方法Method 請求路徑 協議版本 CRLF
請求方法Method:
GET 請求獲取URL對應的資源
POST 提交資料至伺服器端
HEAD 和GET類似,不過不返回訊息正文
常見傳遞資訊的方式:
(1) GET方法使用Query String
http://www.magedu.com/pathon/index.html?id=5&name=python
通過查詢字串在URL中傳遞引數
(2) POST方法提交資料
(3) URL中本身就包含著資訊
http://www.magedu.com/python/student/001
響應
響應訊息行:協議版本 狀態碼 訊息描述 CRLF
status code狀態碼:
狀態碼在響應頭第一行:
1xx :提示資訊,表示請求已被成功接收,繼續處理
2xx: 表示正常響應
200 正常返回了網頁內容
3xx: 重定向
301 頁面永久性移走,永久重定向。返回新的URL,瀏覽器會根據返回的URL發起新的Request請求。
302 臨時重定向
304 資源未修改,瀏覽器使用本地快取
4xx: 客戶端請求錯誤
404 Not Found , 網頁找不到,客戶端請求的資源有錯
400 請求語法錯誤
401 請求要求身份驗證
5xx: 伺服器端錯誤
500 伺服器內部錯誤
502 上游伺服器錯誤,如nginx反向代理的時候
無狀態,有連線和短連線
無狀態:伺服器無法知道兩次請求之間的聯絡,即使是前後兩次同一個瀏覽器也沒法判斷出是出於一個瀏覽器的請求。後面通過cookie和session來判斷。
有連線:是因為它基於TCP協議,是面向連線的,需要3次握手、4次斷開。
短連線:自HTTP 1.1之前,都是一個請求一個連線,而TCOP的連線建立銷燬成本高,對伺服器有很大的影響。所以,自HTTP 1.1之後,支援keep-alive,預設也是開啟的,一個連線開啟後,會保持一段時間(可設定),瀏覽器再訪問該伺服器就使用這個TCP連線,減輕了伺服器壓力,提高了效率。
WSGI
WSGI主要規定了伺服器端和應用程式之間的介面。
WSGI伺服器--wsgiref(實驗用)
wsgiref是一個WSGI參考實現庫。
wsgiref.simple_server 模組實現一個簡單的WSGI HTTP伺服器。
wsgiref.simple_server.make_server(host,port,app,server_class=WSGIServer,handler_class=WSGIRequestHandler) 啟動一個WSGI伺服器。
wsgiref.simple_server.demo_app(environ,start_response) 一個函式,小巧完整的WSGI的應用程式的實現。
WSGI 伺服器作用
(1) 監聽HTTP服務埠(TCPServer,預設埠80)
(2)接收瀏覽器端的HTTP請求並解析封裝成environ環境資料
(3)負責呼叫應用程式,將environ和start_response方法傳入
(4)將應用程式響應的正文封裝成HTTP響應報文返回給瀏覽器端
WSGI APP應用程式端
1、應用程式應該是一個可呼叫物件,Python中應該是函式、類、實現了__call__方法的類的例項。
2、這個可呼叫物件應該接收兩個引數
3、以上可呼叫物件的實現,都必須返回一個可迭代物件
environ和start_response這兩個引數名可以是任何合法名,但是一般預設都是這2個名字。
environ
environ是包含HTTP請求資訊的dict物件
start_response
它是一個可呼叫物件。有三個引數,定義如下:
start_response(status,response_headers,exc_info=None)
status 是狀態碼,如 200 OK
response_headers 是一個元素為二元組的列表,例如[('Content-Type','text/plain;charset=utf-8')]
exc_info 在錯誤處理的時候使用
start_response 應該在返回可迭代物件之前呼叫,因為它返回的是Rsponse Header。返回的可迭代物件是Response Body.
伺服器端
伺服器程式需要呼叫符合上述定義的可呼叫物件APP,傳入environ 、start_response, APP處理後,返回響應頭和可迭代物件的正文,由伺服器封裝返回瀏覽器端。
simple_server 只是參考用,不能用於生產
測試用命令
-I 使用HEAD方法
-X 指定方法,-d 傳輸資料
到這裡,就完成了一個簡單的WEB程式開發。
WEB伺服器
1、本質上就是一個TCP伺服器,監聽在特定埠上
2、支援HTTP協議,能夠將HTTP請求報文進行解析,能夠把響應資料進行HTTP協議的報文封裝並返回瀏覽器端。
3、實現了WSGI協議,該協議約定了和應用程式之間的介面。
APP應用程式
1、遵從WSGI協議
2、本身是一個可呼叫物件
3、呼叫start_response,返回響應頭部
4、返回包含正文的可迭代物件
相關文章
- Python Web開發PythonWeb
- 什麼是Web開發?如何成為一個Python Web開發人員?WebPython
- Python的web開發PythonWeb
- 《Python web開發》筆記 一:網頁開發基礎PythonWeb筆記網頁
- python中web開發框架Django的學習PythonWeb框架Django
- 學python可以做Web開發嗎?python適合Web開發嗎?PythonWeb
- Python Web開發:從 wsgi 開始PythonWeb
- Web | 淺談用Python進行Web開發WebPython
- python開發本地WEB專案PythonWeb
- python怎麼做web開發PythonWeb
- 如何理解Python web開發技術PythonWeb
- 《Flask Web開發 基於Python的Web應用開發實戰》簡評FlaskWebPython
- python web開發-flask中日誌的使用PythonWebFlask
- 分分鐘教你Python Web開發框架DjangoPythonWeb框架Django
- Python Web開發需要學習什麼?Python基礎!PythonWeb
- 讓 Android 開發像 web 開發一樣爽AndroidWeb
- (第一篇)記一次python分散式web開發(利用docker)Python分散式WebDocker
- 《Python Web開發實戰》隨書原始碼PythonWeb原始碼
- 三個最火的Python Web開發框架PythonWeb框架
- 直播| Python Web開發者的破局之道PythonWeb
- python為什麼不適合web開發PythonWeb
- 《Flask Web開發:基於Python的Web應用開發實戰》學習筆記(二)FlaskWebPython筆記
- 我的第一個python web開發框架(33)——介面程式碼重構PythonWeb框架
- Python後臺開發(第一章補充: Web前端技術)PythonWeb前端
- MDN之學習 Web 開發(一)【Web API簡介】WebAPI
- PHP和Python哪個更適合Web開發?Python學習!PHPPythonWeb
- Python常用的web開發工具,你瞭解多少?PythonWeb
- python和Java哪個更適合web開發?PythonJavaWeb
- GO vs Python哪個更適合做web開發?GoPythonWeb
- Python Web開發: 教你如何解放路由管理PythonWeb路由
- 使用Python快速開發API和Web的工具:ApiLogicServerPythonAPIWebServer
- Python和Java,哪個更適合web開發?PythonJavaWeb
- 2025年8個熱門Python Web開發框架PythonWeb框架
- GO 語言 Web 開發實戰一GoWeb
- Web 開發中 Blob 與 FileAPI 使用簡述WebAPI
- Web3開發中的狀態同步Web
- 基於Python+Django+Jquery架構的Web開發PythonDjangojQuery架構Web
- 為什麼要選擇Python進行Web開發?PythonWeb