标签:turn http协议 com head dict doc 通过 none 直接
前面我们已经学习到了,前端页面可以将一些请求,数据,通过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 pymysql
import 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 res
def 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 res
def 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 res1
url = [
(‘/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 }}
"""