動態網頁: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>


"""


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM