1. 程式人生 > >Flask 框架學習(一)

Flask 框架學習(一)

Flask 框架學習

現在網上的flask框架的學習資料有點少,到處扒拉扒拉之後乾脆寫個部落格免得以後自己忘記了,同時也分享一下我的學習心得,直接進入正題吧,至於具體的安裝之類的就不多說了,直接進入正題,

1、簡單例子

以一個簡單的flask為例,可以建個檔案命令列跑一下試試

from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_world():
    return "Hello World~~~"
if __name__ == '__main__':
    app.run()

先是這個

from
flask import Flask

倒入Flask類,接下來這一句

app = Flask(__name__)

例項化物件 app ,引數為應用模組或包的名稱,這裡 _name_ 指的是 _main_ 主程式。

@app.route("/")

使用 route() 裝飾器告訴 Flask 觸發函式的 URL 。預設是127.0.0.1:5000,例如@app.route(“/test1.py”)那麼訪問的時候的url就是127.0.0.1:5000/test1.py

def hello_world():
    return "Hello World~~~"

定義的函式,用來生成相關聯的 URL ,並返回需要在使用者瀏覽器中顯示的資訊。

app.run()

執行伺服器應用,執行後預設只有本地可以訪問,且預設訪問的ip和埠是127.0.0.1:5000,執行效果如下:
這裡寫圖片描述
這裡寫圖片描述
也可以使用自定義的主機和埠: app.run(host=”0.0.0.0”,port=8000)

2、模板使用

假設你的.py檔案在xxx/目錄下,那麼你的模板就必須放在xxx/templates下,檔案結構大概如下。

xxx
|-templates資料夾
|   |-index.html(模板檔案)
|-templates1.py檔案

根據上述的檔案結構,舉例說明如下:
首先是模板檔案(xxx/templates/index.html)

<html
>
<head> <title>{{title}} - microblog</title> </head> <body> <h1>Hello, {{user.nickname}}!</h1> </body> </html>

接下來是處理模板的.py檔案(xxx/templates1.py)

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/index')
def index():
    user = { 'nickname': 'bendawang' } # fake user
    return render_template("index.html",
        title = 'Home',
        user = user)
app.run(debug=True)

效果如下:
這裡寫圖片描述
在上面的程式中,我們從Flask 框架 import 了一個叫render_template的新函式,並用這個函式來渲染模板。並給這個函式賦予了模板檔名和一些變數作為引數。它將匯入的變數替換掉模板中的變數佔位符,並返回渲染後的模板。 在 Flask 底層,render_template 函式實際上是呼叫了Flask的一個元件:Jinja2模板處理引擎。是 Jinjia2 用匯入的變數替換掉了模板中對應的 {{ … }} 程式碼塊。

接下來是模板的流程控制, Jinjia2通過{% %}就可以新增if或是for迴圈,舉例說明如下:
首先是模板檔案(xxx/templates/index2.html)

<html>
<head>
    {%if title!=Null%}
    <title>{{title}} is in</title>
    {%else%}
    <title>no one in</title>
    {% endif %}
</head>
<body>
    <h1>hi {{user.name}}!</h1>
    {% for i in guest%}
    <p>{{i.name}} said : <b>{{i.said}}</b></p>
    {% endfor %}
</body>
</html>

接下來是處理模板的.py檔案(xxx/templates2.py)

from flask import Flask,render_template
app = Flask(__name__)
@app.route('/index')
def index():
    user = {"name":"Bendawang"} 
    guest = [
        {"name":"bdw12138","said":"bdw comming on!"},
        {"name":"BDW12138","said":"BDW comming on!"}
        ]
    return render_template("index2.html",title="bendawang_test",user=user,guest=guest)
app.run(debug=True)

執行效果如下圖:
這裡寫圖片描述

然後就是簡單的模板繼承功能:
我們先改造一下剛才的index2.html成如下的檔案(base.html)

<html>
<head>
    {%if title!=Null%}
    <title>{{title}} is in</title>
    {%else%}
    <title>no one in</title>
    {% endif %}
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

然後編寫一個index3.html讓他繼承與上述的base.html,如下(index3.html)

    {% extends "base.html" %}
    {% block content %}
    <h1>hi {{user.name}}!</h1>
    {% for i in guest%}
    <p>{{i.name}} said : <b>{{i.said}}</b></p>
    {% endfor %}
    {% endblock %}

在這個模板中,我們使用了 block 控制語句來定義繼承模板內容的顯示位置。注意:這個 block 語句中設定的名稱必須唯一。extends 語句使兩個模板關聯了起來。Jinja2 在渲染index3.html模板時,發現 extends 語句,就會自動先引入 base.html 基礎模板,並對兩個模板中名為 content 的 block 語句進行匹配。

然後來的index2.html就成功分成了兩個,一個base.html和一個index3.html,同樣此時執行templates2.py,發現效果沒變,所以這樣分解之後便於以後的修改和程式設計,多的大家也都懂。

在這裡,我在介紹一個更加工程化的檔案結構,

microblog
    |-app資料夾
    |  |-templates資料夾
    |  |-__init__.py檔案
    |  |-views.py檔案
    |-run.py檔案

這就是常用的flask的簡單框架結構,現在我將templates1.py和index.html拆分成上述檔案結構,具體操作如下:
1、首先將模板檔案index.html放入templates資料夾下即可
2、接下來我們來拆分templates1.py,拆分之後如下
首先是 _init.py_檔案

from flask import Flask
app = Flask(__name__)
from app import views

接下來是views.py檔案

from flask import render_template
from app import app
@app.route('/index')
def index():
    user = { 'nickname': 'bendawang' }
    return render_template("index.html",
        title = 'Home',
        user = user)

最後是run.py檔案

from app import app
app.run(debug = True)

然後就是需要命令列執行run.py就行了,具體的大家自己可以按照上述的說明自己建好檔案之後讀程式碼比較templates1.py慢慢體會就明白了。