前面我们已经学习到了,前端页面可以将一些请求,数据,通过post 或者get请求,发送给后端,后端通过wsgiref模块获取到一个env的大字典获取到所有的这些数据,现在,我们将学习一种jinja2模块,可以通过templata实例化一个类,给这个类传一个html文件内容,文件内容也就是前端页面可以通过一些模板语法获取到这些后端产生的数据,这就实现了前后端数据的交互
具体做法的代码看下面的例子:
主程序:from wsgiref.simple_server import make_server# from urls import url# from views import *from jinja2 import Template## jinja2是一个模板语法,专用模块import pymysqlimport time##这里的env就是一个大字典,里面的信息是HTTP协议之前传过来的,# 经过wsgiref处理之后将所有的信息转化成一个大字典def error(env): return '404'def get_time(env): with open(r'E:\周末四期\day19\代码\day19\第二部分动态网页\get_time.html','r',encoding='utf-8') as f: data = f.read() current_time = time.strftime('%Y-%m-%d %X') res = data.replace('@@time@@',current_time) return resdef get_user(env): user_dict = {'username':'jason','password':'123','hobby':['read','work']} # user_dict = {'hahhha'} with open('E:\周末四期\day19\代码\day19\第二部分动态网页\get_user.html','r',encoding='utf-8') as f: data = f.read() from jinja2 import Template tmp = Template(data) # 这个Templata是jinja2中的一个类,传一个data实例化一个对象 res = tmp.render(data1=user_dict) # 将user_dict传递给前端页面 前端页面用过变量名data1就能够拿到user_dict字典 ##这里将data1通过这个rendder 方法传过去,前端页面就可以通过{{data1}}的方法获取了 return resdef get_data(env): conn = pymysql.connect( host = '127.0.0.1', port = 3306, user = 'root', password = '654321', database = 'db666', charset = 'utf8', autocommit = True ###自动提交 ) cursor = conn.cursor(pymysql.cursors.DictCursor) cursor.execute('select * from user') res = cursor.fetchall() # print("获取到的数据是:") # print(res) with open(r'E:\周末四期\day19\代码\day19\第二部分动态网页\get_date_from_databases.html','r',encoding='utf8') as f: data = f.read() tmp = Template(data) res1 = tmp.render(user_list = res) # [{},{},{}] return res1url = [ ('/get_time',get_time), ('/get_user',get_user), ('/get_data',get_data),]##这个称作路由与视图函数的对应关系def run(env,response): response('200 OK', []) # 固定格式 不需掌握 print(env) # 将http格式的数据处理完毕 形成一个字典给你调用 current_path = env.get('PATH_INFO') func = None for url_tuple in url: if current_path == url_tuple[0]: func = url_tuple[1] # 如果路由匹配上了 就回去对应的函数 break 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) server.serve_forever()"""动静态网页: 静态网页:数据是写死的,万年不变 动态页面:数据是实时获取的,一直在改变,比如数据库的数据,以及当前时间模板渲染(雏形) 后端产生数据直接传递给前端页面,前端页面获取数据通过模板语法展示模板语法: {{ 变量名 }} 获取后端传递的数据,通过变量名 jinja2 模板语法 极为接近python语法 {{ data}} {{{ data1.username }} {{ data1.password }} {{ data1.hobby }} {{ data1.hobby.0 }} {{ data1.hobby.1 }}""""""附带的html文件:E:\周末四期\day19\代码\day19\第二部分动态网页\get_date_from_databases.html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><user_list>{{ user_list }}{#{{ user_list }}#}{#</user_list>#}</html>E:\周末四期\day19\代码\day19\第二部分动态网页\get_time.html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>get_time</title></head><body><h1>@@time@@</h1><!--先写一个时间,固定写死,之后再读取这个替代掉这个时间 --></body></html>E:\周末四期\day19\代码\day19\第二部分动态网页\get_user.html<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body>{{ data1 }}{{ data1.username }}{{ data1.password }}{{ data1.hobby }}{{ data1.hobby.0 }}{{ data1.hobby.1 }}</body></html>"""