天天看點

Flask架構的藍圖與視圖

您好,我是碼農飛哥,感謝您閱讀本文!接上一篇文章,上篇文章我們介紹了Flask架構與SQLAlchemy架構的整合一分鐘快速實作Flask架構與SQLAlchemy架構的整合,這篇文章我們将介紹Flask架構的藍圖和視圖。

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架構中使用也比較廣泛。

Flask架構的藍圖與視圖