藉助find_modules
,import_string
優雅地註冊藍圖模組
find_modules
, import_string
這兩個函式包含在werkzeug.utils
工具包中,藉助著兩個工具函式可以幫助我們在更優雅的給應用註冊blueprint
模組,尤其是當專案中blueprint
模組很多的時候,會節省很多行程式碼,看起來更加的舒服。
import_string(import_name, silent=False)
import_string 可以通過字串匯出需要匯入的模組或物件:
引數
- import_name:要匯入的物件的模組或物件名稱
- silent:如果設定為True,則忽略匯入錯誤,相反則返回None
find_modules(import_path, include_packages=False, recursive=False)
找到一個包下面的所有模組,這對於自動匯入所有藍圖模組是非常有用的
引數
- import_path:包路徑
- include_packages:如果設定為True,會返回包內的子包
- recursive:是否遞迴搜尋子包
示例程式碼
blueprints/example.py
# 模組部分
# create blueprint :)
bp = Blueprint('bp_name', __name__)
複製程式碼
app.py
# 註冊部分
def register_blueprints(app):
"""Register all blueprint modules"""
for name in find_modules('blueprints'):
module = import_string(name)
if hasattr(module, 'bp'):
app.register_blueprint(module.bp)
return None
複製程式碼
使用Flask中的flash快閃記憶體傳遞反饋資訊
flask的快閃記憶體系統主要是用來想使用者提供反饋資訊。內容一般是對使用者上一次請求中的操作給出反饋。反饋資訊儲存在服務端,使用者可以在本次(且只能在本次)請求中訪問上一次的反饋資訊,當使用者獲得了這些反饋資訊以後,就會被服務端刪除。Flask為jinja2開放了一個get_flashed_messages(with_categories=False, category_filter=[])
函式來獲取上一次的快閃記憶體資訊,這個函式可以直接在模板中使用。
引數
- with_categories:True返回元祖,False返回訊息本身
- category_filter:過濾分類關鍵詞(字串或列表)
後臺當請求結束準備返回的時候,使用flash(message, category='message')
函式來為下次請求儲存一條反饋資訊。
引數
- message:資訊文字
- category:自定義分類關鍵詞
官方示例程式碼
使用Flask中內建日誌系統傳送錯誤日誌郵件
Flask使用python內建的日誌系統,它實際上可以傳送錯誤郵件。
示例程式碼:
ADMINS = ['yourname@example.com']
if not app.debug:
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler('127.0.0.1', #郵件伺服器
'server-error@example.com', #發件人
ADMINS, #收件人
'YourApplication Failed') #郵件主題
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
複製程式碼
還可以更進一步,將錯誤日誌格式化,方便閱讀:
from logging import Formatter
mail_handler.setFormatter(Formatter('''
Message type: %(levelname)s
Location: %(pathname)s:%(lineno)d
Module: %(module)s
Function: %(funcName)s
Time: %(asctime)s
Message:
%(message)s
'''))
複製程式碼
關於SMTPHandler的介紹,訪問官網SMTPHandler手冊
提前中斷請求返回錯誤碼,並定製相應錯誤頁面
在Flask中我們能夠用redirect()
函式重定向使用者到其它地方。還能夠用 abort()
函式提前中斷一個請求並帶有一個錯誤程式碼。
示例程式碼
from flask import abort, redirect, url_for
@app.route('/')
def index():
return redirect(url_for('login'))
@app.route('/login')
def login():
abort(404)
this_is_never_executed() # 永遠不會被執行到
複製程式碼
配合Flask提供的 errorhandler()
裝飾器定製自己的相應錯誤介面
from flask import render_template
@app.errorhandler(404)
def page_not_found(error):
return render_template('page_not_found.html'), 404
複製程式碼
注意到 404
是在 render_template()
呼叫之後。告訴 Flask 該頁的錯誤程式碼應是 404
, 即沒有找到。``