flask基本使用


flask入門實例

1. 什么是flask

flask是個輕量級的web應用框架.
flask是使用python編寫的.

2. 第一個實例

2.1 編寫app.py

app.py

#導入flask相關模塊
from flask import Flask
from flask import render_template

#Flask實例, 
#    第一個參數是應用模塊的名稱, 
#    template_folder指定了html模板的路徑, 
#    static_folder指定了靜態文件(圖片, bootstrap等)的路徑, 
app = Flask(__name__, template_folder='./templates', static_folder='./static')

@app.route('/')     # 這是個裝飾器, 指定了在瀏覽器訪問時的URL
def home():
    name = '二狗'   # 定義了一個變量

    # 返回html模板(flask使用的是jinja2模板), 並給該模板傳了個參數
    return render_template('home.html', name=name)

if __name__ == '__main__':
    # 指定port, 運行app
    app.run(debug=True, port='8000')

2.2 編寫html模板

home.html

<html lang="zh">

    <head>
    </head>

    <body>
        <!-->這時有一個4級標題, 標題內容是Hello {{name}}, 其中name是個變量, 在app.py中調用模板時傳遞進來<-->
        <h4>Hello {{ name }}</h4>
    </body>
</html>

2.3 運行app

E:\flask_demo> python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 161-473-587
 * Running on http://127.0.0.1:8000/ (Press CTRL+C to quit)
127.0.0.1 - - [08/Jan/2022 14:34:14] "GET / HTTP/1.1" 200 -

2.4 查看網頁

打開瀏覽器, 在地址欄輸入: 127.0.0.1:8000
其中8000是app.py中app.run的port參數.

3. 頁面美化

默認的html樣式(按鈕, 表格等)可以通過css來美化, 不過直接使用css會很繁瑣, 可以使用bootstrap和font-awesome, 它們定義好了一系列樣式, 我們直接使用即可.

3.1 下載bootstrap和font-awesome

bootstrap: https://www.bootcss.com/, 點擊Bootstrap3中文文檔(v3.x.x)下載, 點擊"CSS全局樣式"查看可用的樣式.
font-awesome: https://fontawesome.dashgame.com/, 點擊"立即下載", 點擊"圖標"查看可用的圖標.

下載下來的文件放到app.py同級別的static目錄中:
.\flask_demo\static\bootstrap-3.3.7-dist
.\flask_demo\static\font-awesome-4.7.0

3.2 指定bootstrap和font-awesome所在路徑

在app.py中生成Flask實例時, 指定static_folder選項.
app = Flask(name, template_folder='./templates', static_folder='./static')

3.3 在html中引入bootstrap和font-awesome, 並使用相應樣式

home.html

<html lang="zh">

    <head>
        <meta charset="UTF-8">
        <!--引入bootstrap和font-awesome-->
        <link rel="stylesheet" href="{{ url_for('static', filename='bootstrap-3.3.7-dist/css/bootstrap.min.css') }}">
        <link rel="stylesheet" href="{{ url_for('static', filename='font-awesome-4.7.0/css/font-awesome.min.css') }}">
        <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
    </head>

    <body>
        <h4>Hello {{ name }}</h4>

        <!--使用bootstrap的btn和btn-default樣式-->
        <a class='btn btn-default' href='/class?cls_name=cls0'>class_0</a>
        <a class='btn btn-default' href='/class?cls_name=cls1'>class_1</a>
    </body>
</html>

效果:

4. 通URL給頁面傳參數

4.1 發出參數

看上一節的home.html中, 兩個button都有個href屬性, 表示點擊該按鈕后, 會跳轉到對應的URL:
href='/class?=cls0'
href='/class?=cls1'

其中cls0和cls1是傳給URL的參數.
不過現在我們沒有class這個URL, 需要在app.py中添加

4.2 添加URL: class, 並獲取參數

在app.py中添加URL class
獲取參數需要導入request

import collections

from flask import Flask
from flask import request
from flask import render_template

app = Flask(__name__, template_folder='./templates', static_folder='./static')

@app.route('/')
def home():
    name = '二狗'
    return render_template('home.html', name=name)

@app.route('/class') #URL class
def _class():        #函數名使用class的話與保留關鍵字沖突, 所以加了個下划線

    #定義了一堆數據
    dict_cls = dict()

    dict_cls['cls0'] = collections.OrderedDict()
    dict_cls['cls0']['student0'] = {'name':'李雷'  , 'age':38}
    dict_cls['cls0']['student1'] = {'name':'韓梅梅', 'age':37}

    dict_cls['cls1'] = collections.OrderedDict()
    dict_cls['cls1']['student0'] = {'name':'Jim' , 'age':39}
    dict_cls['cls1']['student1'] = {'name':'Kate', 'age':40}

    #從URL獲取參數cls_name
    cls_name = request.args.get('cls_name')

    return render_template('class.html', cls_name=cls_name, dict_cls=dict_cls)

if __name__ == '__main__':
    app.run(debug=True, port='8000')

這個URL要用到class.html, 目前還沒有.

4.3 編寫class.html

編寫class.html, 並在模板中使用多維變量
注意, 多維變量使用時最好先賦值給臨時變量, 直接使用的話可能引起語法錯誤.
class.html

<html lang="zh">

    <head>
        <meta charset="UTF-8">
        <!--引入bootstrap和font-awesome-->
        <link rel="stylesheet" href="{{ url_for('static', filename='bootstrap-3.3.7-dist/css/bootstrap.min.css') }}">
        <link rel="stylesheet" href="{{ url_for('static', filename='font-awesome-4.7.0/css/font-awesome.min.css') }}">
        <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
    </head>

    <body>
        <h4>{{ cls_name }}</h4>

        <table class='table table-bordered table-hover center-block' style='widht: 500px;'>
            <thead>
                <th style='text-align: center; width: 200px;'>ID</th>
                <th style='text-align: center; width: 200px;'>姓名</th>
                <th style='text-align: center; width: 100px;'>年齡</th>
            </thead>

            <!--使用for循環-->
            {% for _s_id in dict_cls[cls_name].keys() %}
                <!--使用set給臨時變量賦值-->
                {% set _s_name = dict_cls[cls_name][_s_id]['name'] %}
                {% set _s_age  = dict_cls[cls_name][_s_id]['age' ] %}

                <tr>
                    <td>{{ _s_id   }}</td>
                    <td>{{ _s_name }}</td>
                    <td>{{ _s_age  }}</td>
                </tr>
            {% endfor %}

        </table>
    </body>
</html>

效果:
點擊class_0后:

點擊class_1后:

5. jinja2模板

一系列頁面頂部/底部都一樣

  1. 定義一個base模板, 把頁面主要框架都填上, 其它頁面都從base頁面擴展, 添加不同的內容.
  2. 不同頁面重復使用的元素可以單獨放到forms.html中, 其它頁面直接調用元素即可.
  3. 多維的變量, 如果key嵌套了變量, 可以使用set先獲取該變量.


免責聲明!

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



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