web框架介紹:
- web框架就是一個骨架和開發(fā)的一系列工具的集合。我們只需要通過一些工具稍作修飾即可完成一個作品。方便web開發(fā) , 不需要一直做一些重復(fù)性的操作。
相當于一個半成品
- web框架的存在可以減少應(yīng)用開發(fā)的周期 , 提高效率與質(zhì)量 ; 降低維護成本。
- 所有的web框架的本質(zhì)就是一個socket服務(wù)端;用戶通過瀏覽器進行數(shù)據(jù)訪問,瀏覽器就充當了socket客戶端。
常見軟件的架構(gòu):
CS架構(gòu):
CS:(Clinet & Server) 服務(wù)端和客戶端的架構(gòu),這個架構(gòu)是從用戶層面進行劃分的,通過這個架構(gòu)開發(fā)出來的東西對用戶的系統(tǒng)環(huán)境依賴比較大。
(微信 , 抖音 , QQ , pycharm……),一般都需要進行下載。
BS架構(gòu):
BS:(Browser & Server) 瀏覽器和服務(wù)端架構(gòu) , 這個模式下用戶只需要通過瀏覽器發(fā)送http協(xié)議請求就可以獲取到對應(yīng)的資源.(百度 ,博客園 , 力扣 , CSDN , B站…… ),一般可以通過瀏覽器在線訪問。
BS的本質(zhì)也是CS架構(gòu) , BS中瀏覽器充當了客戶端。
網(wǎng)絡(luò)通信:
socket知識復(fù)習(xí):
服務(wù)端代碼邏輯:
socket服務(wù)端:
- 創(chuàng)建socket對象
- 綁定IP和端口號(1024-65535)
- 設(shè)置監(jiān)聽,最大連接數(shù)
- 創(chuàng)立對等連接套接字
- 等待客戶端的連接
- 數(shù)據(jù)的接收與發(fā)送
- 關(guān)閉
客戶端代碼邏輯:
socket客戶端:
- 創(chuàng)建socket對象
- 連接服務(wù)端的IP和端口號
- 數(shù)據(jù)的接收與發(fā)送
- 關(guān)閉
socket代碼演示:
服務(wù)端代碼演示:
import socket
server = socket.socket() #默認是TCP協(xié)議
server.bind(("127.0.0.1",8098)) #以元組形式傳入,綁定端口號和IP
server.listen(5)
while True:
conn,addr = server.accept() #創(chuàng)立對等連接套接字
print(conn) #<socket.socket fd=400, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8098), raddr=('127.0.0.1', 53894)>,這是連接對象,接收和發(fā)送數(shù)據(jù)用連接對象
print(addr) #('127.0.0.1', 53894)
data = conn.recv(1024)
print(data.decode('utf-8'))
conn.send(data)
客戶端代碼演示:
import socket
client = socket.socket()
client.connect(("127.0.0.1",8098))
while True:
message = input("請輸入你給客戶端發(fā)送的信息:")
if not message:continue #如果數(shù)據(jù)為空,則不發(fā)送。這一代碼是避免發(fā)送空數(shù)據(jù)過去
if message == "q":break #手動輸入q結(jié)束
client.send(message.encode("utf-8"))
data = client.recv(1024)
print(data.decode("utf-8"))
tips: 我可以通過這種方式在不同電腦上進行數(shù)據(jù)傳輸么?
在其他電腦上寫一個socket寫一個客戶端 , 訪問我的服務(wù)端。(前提兩臺電腦必須是在同一個局域網(wǎng)中。)
手寫框架:
基于socket實現(xiàn)框架:
我們把127.0.0.1:8099輸入瀏覽器進行訪問
import socket
server = socket.socket() #默認是TCP協(xié)議
server.bind(("127.0.0.1",8089))
server.listen(10) #設(shè)置監(jiān)聽
while True:
conn,addr = server.accept()
data = conn.recv(1024).decode("utf-8")
print(data)
響應(yīng)無效,不等于訪問數(shù)據(jù)失敗。文章來源:http://www.zghlxwxcb.cn/news/detail-467213.html
課程一小時處文章來源地址http://www.zghlxwxcb.cn/news/detail-467213.html
改良版:
import socket
server = socket.socket() # 默認是TCP協(xié)議
server.bind(('127.0.0.1', 8098))
server.listen(5)
# 把不同的url響應(yīng)的數(shù)據(jù)封裝成函數(shù)
def index(url):
return bytes(f'我是{url}響應(yīng)的頁面數(shù)據(jù)' , encoding='gbk')
def ac(url):
return bytes('我好帥', encoding='gbk')
# 可以把url以及對應(yīng)功能函數(shù)用字典進行對應(yīng)關(guān)系
url_dict = {
'/index/':index,
'/ac/':ac
}
while True:
sock, address = server.accept()
data = sock.recv(1024).decode('utf-8')
# 瀏覽器發(fā)送的http協(xié)議請求
print(data)
url = data.split(' ')[1]
# 以http協(xié)議發(fā)送響應(yīng)數(shù)據(jù) , 前提就是先發(fā)送一個http協(xié)議
sock.send(b'HTTP1.1 200 OK \r\n\r\n')
# 定義一個變量作為程序的標志
msg = 1
# 循環(huán)遍歷url對應(yīng)關(guān)系的字典
for i in url_dict:
# 判斷獲取到的數(shù)據(jù)是否等于請求的url
if i == url:
# 代用url對應(yīng)的功能函數(shù)
func = url_dict[i](url)
sock.send(func)
msg = 0
# 判斷是否有對應(yīng)url響應(yīng)數(shù)據(jù)
if msg :
sock.send('404 not found'.encode('utf-8'))
基于wsgiref實現(xiàn)框架:
- 在web開發(fā)中程序一般會分為兩個部分
- 服務(wù)器程序:負責(zé)對socke服務(wù)器進行封裝,處理請求的
- 應(yīng)用程序:負責(zé)具體的邏輯處理 , 具體做事的。
- WSGI:是一個規(guī)范化接口,定義了Web服務(wù)器如何與python應(yīng)用程序進行交互。里面把所有的http請求和解析http請求協(xié)議進行包裝。
- 在python標準庫中 , 提供了WSGI的服務(wù)器模塊 wsgiref , wsgiref里面封裝了socket代碼,Django底層也是使用這個模塊進行socket的操作
from wsgiref.simple_server import make_server
# 把不同的url響應(yīng)的數(shù)據(jù)封裝成函數(shù)
def index(url):
return bytes(f'我是{url}響應(yīng)的頁面數(shù)據(jù)' , encoding='gbk')
def ac(url):
return bytes('阿宸好帥', encoding='gbk')
# 可以把url以及對應(yīng)功能函數(shù)用字典進行對應(yīng)關(guān)系
url_dict = {
'/index/':index,
'/ac/':ac
}
# 響應(yīng)函數(shù)
def run(environ , response):
'''
:param environ: 接收的是請求相關(guān)的所有數(shù)據(jù) , wsgiref模塊將http請求封裝成字典類型的數(shù)據(jù)
:param response:響應(yīng)數(shù)據(jù) , 是一個函數(shù)
:return: 返回客戶端的數(shù)據(jù) , 以列表的形式返回
'''
# 響應(yīng)數(shù)據(jù) , 傳入響應(yīng)狀態(tài)碼 , 響應(yīng)頭
response('200 OK' , [])
# 獲取請求的url
url = environ['PATH_INFO']
# 定義一個變量作為程序的標志
msg = 1
# 循環(huán)遍歷url對應(yīng)關(guān)系的字典
for i in url_dict:
# 判斷獲取到的數(shù)據(jù)是否等于請求的url
if i == url:
# 代用url對應(yīng)的功能函數(shù)
response_data = url_dict[i](url)
msg = 0
# 判斷是否有對應(yīng)url響應(yīng)數(shù)據(jù)
if msg:
response_data = b'404 not found'
# 將獲取到的數(shù)據(jù)響應(yīng)到瀏覽器中
return [response_data]
if __name__ == '__main__':
# 實例化 , 創(chuàng)建服務(wù)端對象 , 實時監(jiān)聽請求
client = make_server('127.0.0.1',10086 , run)
# 啟動服務(wù)端
client.serve_forever()
靜態(tài)頁面數(shù)據(jù)響應(yīng):
from wsgiref.simple_server import make_server
# 把不同的url響應(yīng)的數(shù)據(jù)封裝成函數(shù)
def index(url):
# 服務(wù)器響應(yīng)前端頁面
with open('index.html' , 'r' , encoding='utf-8') as f:
data = f.read()
# 講讀取出來的頁面數(shù)據(jù)進行返回給瀏覽器
return bytes(data.encode('utf-8'))
def ac(url):
return bytes('阿宸好帥', encoding='gbk')
# 可以把url以及對應(yīng)功能函數(shù)用字典進行對應(yīng)關(guān)系
url_dict = {
'/index/':index,
'/ac/':ac
}
# 響應(yīng)函數(shù)
def run(environ , response):
'''
:param environ: 接收的是請求相關(guān)的所有數(shù)據(jù) , wsgiref模塊將http請求封裝成字典類型的數(shù)據(jù)
:param response:響應(yīng)數(shù)據(jù) , 是一個函數(shù)
:return: 返回客戶端的數(shù)據(jù) , 以列表的形式返回
'''
# 響應(yīng)數(shù)據(jù) , 傳入響應(yīng)狀態(tài)碼 , 響應(yīng)頭
response('200 OK' , [])
# 獲取請求的url
url = environ['PATH_INFO']
# 定義一個變量作為程序的標志
msg = 1
# 循環(huán)遍歷url對應(yīng)關(guān)系的字典
for i in url_dict:
# 判斷獲取到的數(shù)據(jù)是否等于請求的url
if i == url:
# 代用url對應(yīng)的功能函數(shù)
response_data = url_dict[i](url)
msg = 0
# 判斷是否有對應(yīng)url響應(yīng)數(shù)據(jù)
if msg:
response_data = b'404 not found'
# 將獲取到的數(shù)據(jù)響應(yīng)到瀏覽器中
return [response_data]
if __name__ == '__main__':
# 實例化 , 創(chuàng)建服務(wù)端對象 , 實時監(jiān)聽請求
client = make_server('127.0.0.1',10086 , run)
# 啟動服務(wù)端
client.serve_forever()
到了這里,關(guān)于【web框架】——Django——如桃花來的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!