web的基本流程
WEB的本质:
通过http协议,前后端进行数据交互。本质就是socket服务端与浏览器的通信。基本形式是前端向目标地址发起请求,后端收到后从请求首行中获取路径,然后匹配对应的函数(接口)进行执行,然后函数会进行一系列的处理,然后返回,可能是具体的数据,也可能是其他的比如html网页。
简单的代码:
1 目录结构:
2 后端代码:
import socket import time from jinja2 import Template ''' web框架总结: 1 web框架的本质: socket服务端与浏览器的通信 2 socket服务端功能划分 a 负责与浏览器收发消息(socket) b 根据用户访问不同的路径执行不同函数 c 从html读取出内容 并且完成字符串替换 3 python中web框架的分类 1 框架自带abc的 tornado 2 框架自带bc的 使用第三方模块的a django 3 自带b 使用第三方的a和c flask 另外一种: Django和其他 django 大而全 flask 轻量级 ''' def f_404(url): ret = '<p>not found-->{}</p>'.format(url) return bytes(ret, encoding='utf-8') def nihao(url): ret='<p>hello-->{}</p>'.format(url) return bytes(ret,encoding='utf-8') def nimei(url): print(url) with open('nimei.html','r',encoding='utf-8')as f: ret=f.read() ret2=ret.replace('oo@zz',str(time.time())) return bytes(ret2,encoding='utf-8') def html01(url): print(url) with open('html01.html','rb')as f: html_msg=f.read() return html_msg def jinja2_01(url): print(url) with open('jinja2_temp.html','r',encoding='utf-8')as f: data=f.read() temp_data=Template(data) ret=temp_data.render({'name':'hello yuan','hobby_list':['喝茶','抽烟'],'url':url}) return bytes(ret,encoding='utf-8') base_url=[('/nihao',nihao),('/nimei',nimei),('/html01',html01),('/jinja2',jinja2_01)] sk = socket.socket() sk.bind(('127.0.0.1', 10055)) sk.listen() while 1: conn, addr = sk.accept() data = conn.recv(1024) # 前后端 使用http格式交互数据,在浏览器直接访问 print(data) data_str=str(data,encoding="utf-8") lista=data_str.split('\r\n') print('lista',lista[0]) url=lista[0].split(' ')[1] # with open('data','wb')as f: # f.write(data) for i in base_url: print(i) if i[0]==url: func=i[1] break else: func=f_404 conn.send(b'HTTP/1.1 200 OK\r\ncontent-type:text/html; charset=utf-8\r\n\r\n') respondata=func(url) conn.send(respondata) # if url=='/nihao': # responsedata=nihao(url) # conn.send(responsedata) # elif url=='/nimei': # responsedata = nimei(url) # conn.send(responsedata) # else: # conn.send(b'<p>url 404</p>') conn.close() sk.close()
3 jinja2_temp.html 使用了jinja2模板语法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jinja2模板</title> </head> <body> {{name}} <ul> {% for i in hobby_list %} <li>{{i}}</li> {% endfor %} </ul> <p>{{url}}</p> </body> </html>
jinja2支持循环的,基本流程--->后端收到请求后,先读取html文件,然后获取数据(比如从数据库请求),然后生成Template实例,使用render函数传参,当然html中要使用jinja2语法,在需要数据填充的地方使用参数的k代表,就会取到响应的值,这一切都是在后端进行的。