flaskr 進階筆記

pardon110發表於2019-06-30

Flask 應用

  • flask核心依賴
    • Jinja2 模板引擎,負責資料顯示
    • Werkzeng WSGI工具集,主要是路由這塊
  • 應用建立函式create_app
    • 函式內部建立 Flask 例項來代替建立全域性例項,類似於laravel中的app容器
  • 應用例項包
    • __init__ 包含應用工廠
    • 將flaskr資料夾作為一個包
    • 返回一個應用例項,該例項app是應用的主線,後續藍圖例項在其上註冊,命令列裝飾器與之關聯
  • 配置載入
    • 配置方式,檔案,物件多種方式
    • 例項資料夾 在 flaskr 包的外面
  • 啟動
    • 進入專案目錄(使用命令列需要設定環境變數)
    • windows/linux (set 改為export)
set FLASK_APP=flaskr
set FLASK_ENV=development
flask run
  • flaskr
# ~/flaskr/__init__.py
import os
from flask import Flask

def create_app(test_config=None):
    # 建立和配置Flask應用例項
    app = Flask(__name__, instance_relative_config=True)
    # 設定一個應用的 預設配置
    app.config.from_mapping(
        SECRET_KEY='pardon110',
        # 設定資料庫儲存路徑
        DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite')
    )
    # 使用檔案來過載預設配置
    if test_config is None:
        # 載入配置檔案
        app.config.from_pyfile('config.py', silent=True)
    else:
        app.config.from_mapping(test_config)
    # 確保 app.instance_path 存在,Flask 不會自動 建立例項資料夾
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass

    # 匯入註冊資料庫
    from . import db
    db.init_app(app)

    # 匯入和註冊藍圖
    from . import auth, blog
    app.register_blueprint(auth.bp)
    app.register_blueprint(blog.bp)
    app.add_url_rule('/', endpoint='index')
    return app

資料庫

  • sqlite3
    • Python 內建了 SQLite 資料庫支援,不需要單獨配置資料庫伺服器,但不適合高併發請求
  • 連線資料庫
    • 在網路應用中連線往往與請求繫結,建立連線,傳送請求
  • 建立表
    • sqlite3 多條sql執行,上下文管理器
    • 概念 命令列裝飾器(互動性) 模組click(輸出美化)
  • 在應用中註冊
    • app.teardown_appcontext() 應用例項結束清理
    • app.cli.add_command() 新增Flask命令(註冊資料庫命令列)
  • 初始化資料庫檔案
    • flask init-db

藍圖和檢視

  • 檢視
    • 一個應用對請求進行響應的函式
    • URL 匹配 --> 檢視 + 資料 --> 響應
  • 藍圖(Blueprint)
    • 目的 組織一組相關檢視及其他程式碼的方式,主要是為了模組化程式設計
    • 檢視 + other程式碼 --註冊藍圖--> 工廠函式內註冊應用
    • flask 中的藍圖相當於mvc中的控制器部分
  • 主程式
    • @bp.route 使用藍圖例項上的route裝飾器,將url與檢視函式(請求處理器)關聯
    • request.form 請求資料
    • werkzeug.security 安全驗證,資料加密函式
    • @bp.before_app_request 在檢視函式之前執行的函式
  • 端點和url
    • url_for() 函式根據檢視名稱和發生成 URL,預設情況下,端點名稱與檢視函式名稱相同
    • 當使用藍圖的時候,藍圖的名稱會新增到函式名稱的前面

模板

  • jinja 模板引擎
    • {{ }} 靜態資料輸出
    • {% %} 流程控制語句
  • 基礎佈局
    • 模板繼承
    • 程式碼段填充

問題集

  • TypeError: 'builtin_function_or_method' object is not subscriptable
    • 不能夠通過下標訪問,一般是沒有得到正確的例項型別

相關文章