Web框架本质
web框架本质上可以看成是一个功能强大的socket服务端,用户的浏览器可以看成是拥有可视化界面的socket客户端。两者通过网络请求实现数据交互,学者们也可以从架构层面上先简单的将Web框架看做是对前端、数据库的全方位整合
纯手撸web框架
服务端
import socket server = socket.socket() # TCP 三次握手四次挥手 osi七层 server.bind(('127.0.0.1', 8080)) # IP协议 以太网协议 arp协议... server.listen(5) # 池 ... while True: conn, addr = server.accept() data = conn.recv(1024) # print(data) # 二进制数据 data = data.decode('utf-8') # 字符串 # 获取字符串中特定的内容 正则 如果字符串有规律也可以考虑用切割 conn.send(b'HTTP/1.1 200 OK\r\n\r\n') current_path = data.split(' ')[1] # print(current_path) if current_path == '/index': # conn.send(b'index heiheihei') with open(r'templates/01 myhtml.html', 'rb') as f: conn.send(f.read()) elif current_path == '/login': conn.send(b'login') else: # 你直接忽略favicon.ico conn.send(b'hello web') conn.close()
# 服务端响应的数据需要符合HTTP响应格式 sock.send(b'HTTP1.1 200 OK\r\n\r\nhello jasonNB')
总结
""" 纯手撸框架缺陷: 1.socket代码过于重复(每次搭建服务端都需要反复造轮子) 2.针对HTTP请求数据没有完善的处理方式(目前只能定向切割) """
基于wsgiref模块搭建web框架
from wsgiref.simple_server import make_server from urls import urls from views import * def run(env, response): """ :param env:请求相关的所有数据 :param response:响应相关的所有数据 :return: 返回给浏览器的数据 """ # print(env) # 大字典 wsgiref模块帮你处理好http格式的数据 封装成了字典让你更加方便的操作 # 从env中取 response('200 OK', []) # 响应首行 响应头 current_path = env.get('PATH_INFO') # if current_path == '/index': # return [b'index'] # elif current_path == '/login': # return [b'login'] # return [b'404 error'] # 定义一个变量 存储匹配到的函数名 func = None for url in urls: # url (),() if current_path == url[0]: # 将url对应的函数名赋值给func func = url[1] break # 匹配到一个之后 应该立刻结束for循环 # 判断func是否有值 if func: res = func(env) else: res = error(env) return [res.encode('utf-8')] if __name__ == '__main__': server = make_server('127.0.0.1',8080,run) """ 会实时监听127.0.0.1:8080地址 只要有客户端来了 都会交给run函数处理(加括号触发run函数的运行) flask启动源码 make_server('127.0.0.1',8080,obj) __call__ """ server.serve_forever() # 启动服务端
路由层
from views import * # url与函数的对应关系 urls = [ ('/index',index), ('/login',login), ('/xxx',xxx), ('/get_time',get_time), ('/get_dict',get_dict), ('/get_user',get_user) ]
视图层
路由层对应函数
def index(env): return 'index' def login(env): return "login" def error(env): return '404 error' def xxx(env): with open(r'templates/02 myxxx.html','r',encoding='utf-8') as f: return f.read() import datetime def get_time(env): current_time = datetime.datetime.now().strftime('%Y-%m-%d %X') # 如何将后端获取到的数据"传递"给html文件? with open(r'templates/03 mytime.html','r',encoding='utf-8') as f: data = f.read() # data就是一堆字符串 data = data.replace('dwadasdsadsadasdas',current_time) # 在后端将html页面处理好之后再返回给前端 return data jinjia2模板语法 from jinja2 import Template def get_dict(env): user_dic = {'username':'jason','age':18,'hobby':'read'} with open(r'templates/04 get_dict.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) res = tmp.render(user=user_dic) # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict return res 数据库 import pymysql def get_user(env): # 去数据库中获取数据 传递给html页面 借助于模版语法 发送给浏览器 conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '', db='练习', charset = 'utf8', autocommit = True ) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from employe' affect_rows = cursor.execute(sql) data_list = cursor.fetchall() # [{},{},{}] print(data_list) # 将获取到的数据传递给html文件 with open(r'templates/05 get_data.html','r',encoding='utf-8') as f: data = f.read() tmp = Template(data) print(tmp) res = tmp.render(user_list=data_list) print(res) # 给get_dict.html传递了一个值 页面上通过变量名user就能够拿到user_dict return res if __name__ == '__main__': get_user(111)
框架请求流程
标签:return,get,前戏,django,html,user,env,data From: https://www.cnblogs.com/shuai61457/p/17500233.html