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/__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命令(註冊資料庫命令列)
- 初始化資料庫檔案
藍圖和檢視
- 檢視
- 一個應用對請求進行響應的函式
- 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