狀态碼定義
HTTP協定中的狀态行格式,首先是http版本,然後是狀态碼,接着是狀态描述,舉個簡單的例子就是, 版本号HTTP/1.1 狀态碼200 狀态資訊就是 OK 表示請求成功,那404也是狀态碼的一種,表示請求失敗,頁面不存在。
狀态碼,英文是HTTP Status Code,表示網頁伺服器HTTP協定響應狀态的數字代碼。狀态碼就像信号燈,不同數字表示不同的狀态,也就是用簡單的數字代碼,表示此次伺服器響應狀态,浏覽器根據狀态碼,就能大緻判斷此次請求是成功還是失敗了,失敗的話,又是什麼原因。
常見狀态碼
認識一些常見的狀态碼:比如302 FOUND 表示資源找到了,但被重定向了。當通路微網誌首頁,如果未登入,就會重定向到登入頁。
404 NOT FOUND表示請求失敗,頁面不存在,比如通路/user/register,狀态碼就是200,但是通路通路一個不存在的路由/register,檢視狀态碼就是404。
最後介紹一個狀态碼就是500 INTERNAL SERVER ERROR 表示請求失敗,伺服器内部錯誤,如果伺服器代碼出錯了,就會是500狀态碼。
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中,使用logging子產品記錄日志。可以在代碼中調用日志記錄方法來記錄發生的某些事情。那日志的作用就是可以進行程式調試,了解程式運作情況,是否正常,對程式錯誤進行分析與問題定位。
日志等級
在實際的生活中,會有負責不同内容的從業人員,那他們需要的日志資訊也是不同的。而且如果把程式所有的運作日志全部記錄下來進行分析,是非常耗費機器性能的。是以通常隻需要記錄我們需要的資訊,這樣既可以減小伺服器的壓力,也可以避免我們在排查故障時被淹沒在日志的海洋裡。這就用到了日志的等級。
logging日志主要分為4個級别:DEBUG是調試級别,一般用于問題的排查,記錄詳細的日志資訊。INFO為普通資訊,詳細程度僅次于DEBUG,确認一切按預期運作。WARNING為警告級别,但是不會影響程式的正常運作。ERROR是錯誤資訊,一般這類資訊就會影響程式運作了。我們可以通過設定不同的日志級别,實作記錄不同詳細程度的日志。
日志列印
我們可以使用logging子產品的basicconfig函數來設定,指定日志等級和日志存儲路徑。
代碼是這樣的。首先使用import logging導入logging子產品。然後調用logging的basicconfig函數配置日志。參數level表示日志等級,預設為waring級别,輸出的為waring及以上級别的資訊。在這裡設定為logging.DEBUG,會列印debug及以上級别的資訊。參數filename為日志列印路徑,如果不指定,則列印在控制台。最後我們使用logging.info列印info級别的資訊,logging.warning列印warning級别的資訊。
項目練習
接下來我們要完成這樣的一個效果頁面。這是一個 報名網站,可以多人進行報名資訊填寫,送出資訊進行報名并且儲存資訊。
但是在程式運作過程中,可能會因為程式崩潰出錯,導緻報名資訊未能及時儲存中。那我們怎麼解決呢?
通過之前的學習,我們知道可以通過print方法在控制台輸出關鍵資訊,但是在程式運作過程中産生的資訊很多,是以就需要有人盯着螢幕,從中找到我們需要的資訊,費時又費力。還有個簡單的辦法,就是使用今天學習的logging子產品。把關鍵資訊列印到日志中,這樣就可以不需要專人看守,并且可以随時回看資訊。
接下來就解決剛才的問題,流程是這樣的,首先擷取請求參數,然後把擷取到報名的關鍵資訊列印在日志中,最後把報名資訊存儲到users中,這樣就算程式出錯,資訊未能儲存庫,我們也可以通過日志來檢視。接下來同學們來嘗試完成一下吧!
藍圖子產品
為什麼使用藍圖?
我們之前完成的代碼,都寫在app.py這一個檔案中。不同功能的代碼寫在一個檔案中,會對代碼的維護和擴充造成困難。修改代碼時,可能一不小心就改錯了地方。
在程式中也是這樣的。對于一個網站來說,通常也會有很多的子產品,根據功能的不同,将網站劃分成不同的子產品。
在flask項目中,我們使用藍圖Blueprint來實作子產品化。可以把藍圖看做一個存儲視圖函數的容器,通過藍圖來組織url以及處理請求。
程式實戰
# 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切片