Django-web框架的本質

HTTP協議

全部的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>
html代碼
h1{
    background-color: red;
    color: white;
}
css代碼
alert("樓下說滴對");
js代碼

要想將服務器的html代碼放在瀏覽器上,咱們必須遵循http協議:html

 HTTP協議python

get的請求數據拼接在url中;web

post的請求數據在請求體中;瀏覽器

 

web框架初識

每引入一個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()
web框架二
# -*- 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])
web框架三
# -*- 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()
web框架四
相關文章
相關標籤/搜索