web框架—自建简易框架
1、基本的bs架构
'''
1、本地客户端都能访问
2、由客户端发来的数据,可查看当客户端为浏览器时的数据格式,即HTTP协议规定的数据格式
'''
import socket
sk = socket.socket()
sk.bind(("127.0.0.1", 80))
sk.listen()
while True:
conn, addr = sk.accept()
data = conn.recv(8096)
print(data) # 得到客户端发来的数据
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') # 按照HTTP协议发送响应头
conn.send(b"OK") # 统一响应OK
conn.close()
2、响应不同请求
'''
1、客户端请求的不同,体现在url上的不同
2、从服务端分析客户端的请求数据,发现请求url在整个字串中的相同位置:HTTP之前,GET之后
3、可以使用切分字符串的方式,拿到该url,从而对它做逻辑处理,返回不同的内容给客户端
'''
import socket, time
sk = socket.socket()
sk.bind(("127.0.0.1", 80))
sk.listen()
def login():
return 'login'
def error():
return '404'
def index(): # 刷新即可看到最新时间,模拟动态显示数据
with open("index.html", "r", encoding="utf8") as f:
s = f.read()
now = str(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime()))
s = s.replace("@@oo@@", now)
return s
while True:
conn, addr = sk.accept()
data = conn.recv(8096)
print(data) # 得到客户端发来的数据
conn.send(b'HTTP/1.1 200 OK\r\n\r\n') # 按照HTTP协议发送响应头
data = data.decode('utf8')
url = data.split(' ')[1]
if url == '/login':
res = login()
elif url == '/index':
res = index()
else:
res = error()
print(res)
conn.send(res.encode('utf8')) # 统一编码成bytes
conn.close()
3、封装socket连接:模块wsgiref
上述代码的缺点:
1、每一个服务端都要写socket连接
2、每一个服务端都要写请求头
3、不同请求的函数都在一个页面
4、手动实现动态效果,代码复杂
基于此,基于同一接口、封装的思想
1、有了封装好socket连接的模块wsgiref
2、有了专门存放所有html文件的文件夹
3、有了专门存放url与响应函数对应关系的urls.py文件
4、有了专门存放处理请求的响应函数的views.py文件
5、有了专门做动态渲染的模块jinjia2
3.1 模块介绍
# wsgiref
# 用法:
from wsgiref.simple_server import make_server
def run_server(environ, start_response):
'''
environ:客户端发来的请求数据
'''
start_response('200 OK', [('', ''), ]) # 设置HTTP响应状态,第二个参数,请看源码
'''
逻辑代码
'''
if __name__ == '__main__':
httpd = make_server('', 8000, run_server) # 绑定ip,
print("Serving HTTP on port 8000...")
httpd.serve_forever()
# jinjia2
# 用法:
from jinja2 import Template
def index():
with open("index2.html", "r") as f:
data = f.read()
template = Template(data) # 生成模板文件
ret = template.render({"name": "Alex", "hobby_list": ["烫头", "泡吧"]}) # 把数据填充到模板里面
return [bytes(ret, encoding="utf8"), ]

浙公网安备 33010602011771号