Flask--第三個例子,寫一個接口,該接口返回html前端頁面,模板的使用


 將接口數據返回至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');

 


免責聲明!

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



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