全部的Web應用本質上就是一個socket服務端,而用戶的瀏覽器就是一個socket客戶端,基於請求作出響應,客戶都先請求,服務端作出對應的響應,按照http協議的請求協議發送請求,服務端按照http協議的響應協議來響應請求,這樣的網絡通訊,咱們就能夠本身實現Web框架了。css
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="css.css"> <link rel="icon" href="favicon.ico"> </head> <body> <h1>歡迎來到紅浪漫,拖鞋手牌請拿好,樓上請,男賓三位</h1> <img src="tupian.jpg" alt=""> </body> <script src="js.js"></script> </html>
h1{ background-color: red; color: white; }
alert("樓下說滴對");
要想將服務器的html代碼放在瀏覽器上,咱們必須遵循http協議:html
HTTP協議python
get的請求數據拼接在url中;web
post的請求數據在請求體中;瀏覽器
每引入一個css或js或圖片都須要向服務器請求一次拿到文件:服務器
img js css 統稱爲靜態文件網絡
D:\python3\python.exe D:/PycharmProjects/s20/Django/day01/一框架.py GET / HTTP/1.1 Host: 127.0.0.1:9000 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 GET /css.css HTTP/1.1 Host: 127.0.0.1:9000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36 Accept: text/css,*/*;q=0.1 Referer: http://127.0.0.1:9000/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 GET /tupian.jpg HTTP/1.1 Host: 127.0.0.1:9000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36 Accept: image/webp,image/apng,image/*,*/*;q=0.8 Referer: http://127.0.0.1:9000/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 GET /js.js HTTP/1.1 Host: 127.0.0.1:9000 Connection: keep-alive User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36 Accept: */* Referer: http://127.0.0.1:9000/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9
框架演示:多線程
# -*- coding: utf-8 -*- # @Time : 2019/5/15 15:18 import re import socket from threading import Thread sk = socket.socket() sk.bind(("127.0.0.1",9000)) sk.listen() def send_file(conn): msg = conn.recv(1024).decode('utf-8') conn.send(b"HTTP/1.1 200 ok \r\n\r\n") t = re.findall(".*? (/.*?) HTTP/1.1",msg) # print(t) # 獲取客戶端請求的文件 if t[0]=="/": # GET / HTTP/1.1 with open("html.html", "rb") as f: countent_html = f.read() conn.send(countent_html) conn.close() elif t[0]=="/css.css": # GET /css.css HTTP/1.1 with open("css.css", "rb") as f: countent_css = f.read() conn.send(countent_css) conn.close() elif t[0]=="/tupian.jpg": # GET /tupian.jpg HTTP/1.1 with open("tupian.jpg", "rb") as f: countent_jpg = f.read() conn.send(countent_jpg) conn.close() elif t[0]=="/js.js": # GET /js.js HTTP/1.1 with open("js.js", "rb") as f: countent_js = f.read() conn.send(countent_js) conn.close() while True: conn,addr = sk.accept() # 開啓多線程 t = Thread(target=send_file,args=(conn,)) t.start() sk.close()
# -*- coding: utf-8 -*- # @Time : 2019/5/15 15:18 import re import socket from threading import Thread sk = socket.socket() sk.bind(("127.0.0.1",9000)) sk.listen() def html(conn): conn.send(b"HTTP/1.1 200 ok \r\n\r\n") with open("html.html", "rb") as f: countent_html = f.read() conn.send(countent_html) conn.close() def css(conn): conn.send(b"HTTP/1.1 200 ok \r\n\r\n") with open("css.css", "rb") as f: countent_css = f.read() conn.send(countent_css) conn.close() def js(conn): conn.send(b"HTTP/1.1 200 ok \r\n\r\n") with open("js.js", "rb") as f: countent_js = f.read() conn.send(countent_js) conn.close() def tupian(conn): conn.send(b"HTTP/1.1 200 ok \r\n\r\n") with open("tupian.jpg", "rb") as f: countent_jpg = f.read() conn.send(countent_jpg) conn.close() def img(conn): conn.send(b"HTTP/1.1 200 ok \r\n\r\n") with open("favicon.ico", "rb") as f: countent_ico = f.read() conn.send(countent_ico) conn.close() file = [ ("/",html), ("/css.css",css), ("/js.js",js), ("/tupian.jpg",tupian), ("/favicon.ico",img), ] def send_file(conn,path): for i in file: if i[0]==path: Thread(target=i[1],args=(conn,)).start() while True: conn,addr = sk.accept() msg = conn.recv(1024).decode("utf-8") t = re.findall(".*? (/.*?) HTTP/1.1", msg) send_file(conn,t[0])
# -*- coding: utf-8 -*- # @Time : 2019/5/16 16:56 """ wsgiref模塊版web框架 """ from wsgiref.simple_server import make_server def index(environ): with open("index.html","rb") as f: content = f.read() return [content] def home(environ): with open("home.html","rb") as f: content = f.read() return [content] def log(environ): with open("favicon.ico","rb") as f: content = f.read() return [content] li = [ ("/",index), ("/home",home), ("favicon.ico",log), ] def app(environ, start_response): # 封裝響應信息 start_response('200 OK', [('Content-Type', 'text/html'), ('k1', 'v1')]) # environ 封裝好的請求數據,字典的格式 path = environ["PATH_INFO"] print(path) for i in li: if i[0] == path: ret = i[1](environ) return ret # 綁定ip和端口,有人鏈接就調用app函數 httpp = make_server("127.0.0.1",9000,app) # 開始監聽http請求 httpp.serve_forever()