一、web應用程序
1 what:用瀏覽器訪問的應用程序
2 優點:
-不需要客戶端
-更新直接在服務端更新,客戶端感知不到
-跨平台性好(注意:go語言是跨平台編譯)
ps:平台編譯 比如:可以在win平台編譯出linux下的可執行文件
3 缺點:
-強調瀏覽器的適用性(即兼容性)
-用戶的數據都保存在軟件廠商那邊
二、bs、cs架構
1 bs:瀏覽器---服務端 (本質還是cs) web開發是bs架構
2 cs:客戶端---服務端
注意:瀏覽器發出去的請求都符合http協議
三、自己寫一個web應用,並實現動態頁面
知識補充:
靜態頁面&動態頁面
#靜態頁面:靜態的html,內容不會改變,每次訪問看到的數據都一樣
#動態頁面:頁面的數據會發生變化,每次訪問看到的可能都不一樣(數據來源可能是數據庫)
客戶端是瀏覽器,服務端自己寫(python)
#main.py
# 1 寫一個web應用的服務端,通過瀏覽器(客戶端),來訪問
import socket
server = socket.socket()
# server.bind(('127.0.0.1', 8080)) #在符合http協議的情況下,在瀏覽器輸入127.0.0.1:8080就可以獲取數據
server.bind(('192.168.43.75', 8081))
server.listen(5)
while True:
conn, addr = server.accept()
# 接收瀏覽器傳過來的數據
data = conn.recv(1024)
print(data)
# 返回給瀏覽器數據(不符合http協議,所以會返回發送的響應無效)
# conn.send(b'hello world')
# (1)返回數據符合http協議,瀏覽器就能識別了,返回hello world
# conn.send(b'HTTP/1.1 200 ok \r\n\r\n hello world')
#(2) 返回符合html格式的數據 #如果title是中文就會亂碼需要修改編碼
# conn.send('HTTP/1.1 200 ok \r\n\r\n <h1>title</h1>'.encode('utf-8'))
# (3)返回一個html頁面,打開文件,轉成二進制,send一下
# with open('index.html','r',encoding='utf-8') as f:
# data1=f.read()
#把返回的數據拼起來
# response='HTTP/1.1 200 ok \r\n\r\n %s'%data1
# conn.send(response.encode('utf-8'))
## (4)實現動態頁面(靜態頁面,動態頁面)
# 在index.html中寫一個特殊標記,使用python的變量去替換這個特殊標記
import time
ctime=time.time() # 可能是數據庫查詢出來的
with open('index.html','r',encoding='utf-8') as f:
data1=f.read().replace('{{time}}',str(ctime))
response='HTTP/1.1 200 ok \r\n\r\n %s'%data1
conn.send(response.encode('utf-8'))
conn.close()
#index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{time}}
<br>
<br>
<img height="100" width="100" src="a.jpg" alt="">
</body>
</html>
四、http協議
具體參照博客:
HTTP協議之請求方法,響應頭信息,狀態碼
https://www.cnblogs.com/guojieying/p/13651818.html
1 HTTP協議是Hyper Text Transfer Protocol(超文本傳輸協議)的縮寫,是用於萬維網服務器與本地瀏覽器之間傳輸超文本的傳送協議
2 應用層的協議
3 http協議特性(記一下)
-1 基於tcp/ip之上的應用層協議
-2 基於請求-響應模式
-3 無狀態保存
-4 無連接
4 請求協議(瀏覽器發出來的)(記住)
三部分:請求首行,請求頭,請求體
'''
# 請求首行(以第一個\r\n區分的),
# 請求首行里有請求方式:GET 請求地址:/lili/handsome 協議:http 版本:1.1版本
GET /lili/handsome HTTP/1.1\r\n
# 請求頭(key:value形式)
Host: 192.168.11.211:8080\r\n
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n\r\n'
# \r\n\r\n 下面的是請求體的內容
'''
5 響應協議
'''
# 響應首行 響應協議和版本:HTTP/1.1 響應的狀態碼和標志:200 ok
HTTP/1.1 200 ok \r\
# 響應頭(key:value形式)
key:value
key:valu
\r\n\r\n
# 響應體:在瀏覽器里看到的東西(瀏覽器能把下面的html渲染成好看的樣子)
<!DOCTYPE html>
<html lang="en">
<h1>hello</h1>
</html>
'''
6 響應狀態碼
-1xx:請求正在處理(用戶一般看不到)
-2xx:請求成功(200)
-3xx:重定向(301 302)訪問一個地址,轉到另一個地址
-4xx:客戶端錯誤(404,403)
-5xx:服務端錯誤(502)
7 url:統一資源定位符
# 格式
http://127.0.0.1:8080/order.html
ftp://xxx
協議://IP:端口(80)/路徑?name=lqz&age=18
統一資源定位符是可以從互聯網上訪問資源的一種方式,協議就是資源的地址