將接口數據返回至html前端頁面有兩種方法
方法一:
1 @app.route('/index',methods=['get']) 2 def open_index(): 3 page=open('my_index.html',encoding='utf-8');——---->打開當前文件下的my_index.html(這個html是你自己寫的) 4 res=page.read()------>讀取頁面內容,並轉義后返回 5 return res;
方法二:
1 from flask import Flask,render_template,request 2 3 app = Flask(__name__) 4 5 6 #@app.route('/index') 7 @app.route('/index/<username>') 8 def hello_world(username): 9 return render_template('hello.html',username=username);------------>其中hello.html文件在temaplte文件夾下 10 11 12 if __name__ == '__main__': 13 app.run(debug=True);
*與第一種方式的有點在於可以自動轉義,第一種方式要手動轉義,不方便
* rendr_template中第一個參數是要打開的文件,通常是html文件
*render_template中第二個參數:username=username,第一個username是html中的變量,第二個username是index函數中的值,將這個值賦予html中的變量展示
*同理,render_template中可以指定第三個參數,第....個參數
*在html中的變量,用{{<valueName>}},如{{username}},必須要和index中指定的html變量名一模一樣,否則無法正確獲取變量的值展示
*總而言之,render_template功能是對先引入html,同時根據后面傳入的參數,對html進行修改渲染。
我的html頁面內容如下
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>這是我的主頁</title> 6 </head> 7 <body>
{{username}}------>變量,必須要和index函數中給html的變量參數名一模一樣,否則調取無效
8 這是我的主頁 9 10 11 </body> 12 </html>
問題來了:
如何判斷函數是否有給html給傳參數,如果傳了則展示,如果沒傳,則展示其他的,這個判斷應該在html中完成,邏輯判斷的格式如下
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>你們好,這是我的模板</title> 6 </head> 7 <body> 8 {% if username2 %} 9 姓名:{{ username2 }} 10 {% else %} 11 姓名:沒有傳username 12 13 {% endif %} 14 15 你們好,這是我的模板 16 </body> 17 </html>
問題2:如果需要將數據全部打印出來,那么就需要用循環(for)
####后端 @app.route('/') @app.route('/lianxi') def myindex(): user={'username':'zhonghuihong'} posts=[{ 'author':{'username':'xiaoA'}, 'body':'這是小A的文章' },{ 'author':{'username':'小B'}, 'body':'這是小B的文章' }] return render_template('index.html',title='MYhome',user=user,posts=posts)------>使用render_template來調用index.html渲染頁面。並且返回title、user、post數據來供前端渲染 ###前端 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> {% if title %} <title> {{ title }}--您好 </title> {% else %} 歡迎來到這里-index {% endif %} </head> <body> <h1>hello!!!,{{ user.username }}</h1> {% for post in posts %}---------------->渲染這個頁面的同時,帶回了這些數據,post是字典樣式,要打印出數據,需要使用循環 {{ post.author.username }}寫了一遍文章:<b>{{ post.body }}</b> {% endfor %} </body> </html>
模板中最好的用處就是將大量重復的頁面展示模塊獨立,復用,比如網站中的頁眉、頁腳、導航欄
------術語叫做【模板繼承功能】,Jinja引擎的強大之一
簡述:模板繼承允許你創建一個基礎的骨架模板, 這個模板包含您網站的通用元素,並且定義子模板可以重載的 blocks (這個非常重要)。
*block:使用{%block <valueName>%}{%endblock%}標簽定義子模板,代表這幾個模塊可以重載,
*block:所要做的事情就是告訴模板引擎,這個子模塊可能會重寫覆膜板的這個部分。
例子:
###定義一個基礎base.html### <!doctype html> <html> <head> 主頁 </head> {%if title %} <title> {{ title }}--小型微博 </title> {% else %} <title>歡迎來到</title> {% endif %} <body> <div>衛星博客:<a href="/index">你好</a></div>------------------->這一快最終可以被其他html重載 {% block content%}------------------>這個content必須是唯一的 {% endblock %}
</body>
1 ###########改寫index.html,在index.html中繼承############# 2 3 {% extends 'base.html' %}------------>開頭說明這個頁面繼承了哪些模塊 4 {% block content %}------------>緊接着說明頁面繼承的模塊名,就是base.html定義的content 5 <h1>hello!!!,{{ user.username }}</h1>------------------->然后中間寫專屬於index的邏輯 6 {% for post in posts %} 7 {{ post.author.username }}寫了一遍文章:<b>{{ post.body }}</b> 8 {% endfor %} 9 {% endblock %}
#運行結果
問題3:如果要在頁面中跳轉另一個頁面
###前端頁面#### <div>衛星博客:<a href="/index">你好</a></div> ####對應app.py中的后台接口##### @app.route('/index') def index(): #fromdata=request.form(); return render_template('post_from_test.html');