今天基本上進入了最重要也是最後的一個階段,但相對來說今天的內容會比較輕鬆,量也比較少。
事不宜遲,就直接來看程式碼,views.py
是昨天在 app/main/
建立的那個,HTML 都要放在 templates/
裡面。
error.html
{% extends "base.html" %}
{% block title %}{{ code }}{% endblock %}
{% block content %}
<div>
<h1>{{ code }}</h1>
<p>{{ name }}</p>
</div>
{% endblock %}
index.html
{% extends "base.html" %}
{% block title %}Index Page{% endblock %}
{% block content %}
<p>Index Page</p>
{% endblock %}
views.py
from flask import render_template, redirect, url_for
from werkzeug.exceptions import HTTPException
from . import main_bp
@main_bp.route("/", methods=["GET"])
def index_page():
return render_template("index.html")
@main_bp.app_errorhandler(401)
def handler_401(e):
return redirect(url_for("user.login_page"))
@main_bp.app_errorhandler(HTTPException)
def handler(e):
return render_template("error.html", code=e.code, name=e.name), e.code
先看到前面兩個 HTML,他們都是繼承之前寫好的 base.html
,所以都非常簡單。第二個沒什麼好說的,基本上就自由發揮。第一個比較麻煩,他有 code
和 name
兩個從 render_template
傳過來的變數,等等在下面就會看到,在這一頁基本上就是簡單地把它們顯示出來而已。
接下來看到 views.py
,一樣第一個路徑就跳過,沒什麼好說的。第二個是處理 401 錯誤的 handler,我們在這邊讓他重新導向到登入頁面。最後一個 handler 處理所有錯誤,並且使用了 e.code
、e.name
來把一些內容傳入,他們分別是 HTTP status code 和該錯誤的說明,像是 Not Found 之類的。在最後,我們把 e.code
當成回傳的 HTTP status code。
How to handle ordering of flask error handlers