【web框架的本质-python】

import socket
# 创建一个socket连接
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1',8888))
# 设置监听数量
sk.listen(5)
while True:
    # 获取数据
    conn,addr = sk.accept()
    # 设置数据最大接受值
    data = conn.recv(8096)
    # 遵循http协议的数据
    print(data)
    # 返回响应数据
    conn.send(b"111")
    # 关闭连接
    conn.close()

 1.web框架的本质其实就是一个socket链接,我们在成熟框架中看到wsgiref之类的wsgi其实都是基于socket发展而来的

 2.web框架其实就是在socket客户端的基础上添加了包括路由匹配、模板渲染、数据库交互等多个方面。

 3.以上最简单的web框架中print(data)的结果是一串包括了\r\n\r\n分割的请求头和请求体,其中请求头又以\r\n分割成的每一行key value的数据,而只有请求头的第一行不是\r\n分割而是通过空格分割的,通过这样不断的分割我们就可以得到我们想要的信息,包括数据格式,url等,现有的web框架包括django、flask都会把这些信息封装在request对象中,这样就可以方面我们获取其中的值,

# data中的内容
# b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8888\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36 Edg/89.0.774.50\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\nSec-Fetch-Site: none\r\nSec-Fetch-Mode: navigate\r\nSec-Fetch-User: ?1\r\nSec-Fetch-Dest: document\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\r\n\r\n'

4.在知道以上内容的前提下,我们可以自定义一些路由规则如下,同时其中的元组第二项就是我们的函数名,所以我们还要定义函数

url_list = [
('/login',login),
('/index',index),
]
def login():
  return 'login'
def index():
  return 'index'

 

5.这样我们就可以根据url来返回不同的页面,同时,如果我们在页面返回的字符串中返回一个html形式的字符串,这样浏览器也能够渲染出相应的格式,如果我们想渲染一个html文件,也可以用过open方法将文件内容读取出来拼接成字符串返回即可

url_list = [
('/login',login),
('/index',index),

('/regitser',regitser),
]
def login():
  return 'login'
def index():
  return 'index'
def regitser():
  return '<p>register</p>'

6.通过以上的步骤我们就可以完成一个基于socket自己封装的web框架了,但是这样的框架可以渲染的网站是一个静态网站,如果我们想让页面变成个动态网站,我们可以通过sqlalchemy或者pymysql通过数据库获取是数据,然后通过循环和格式化字符串的方式将数据动态的放在返回值中。

posted @ 2021-03-13 00:39  GokuBlog  阅读(98)  评论(0)    收藏  举报