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格式 再通过网络传输给浏览器
"""
 posted on 2020-05-24 23:35  wwwpy  阅读(147)  评论(0编辑  收藏  举报