您好,我是碼農飛哥,感謝您閱讀本文!接上一篇文章,上篇文章我們介紹了Flask架構與SQLAlchemy架構的整合一分鐘快速實作Flask架構與SQLAlchemy架構的整合,這篇文章我們将介紹Flask架構的藍圖和視圖。
文章目錄 - 視圖
- 建立藍圖
- 定義藍圖
- 将藍圖注冊到應用中
- 使用藍圖
- 注冊接口
- 登入接口
- 運作
- 總結
- 定義藍圖
- 将藍圖注冊到應用中
- 使用藍圖
- 注冊接口
- 登入接口
- 運作
視圖
視圖是一個應用對請求進行響應的函數。Flask通過模型把進行的請求URL比對到對應的處理視圖。視圖傳回資料,Flask把資料變成出去的響應。Flask也可以反過來,根據視圖的名稱和參數生成URL。
建立藍圖
Blueprint是一種組織一組相關視圖及其他代碼的方法。與把視圖及其他代碼直接注冊到應用的方式不同,藍圖方式是把它們注冊到藍圖,然後在工廠函數中把藍圖注冊到應用中。
項目的結構和環境跟上一篇文章一緻。
定義藍圖
下面的代碼就是定義了一個名為auth的藍圖。檔案位址是:
flaskr/views/__init__.py
from flask import Blueprint
# 建立了一個名稱為'auth'的Blueprint。和應用對象一樣,藍圖需要知道
# 是在哪裡定義的,是以把__name__作為函數的第二個參數,url_prefix會添加到所有與該藍圖關聯的URL前面
bp = Blueprint('auth', __name__, url_prefix='/auth')
# 在腳本的末尾導入是為了避免循環導入依賴
from . import auth
複制
将藍圖注冊到應用中
flaskr/__init__.py
def create_app():
//省略其他代碼
# 導入并注冊藍圖
from flaskr.views import auth
app.register_blueprint(auth.bp)
return app
複制
使用藍圖
在此處,我們定義了一個注冊接口以及使用者登入接口。檔案路徑是:
flaskr/views/auth.py
。
注冊接口
from flaskr.views import bp
from flask import (
flash, redirect, render_template, request, url_for
)
from flaskr.biz import user_service
# @bp.route 關聯了URL /register和register視圖函數。當Flask收到一個指向
# /auth/register的請求時就會調用register視圖并把其傳回值作為響應
@bp.route('/register', methods=('GET', 'POST'))
def register():
# 如果使用者送出了表單,那麼request.method将會是'POST'。這種情況下就會開始
# 驗證使用者的輸入内容。
if request.method == 'POST':
# request.form是一個特殊類型的dict,其映射了送出表單的鍵和值。
# 表單中,使用者将會輸入其 username 和 password 。
username = request.form['username']
password = request.form['password']
error = None
if not username:
error = '使用者名必填'
elif not password:
error = '密碼必填'
elif user_service.query_user_by_username(username, password) is not None:
error = '使用者名 {} 已經被注冊'.format(username)
if error is None:
user_service.insert_user(username, password)
# 使用者資料儲存後将轉到登入頁面,url_for()根據登入視圖的名稱生成相應的URL
# 與寫固定的URL相比,這樣做的好處是如果以後需要修改該試圖相應的URL,那麼不用修改所有涉及到 URL 的代碼。
# redirect() 為生成的 URL 生成一個重定向響應。
return redirect(url_for('auth.login'))
flash(error)
return render_template('auth/register.html')
複制
如上是注冊接口,首先根據傳入的使用者名username和password查詢使用者是否存在,如果存在在直接傳回使用者已被注冊的提示,如果使用者不存在則插入一個新的使用者并重定向到登入頁面。
登入接口
@bp.route('/login', methods=('GET', 'POST'))
def login():
if request.method == 'POST':
# request.form是一個特殊類型的dict,其映射了送出表單的鍵和值。
# 表單中,使用者将會輸入其 username 和 password 。
username = request.form['username']
password = request.form['password']
error = None
user = user_service.query_user_by_username(username, password)
if user is None:
error = '使用者不存在'
elif user.get_username() != username or user.get_password() != password:
error = '使用者名和密碼不正确'
if error is None:
return redirect(url_for('index'))
return render_template('auth/login.html')
複制
首先還是根據使用者名和密碼查詢使用者,如果使用者不存在或者使用者名或密碼不正确則直接傳回錯誤。否則,則登入成功,跳轉到首頁。
運作
運作項目,通路
http://127.0.0.1:5001/auth/register
即可通路登陸接口,插入使用者,但是由于沒有頁面是以傳回會報錯。
總結
本文介紹了如何使用Flask架構中的藍圖和視圖,藍圖在Flask架構中使用也比較廣泛。