寫Flask應用時的一些優雅技巧

vimiix發表於2017-12-19

藉助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 , 即沒有找到。``

原文連結:vimiix.com/post/2017/1…

相關文章