web框架推导过程
前端<----------->后端<---------->数据库
1 纯手撸web框架
1.1 前置知识点
# HTTP协议
"""
网络协议
HTTP协议 数据传输是明文
HTTPS协议 数据传输是密文
websocket协议 数据传输是密文
四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上的协议
3.无状态
4.短/无链接
数据格式
请求首行
请求头
请求体
响应状态码
1XX
2XX 200
3XX
4XX 403 404
5XX 500
"""
1.2 实现思路
# 如何做到后缀的不同返回不同的内容
# 1.拿到用户输入url网址的后缀 2.做判断 返回对应的html数据
# 不足之处
1.代码重复(服务端代码所有人都要重复写)
2.手动处理http格式的数据 并且只能拿到url后缀 其他数据获取繁琐
(数据格式一样处理的代码其实也大致一样 重复写)
3.并发的问题
2 半手撸web框架(借助于wsgiref模块)
2.1 wsgiref模块
通过wsgiref模块
便捷的建立服务端,专注于写核心的业务逻辑代码(视图函数以及url与视图函数的对应关系)
"""
urls.py 路由与视图函数对应关系
views.py 视图函数(后端业务逻辑)
templates文件夹 专门用来存储html文件
"""
# 按照功能的不同拆分之后 后续添加功能只需要在urls.py书写对应关系然后取views.py书写业务逻辑即可
2.2 动静态网页
2.2.1 动静态网页的定义
"""
静态网页
页面上的数据是固定的 万年不变
动态网页
数据是实时获取的
eg:
1.后端获取当前时间展示到html页面上
2.从数据库中获取数据,展示到html页面上
"""
2.2.2 动态网页制作
# 1.后端获取当前时间展示到html页面上
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
# 2.后端获取数据库中数据展示到前端页面
# 将一个字典传递给html文件 并且可以在文件上方便快捷的操作字典数据
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
2.2.3 模版语法之Jinja2模块
pip3 install jinja2
"""模版语法是在后端起作用的"""
# 模版语法(非常贴近python语法)
{{ user }}
{{ user.get('username')}}
{{ user.age }}
{{ user['hobby'] }}
{% for user_dict in user_list %}
<tr>
<td>{{ user_dict.id}}</td>
<td>{{ user_dict.username}}</td>
<td>{{ user_dict.password}}</td>
<td>{{ user_dict.hobby}}</td>
</tr>
{% endfor%}
3 自定义简易版本web框架请求流程
用户输入网址--->wsgiref模块的服务端接收数据并处理--->得到数据(字典形式)--->获取对应数据
|
网络传输至用户浏览器<---将数据交给wsgiref的服务端,进行封包<-----通过url与视图函数的对应关系获取响应数据
3.1 wsgiref模块的作用
"""
wsgiref模块
1.接收请求的时候 解析http格式的数据 并封装成大字典
2.返回响应的时候给数据打包成符合http格式 再通过网络传输给浏览器
"""