day052 http協議,web框架、Django初識

本節內容:

一、http協議
二、web框架的概念
三、Django簡介(初識引入)

1、http協議

Hypertext Transfer Protocol,超文本傳輸協議

所謂協議,就是指雙方遵循的規範。http協議,
就是瀏覽器和服務器之間進行「溝通」的一種規範。

http是屬於「應用層的協議」,並且是基於TCP/IP協議的。
解釋:首先是基於TCP/ip協議,而後在此基礎上還有應用層的協議

一、http鏈接的時限

那麼咱們在給服務端發送請求時,獲得響應後,是否還保持的跟服務端的鏈接:
解釋:
一、在最初的http協議,獲得響應結果後,鏈接是斷開的,
此時考慮的是釋放給其餘人鏈接,不讓你長久佔用鏈接,服務器端當即關閉鏈接、釋放資源。

二、如今的http協議,會在你拿到響應結果後,保持一小段時間鏈接(大概幾秒鐘),
這樣在你又點擊時,不用開闢新的鏈接,從而提升資源利用。

二、http協議是無狀態,(不會保存以前的記錄)

也就是「服務器不知道你客戶端幹了啥」,其實很大程度上是基於性能考慮的。
後來有些業務須要查詢以前的記錄,只是coockie緩存就登場了,
後面詳細介紹

三、請求協議格式:瀏覽器丟給服務器的(重點)

通常咱們不怎麼考慮這個格式,由於瀏覽器會幫咱們弄好這一套協議

一個完整的http請求消息,包含一個請求行,若干個消息頭(請求頭),換行,實體內容

請求方式:一、get的話是將路徑拼接在域名後,數據也是,大小有限制,
二、post這是寫在實體內容裏,不會顯示在URL中,數據大小不限,但仍是有安全問題
請求行:描述客戶端的請求方式、請求資源的名稱、http協議的版本號。 例如: GET/BOOK/JAVA.HTML HTTP/1.1

請求頭(消息頭)包含(客戶機請求的服務器主機名,客戶機的環境信息等):
Accept:用於告訴服務器,客戶機支持的數據類型  (例如:Accept:text/html,image/*)
Accept-Charset:用於告訴服務器,客戶機採用的編碼格式
Accept-Encoding:用於告訴服務器,客戶機支持的數據壓縮格式
Accept-Language:客戶機語言環境
Host:客戶機經過這個服務器,想訪問的主機名
If-Modified-Since:客戶機經過這個頭告訴服務器,資源的緩存時間
Referer:客戶機經過這個頭告訴服務器,它(客戶端)是從哪一個資源來訪問服務器的(防盜鏈)
User-Agent:客戶機經過這個頭告訴服務器,客戶機的軟件環境(操做系統,瀏覽器版本等)
Cookie:客戶機經過這個頭,將Coockie信息帶給服務器
Connection:告訴服務器,請求完成後,是否保持鏈接
Date:告訴服務器,當前請求的時間

(換行)
實體內容:
就是指瀏覽器端經過http協議發送給服務器的實體數據。例如:name=dylan&id=110
(get請求時,經過url傳給服務器的值。post請求時,經過表單發送給服務器的值)

四、http響應協議格式:服務器返回給瀏覽器的(重點)

一個狀態行,若干個消息頭,以及實體內容
響應頭(消息頭)包含:
Location:這個頭配合302狀態嗎,用於告訴客戶端找誰
Server:服務器經過這個頭,告訴瀏覽器服務器的類型
Content-Encoding:告訴瀏覽器,服務器的數據壓縮格式
Content-Length:告訴瀏覽器,回送數據的長度
Content-Type:告訴瀏覽器,回送數據的類型
Last-Modified:告訴瀏覽器當前資源緩存時間
Refresh:告訴瀏覽器,隔多長時間刷新
Content-Disposition:告訴瀏覽器如下載的方式打開數據。例如: context.Response.AddHeader("Content-Disposition","attachment:filename=aa.jpg");                                        context.Response.WriteFile("aa.jpg");
Transfer-Encoding:告訴瀏覽器,傳送數據的編碼格式
ETag:緩存相關的頭(能夠作到實時更新)
Expries:告訴瀏覽器回送的資源緩存多長時間。若是是-1或者0,表示不緩存
Cache-Control:控制瀏覽器不要緩存數據   no-cache
Pragma:控制瀏覽器不要緩存數據          no-cache

Connection:響應完成後,是否斷開鏈接。  close/Keep-Alive
Date:告訴瀏覽器,服務器響應時間

狀態行:  例如:  HTTP/1.1  200 OK   (協議的版本號是1.1  響應狀態碼爲200  響應結果爲 OK)

實體內容(實體頭):響應包含瀏覽器可以解析的靜態內容,例如:html,純文本,圖片等等信息

關於http協議的更多具體細節,能夠參照http RFC文檔。

第一部分:狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。
第一行爲狀態行,(HTTP/1.1)代表HTTP版本爲1.1版本,狀態碼爲200,狀態消息爲(ok)

第二部分:消息報頭,用來講明客戶端要使用的一些附加信息
第二行和第三行爲消息報頭,
Date:生成響應的日期和時間;Content-Type:指定了MIME類型的HTML(text/html),編碼類型是UTF-8

第三部分:空行,消息報頭後面的空行是必須的
第四部分:響應正文,服務器返回給客戶端的文本信息。
空行後面的html部分爲響應正文。

一、響應狀態碼

詳解html

狀態代碼有三位數字組成,第一個數字定義了響應的類別,共分五種類別:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操做
4xx:客戶端錯誤--請求有語法錯誤或請求沒法實現
5xx:服務器端錯誤--服務器未能實現合法的請求

常見狀態碼:

200 OK                        //客戶端請求成功
400 Bad Request               //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized              //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用
403 Forbidden                 //服務器收到請求,可是拒絕提供服務
404 Not Found                 //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error     //服務器發生不可預期的錯誤
503 Server Unavailable        //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常

2、web應用與web框架

對於全部的Web應用,本質上其實就是一個socket服務端,
用戶的瀏覽器其實就是一個socket客戶端。

一、web應用的本質

最簡單的Web應用就是先把HTML用文件保存好,用一個現成的HTTP服務器軟件,
接收用戶請求,從文件中讀取HTML,返回。

代碼示例java

import socket sock=socket.socket() sock.bind(("127.0.0.1",8800)) sock.listen(5) while 1: conn,addr=sock.accept() recv_data=conn.recv(1024) print("recv_data:",recv_data) #conn.send(b"HTTP/1.1 200 ok\r\ncontent-length:12\r\n\r\nHello World!") with open("login.html","rb") as f: data=f.read() conn.send(b"HTTP/1.1 200 ok\r\n\r\n"+data) conn.close(). 
Python

二、基於wsgiref模塊的自定義的web,詳細示例

正確的作法是底層代碼由專門的服務器軟件實現,咱們用Python專一於生成HTML文檔。

 由於咱們不但願接觸到TCP鏈接、HTTP原始請求和響應格式,
 因此,須要一個統一的接口,讓咱們專心用Python編寫Web業務。

 這個接口就是WSGI:Web Server Gateway Interface。
 示例看一遍,知道過程就好了,爲得是爲後面知道Django的各個文件的做用
 重點是Django

初步示例1python

from wsgiref.simple_server import make_server def application(environ, start_response): #print("environ",environ) start_response('200 OK', [('Content-Type', 'text/html')]) # 獲取當前請求路徑 print("PATH_INFO",environ.get("PATH_INFO")) path=environ.get("PATH_INFO") # 分支 if path == "/login": with open("login.html","rb") as f: data=f.read() return [data] elif path == "/index": with open("home.html", "rb") as f: data = f.read() return [data] else: return [b"<h1>404!</h1>"] httpd = make_server('', 8080, application) # 開始監聽HTTP請求: httpd.serve_forever() 
Python

初步示例2web

from wsgiref.simple_server import make_server # 視圖函數 def home(): with open("home.html", "rb") as f: data = f.read() return data def login(): with open("login.html", "rb") as f: data = f.read() return data def application(environ, start_response): #print("environ",environ) start_response('200 OK', [('Content-Type', 'text/html')]) # 獲取當前請求路徑 print("PATH_INFO",environ.get("PATH_INFO")) path=environ.get("PATH_INFO") # 分支 if path == "/login": ret=login() elif path == "/index": ret=home() else: ret=b"<h1>404!</h1>" return [ret] httpd = make_server('', 8080, application) # 開始監聽HTTP請求: httpd.serve_forever() 
Python

初步示例3數據庫

from wsgiref.simple_server import make_server # 視圖函數 def home(): with open("home.html", "rb") as f: data = f.read() return data def login(): with open("login.html", "rb") as f: data = f.read() return data def notFound(): return b"<h1>404!!!</h1>" def application(environ, start_response): #print("environ",environ) start_response('200 OK', [('Content-Type', 'text/html')]) # 獲取當前請求路徑 print("PATH_INFO",environ.get("PATH_INFO")) path=environ.get("PATH_INFO") # 分支 urlpatterns=[ ("/login",login), ("/index",home), ] func=None for item in urlpatterns: if path == item[0]: func=item[1] break if not func: ret=notFound() else: ret=func() return [ret] httpd = make_server('', 8080, application) # 開始監聽HTTP請求: httpd.serve_forever() 
Python

三、DIY一個本身的web框架

manage.pydjango

from wsgiref.simple_server import make_server from views import * from urls import urlpatterns def application(environ, start_response): #print("environ",environ) start_response('200 OK', [('Content-Type', 'text/html')]) # 獲取當前請求路徑 print("PATH_INFO",environ.get("PATH_INFO")) path=environ.get("PATH_INFO") # 分支 func=None for item in urlpatterns: if path == item[0]: func=item[1] break if not func: ret=notFound(environ) else: ret=func(environ) return [ret] httpd = make_server('', 8080, application) # 開始監聽HTTP請求: httpd.serve_forever() 
Python

urls.py瀏覽器

from views import * urlpatterns = [ ("/timer",timer) ] 
Python

views.py緩存

# 視圖函數 def timer(environ): import datetime now=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") return now.encode("utf8") def notFound(environ): return b"<h1>404...</h1>" 
Python

3、Django介紹

一、mvc模型(最典型的MVC就是jsp+servlet+javabean模式)

MVC的全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫

二、mtv模型(Django)

Django的MTV分別表明:

Model(模型):和數據庫相關的,負責業務對象與數據庫的對象(ORM)

Template(模板):放全部的html文件

模板語法:目的是將白變量(數據庫的內容)如何巧妙的嵌入到html頁面中

View(視圖):負責業務邏輯,並在適當的時候調用Model和Template

此外,Django還有一個URL分發器。
它的做用是將一個個URL的頁面請求分別發給不一樣的Views處理,Views再調用相應的Model和Template。


二、Django的基本命令

一、下載Django

在cmd窗口下,pip install django==2.1.1   (2.1.1是版本號)

二、建立一個Django對象

django-admin.py  startproject   項目名稱
django-admin.py  startproject    mysite

三、建立一個應用

python3 manage.py startapp blog(應用名稱)

四、啓動Django項目

python manage.py runserver  8080(不寫就是默認8000端口)

五、建立表命令

python3 manage.py makemigrations

python3 manage.py migrate
相關文章
相關標籤/搜索