1. 程式人生 > 實用技巧 >flask學習之--模板

flask學習之--模板

模板

​ 如果說 路由這一節主要講的是客戶端通過什麼樣的連結訪問伺服器的內容,那麼這一節,就需要講講伺服器中的內容。那什麼是伺服器中的內容呢?簡單的說,就是HTML。怎麼理解中間的過程呢?簡單來說,flask建立了一套規則:當用戶想訪問到伺服器裡的資料時,通過設定好的路徑下,訪問固定的HTML檔案的內容,講HTML的內容下載到本地瀏覽器中,由本地的瀏覽器按照HTML檔案格式解析呈現給使用者。其中路徑:就是設定好的路由,已什麼路徑進行訪問。HTML 檔案內容,具體是什麼訪問?有資料讀取有資料寫入,那資料是怎麼傳遞的呢,就是本節的問題

0 HTTP 方法

​ Web應用使用不同的HTTP方法處理URL,一般在預設情況下,一個路由只會迴應GET 請求。也可以使用route()中的裝飾器mothods引數來處理不同的HTTP方法,例子如下:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

1 HTML 模板

​ flask會自動為我們配置HTML(主要是因為HTML 中有很多固定的格式,我們作為開發者更多的需要關注資料,即可)。那麼,配置HTML的過程,或者生成HTML程式碼的程式碼,叫做 模板引擎。在Flask中,是一個預設jinja2的模板引擎,來負責這個事情的,更為專業的說法是渲染模板。

使用 render_template() 方法可以渲染模板,你只要提供模板名稱和需要 作為引數傳遞給模板的變數就行了。下面是一個簡單的模板渲染例子:

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

{注意一下}:其中有一個隱藏問題,關於render_template('hello.html', name=name),flask怎麼知道hello.html在那裡呢?這裡是可不是絕對路徑哦。

解釋 : flask會預設在 templates 資料夾中尋找模板。詳細檔案有以下2種分佈方式:

情形 1 : 一個模組:

/application.py
/templates
    /hello.html

情形 2 : 一個包:

/application
    /__init__.py
    /templates
        /hello.html

後面會詳細的介紹 Jinja2 模板文件


​ 有了HTML之後,又一個問題來了,有了模板渲染之後,那HTML 裡面是不是什麼都不用寫就可以達到我們想要結果呢??答案是,你想多了。有了渲染模板,只能簡化我們的開發,但是需要展現的資料,還是需要我們自己寫,那怎麼簡化的呢?先給一個感性的認識吧?

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

比起HTML的程式碼,這個其實已經很精簡了。

2 資料

​ 訪問的路徑有了,模板有了。那我們總要訪問點啥吧?來來來,我們就重點聊聊資料,既然聊資料,就是建立連線向伺服器傳送資料請求,伺服器應該返回點啥給客戶端。從客戶端的角度來說,就是請求物件(先抽象下),伺服器來說,就是請求回覆。

​ 對於請求回覆,個人愚見,大概分這麼幾類

2.1 請求回覆介面

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

​ 主要過程如下:客戶從IP+埠+/hello/(路由路徑),訪問到伺服器,伺服器會去查這個路徑下的那個函式匹配,一查,哦,是hello這個函式,就開始執行render_template這個函式,這個函式幹嘛的?就是渲染hello.html檔案的,渲染好了,就通過HTTP 方式,傳輸到使用者的瀏覽器上,然後瀏覽器就接收到之後,開始解析並呈現內容。

​ 但是,另外一個問題來了,沒互動啊,什麼意思,資料是來自伺服器上的,1個使用者返回的資料和100個使用者返回的資料是一樣的沒變化啊,太死了!! 怎麼辦?有辦法!往下面看。但是,我們需要記住,這種方式叫做靜態頁面。

2.2 請求回覆物件

​ 我們換一個場景,當遇到web介面的時候,也會經常遇到,讓我們輸入什麼帳號,密碼啥的,然後一進去,啪,來個hello 啊,歡迎啊,感覺這個系統就是為我們定做的一樣。這個怎麼玩的?
​ 來來,將上面的場景分解下,輸入帳號和密碼,其實是叫做表單(form),前端有一類部件就是專門講的這個,暫時我們可以不去深究它,但是,我們關注的點是,我們在前端輸入的資訊,伺服器是怎麼知道的?來上程式碼!

from flask import request


@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

​ 主要過程如下:當我們在login頁面下,輸入自己的使用者名稱和密碼之後,點選提交。flask接收到提交到的資訊後,開始匹配路由。最後最終會匹配到login函式下,其中request模組,會從http中解析出form中的內容。我們只用按照表單資料進行取就好了。是不是很簡單呢?

​ 對於伺服器對於資料的回覆,不僅僅這些,除此之外,還有檔案的下載和上傳問題、cookies使用、session的使用,重定向和錯誤等問題,需要進一步的深入瞭解。