1. 程式人生 > 其它 >Flask框架第一篇.Flask框架基礎

Flask框架第一篇.Flask框架基礎

1. Flask簡介

Flask是一個基於Python開發並且依賴jinja2模板和Werkzeug WSGI服務的一個微型框架,對於Werkzeug本質是Socket服務端,其用於接收http請求並對請求進行預處理,然後觸發Flask框架,開發人員基於Flask框架提供的功能對請求進行相應的處理,並返回給使用者,如果要返回給使用者複雜的內容時,需要藉助jinja2模板來實現對模板的處理,即:將模板和資料進行渲染,將渲染後的字串返回給使用者瀏覽器。

“微”(micro) 並不表示你需要把整個 Web 應用塞進單個 Python 檔案(雖然確實可以 ),也不意味著 Flask 在功能上有所欠缺。微框架中的“微”意味著 Flask 旨在保持核心簡單而易於擴充套件。Flask 不會替你做出太多決策——比如使用何種資料庫。而那些 Flask 所選擇的——比如使用何種模板引擎——則很容易替換。除此之外的一切都由可由你掌握。如此,Flask 可以與您珠聯璧合。

預設情況下,Flask 不包含資料庫抽象層、表單驗證,或是其它任何已有多種庫可以勝任的功能。然而,Flask 支援用擴充套件來給應用新增這些功能,如同是 Flask 本身實現的一樣。眾多的擴充套件提供了資料庫整合、表單驗證、上傳處理、各種各樣的開放認證技術等功能。Flask 也許是“微小”的,但它已準備好在需求繁雜的生產環境中投入使用

2.Flask和Django對比

Django框架Flask框架
Admin(基於Model) 原生無
Model 原生無
Form 原生無
Session 有(但顛覆認知)
教科書式框架 輕量級框架(以簡單為基準 開發 一切從簡 能省則省)
優勢 元件全,功能全,教科書 輕,快
劣勢 佔用資源,建立複雜度較高 先天不足,第三方元件穩定性較差

3.安裝

pip install flask
#注意: 不要使用工具中的外掛建立 Flask專案

4 Flask依賴包

4.1 jinjia2

  • 模板語言,就是Django中的 templates

https://www.cnblogs.com/DragonFire/p/9259999.html

就是django中的template
#  {{ }}  引用或執行
#  {% %}  邏輯程式碼
STUDENT = {'name': 'Old', 'age': 38, 'gender
': ''} #注意:後面加 , 會報錯 ​ STUDENT_LIST = [ {'name': 'Old', 'age': 38, 'gender': ''}, {'name': 'Boy', 'age': 73, 'gender': ''}, {'name': 'EDU', 'age': 84, 'gender': ''} ] ​ STUDENT_DICT = { 1: {'name': 'Old', 'age': 38, 'gender': ''}, 2: {'name': 'Boy', 'age': 73, 'gender': ''}, 3: {'name': 'EDU', 'age': 84, 'gender': ''}, } ​ ​ from flask import Flask, render_template ​ app = Flask(__name__) ​ # app.config["DEBUG"] = True app.debug = True ​ @app.route("/") def home(): return render_template("stu.html",stu=STUDENT,stu_list=STUDENT_LIST,stu_dict=STUDENT_DICT) ​ if __name__ == "__main__": app.run("0.0.0.0",9527)
View Code
{{ stu }}
<table border="1">
    <tr>
        <th>name</th>
        <th>age</th>
        <th>gender</th>
    </tr>
    <tr>
        <td>{{ stu.name }}</td>
        <td>{{ stu["age"] }}</td>
        <td>{{ stu.get("gender") }}</td>
    </tr>
</table>
View Code

{{ stu_list }}
<table border="1">
    <tr>
        <th>name</th>
        <th>age</th>
        <th>gender</th>
    </tr>
    
    {% for student in stu_list %}
    <tr>
        <td>{{ student.name }}</td>
        <td>{{ student["age"] }}</td>
        <td>
            {% if student.get("gender") != "" and student.get("gender") != "" %}
                未知
            {% else %}
                {{ student.get("gender") }}
            {% endif %}
        </td>
    </tr>
    {% endfor %}
View Code
# 法一:
{{ stu_dict }}
<table border="1">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>age</th>
        <th>gender</th>
    </tr>
​
    {% for skey in stu_dict %}
    <tr>
        <td>{{ skey }}</td>
        <td>{{ stu_dict[skey].get("name") }}</td>
        <td>{{ stu_dict.get(skey).get("age") }}</td>
        <td>
            1
        </td>
    </tr>
    {% endfor %}
</table># 法二:
{{ stu_dict }}
<table border="1">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>age</th>
        <th>gender</th>
    </tr>
​
    {% for skey,svalue in stu_dict.items() %}
    <tr>
        <td>{{ skey }}</td>
        <td>{{ svalue.get("name") }}</td>
        <td>{{ svalue.get("age") }}</td>
        <td>
            1
        </td>
    </tr>
    {% endfor %}
</table>
View Code

jianjia2的特殊用法

from flask import Flask, render_template,Markup
​
app = Flask(__name__)
​
# app.config["DEBUG"] = True
app.debug = True
​
@app.route("/")
def home():
    return render_template("stu.html",stu=STUDENT,stu_list=STUDENT_LIST,stu_dict=STUDENT_DICT)
​
​
@app.template_global()
def ab(a,b):
    return a+b
​
@app.template_global()
def my_input(na,ty):
    s = f"<input type='submit' value='後端返回的按鈕'>"
    return Markup(s)
​
@app.route("/a")
def home2():
    inp = Markup("<input type='submit' value='後端返回的按鈕'>")
    return render_template("a.html",btn=inp)
​
if __name__ == "__main__":
    app.run("0.0.0.0",9527)
    {{ ab(2,7) }}
​
​
    {% macro my_input(na,ty) %}
        <input type="{{ ty }}" name="{{ na }}">
    {% endmacro %}
​
    {{ my_input("username","text") }}
​
    {{ btn }}
View Code

4.2 werkzeug

  • Werkzeug是一個WSGI工具包,他可以作為一個Web框架的底層庫。這裡稍微說一下, werkzeug 不是一個web伺服器,也不是一個web框架,而是一個工具包,官方的介紹說是一個 WSGI 工具包,它可以作為一個 Web 框架的底層庫,因為它封裝好了很多 Web 框架的東西,例如 Request,Response 等等

    程式碼示例:

    from werkzeug.wrappers import Request, Response
    ​
    @Request.application
    def hello(request):
        return Response('Hello World!')
    ​
    if __name__ == '__main__':
        from werkzeug.serving import run_simple
        run_simple('localhost', 4000, hello)
    View Code