天天看點

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

作者:黑貓程式設計

狀态碼定義

HTTP協定中的狀态行格式,首先是http版本,然後是狀态碼,接着是狀态描述,舉個簡單的例子就是, 版本号HTTP/1.1 狀态碼200 狀态資訊就是 OK 表示請求成功,那404也是狀态碼的一種,表示請求失敗,頁面不存在。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

狀态碼,英文是HTTP Status Code,表示網頁伺服器HTTP協定響應狀态的數字代碼。狀态碼就像信号燈,不同數字表示不同的狀态,也就是用簡單的數字代碼,表示此次伺服器響應狀态,浏覽器根據狀态碼,就能大緻判斷此次請求是成功還是失敗了,失敗的話,又是什麼原因。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

常見狀态碼

認識一些常見的狀态碼:比如302 FOUND 表示資源找到了,但被重定向了。當通路微網誌首頁,如果未登入,就會重定向到登入頁。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

404 NOT FOUND表示請求失敗,頁面不存在,比如通路/user/register,狀态碼就是200,但是通路通路一個不存在的路由/register,檢視狀态碼就是404。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

最後介紹一個狀态碼就是500 INTERNAL SERVER ERROR 表示請求失敗,伺服器内部錯誤,如果伺服器代碼出錯了,就會是500狀态碼。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

HTTP 異常主動抛出

  • abort 方法抛出一個給定狀态代碼的 HTTPException 或者 指定響應,例如想要用一個頁面未找到異常來終止請求,你可以調用 abort(404)。
  • 參數:code – HTTP的錯誤狀态碼
  • 抛出狀态碼的話,隻能抛出 HTTP 協定的錯誤狀态碼

errorhandler 裝飾器

  • 注冊一個錯誤處理程式,當程式抛出指定錯誤狀态碼的時候,就會調用該裝飾器所裝飾的方法
  • 參數:code_or_exception – HTTP的錯誤狀态碼或指定異常
@app.route('/', methods=['GET'])
def home():

    # a = 1 / 0
    return render_template('star.html')


@app.route('/star', methods=['GET'])
def secret():
    name = request.args.get('star')
    for star in stars:
        if star['name'] == name:
            return render_template('star.html', data=star)

    abort(500)

@app.errorhandler(ZeroDivisionError)
def zero_division_error(e):

    return '除數不能為0'

@app.errorhandler(404)
def page_not_found(e):

    return render_template('404.html')

@app.errorhandler(500)
def server_error(e):

    return render_template('500.html')
           

輸出日志資訊:日志概念及作用

在運動的時候,常常會伴随着一系列的生理變化,為了檢測運動過程中有沒有身體異常,我們會記錄運動過程中的心跳,運動速度等。這樣,運動過後,就可以通過報告關注我們的身體健康情況,尋找最适合的運動方法。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

同樣的道理,程式在運作中,有時候也會出現一些警告,錯誤資訊。又或者是管理人員想了解程式的運作情況。那這種情況下能不能也有一個報告記錄有關程式狀況呢?

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

其實可以使用日志來記錄。日志是一種可以追蹤程式運作時所發生事件的方法。在python中,使用logging子產品記錄日志。可以在代碼中調用日志記錄方法來記錄發生的某些事情。那日志的作用就是可以進行程式調試,了解程式運作情況,是否正常,對程式錯誤進行分析與問題定位。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

日志等級

在實際的生活中,會有負責不同内容的從業人員,那他們需要的日志資訊也是不同的。而且如果把程式所有的運作日志全部記錄下來進行分析,是非常耗費機器性能的。是以通常隻需要記錄我們需要的資訊,這樣既可以減小伺服器的壓力,也可以避免我們在排查故障時被淹沒在日志的海洋裡。這就用到了日志的等級。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

logging日志主要分為4個級别:DEBUG是調試級别,一般用于問題的排查,記錄詳細的日志資訊。INFO為普通資訊,詳細程度僅次于DEBUG,确認一切按預期運作。WARNING為警告級别,但是不會影響程式的正常運作。ERROR是錯誤資訊,一般這類資訊就會影響程式運作了。我們可以通過設定不同的日志級别,實作記錄不同詳細程度的日志。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

日志列印

我們可以使用logging子產品的basicconfig函數來設定,指定日志等級和日志存儲路徑。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

代碼是這樣的。首先使用import logging導入logging子產品。然後調用logging的basicconfig函數配置日志。參數level表示日志等級,預設為waring級别,輸出的為waring及以上級别的資訊。在這裡設定為logging.DEBUG,會列印debug及以上級别的資訊。參數filename為日志列印路徑,如果不指定,則列印在控制台。最後我們使用logging.info列印info級别的資訊,logging.warning列印warning級别的資訊。

項目練習

接下來我們要完成這樣的一個效果頁面。這是一個 報名網站,可以多人進行報名資訊填寫,送出資訊進行報名并且儲存資訊。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

但是在程式運作過程中,可能會因為程式崩潰出錯,導緻報名資訊未能及時儲存中。那我們怎麼解決呢?

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

通過之前的學習,我們知道可以通過print方法在控制台輸出關鍵資訊,但是在程式運作過程中産生的資訊很多,是以就需要有人盯着螢幕,從中找到我們需要的資訊,費時又費力。還有個簡單的辦法,就是使用今天學習的logging子產品。把關鍵資訊列印到日志中,這樣就可以不需要專人看守,并且可以随時回看資訊。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

接下來就解決剛才的問題,流程是這樣的,首先擷取請求參數,然後把擷取到報名的關鍵資訊列印在日志中,最後把報名資訊存儲到users中,這樣就算程式出錯,資訊未能儲存庫,我們也可以通過日志來檢視。接下來同學們來嘗試完成一下吧!

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

藍圖子產品

為什麼使用藍圖?

我們之前完成的代碼,都寫在app.py這一個檔案中。不同功能的代碼寫在一個檔案中,會對代碼的維護和擴充造成困難。修改代碼時,可能一不小心就改錯了地方。

在程式中也是這樣的。對于一個網站來說,通常也會有很多的子產品,根據功能的不同,将網站劃分成不同的子產品。

在flask項目中,我們使用藍圖Blueprint來實作子產品化。可以把藍圖看做一個存儲視圖函數的容器,通過藍圖來組織url以及處理請求。

一文詳解Python Flask子產品,自定義錯誤頁面、日志和藍圖子產品

程式實戰

# index.py

from flask import Flask
from handler import *

app = Flask(__name__)
app.debug = True

# 請在下方寫你的代碼:注冊wm_game和wm_store子產品中藍圖
app.register_blueprint(bp_game, url_prefix='/cat1')
app.register_blueprint(bp_store, url_prefix='/cat2')

app.run(host='127.0.0.1', port=8001)
           
# __init__.py

from flask import render_template, Blueprint

bp_game = Blueprint('game', __name__)
bp_store = Blueprint('store', __name__)

from . import wm_game, wm_store
           
from . import * 

@bp_game.route('/wm/game')
def wm_game():

    return render_template('wm_game.html')
           
from . import * 

@bp_store.route('/wm/store')
def wm_game():

    return render_template('wm_store.html')           

相關推薦

  • Python Flask登入和POST請求,雲相冊項目
  • Flask子產品,Python後端最簡潔的伺服器架構
  • Flask http協定和get請求
  • 一文詳解Python Flask子產品設定Cookie和Session
  • Python Flask伺服器子產品,模闆for循環和模闆過濾
  • Javascript擷取className屬性和slice切片