动态网页:jinja2的template 和render方法 3

Posted 1832921tongjieducn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态网页:jinja2的template 和render方法 3相关的知识,希望对你有一定的参考价值。

前面我们已经学习到了,前端页面可以将一些请求,数据,通过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
"""

"""
附带的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>


"""

以上是关于动态网页:jinja2的template 和render方法 3的主要内容,如果未能解决你的问题,请参考以下文章

Django入门学习--深入模板(templates)

Django入门学习--深入模板(templates)

Jinja2 过滤器用于动态注册模板

Flask中的Templates

Flask 模板

Flask 的 template模板 与 jinja2语法