Blueprint實(shí)現(xiàn)路由分組及Flask中session的使用詳解
正文
前面我們使用 @app.route()
的方式實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的接口,用于訪問系統(tǒng)接口,接下來介紹一下如何使用 Blueprint
來實(shí)現(xiàn)路由的分組以及 Flask
中 session
的使用。
本篇筆記的代碼都已經(jīng)提交到 github 上,可使用下面的操作獲取代碼:
git clone https://github.com/x1204604036/flask_backend.git
1、Blueprint 介紹和使用
Blueprint 的使用主要有兩步,一步是定義,一步是注冊(cè)。
下面我們用一個(gè)實(shí)例來介紹如何使用,比如我們這里使用用戶登錄驗(yàn)證的接口來操作。
我們?cè)?nbsp;app/
文件夾下創(chuàng)建一個(gè)名為 user
的文件夾,在其下再創(chuàng)建一個(gè)名為 bp_user.py
文件,其內(nèi)容如下:
# app/user/bp_user.py from flask import Blueprint, request bp = Blueprint("user", __name__, url_prefix="/user") @bp.route("/login", methods=("POST", "GET")) def login(): # username = request.form["username"] # password = request.form["password"] return {"code": 0, "msg": "success"}
這里,我們實(shí)例化了 Blueprint
,定義一個(gè) bp
,然后使用 @bp.route()
的方式定義路由和可以調(diào)用的方法,比如 GET
,比如 POST
。
在 login() 函數(shù)內(nèi)部可以進(jìn)行我們必要的一些邏輯處理,比如用戶名密碼進(jìn)行驗(yàn)證操作。
然后需要將其在 app/__init__.py
中注冊(cè):
# app/__init__.py from flask import Flask def create_app(): app = Flask(__name__) from .user import bp_user app.register_blueprint(bp_user.bp) return app
然后運(yùn)行我們的系統(tǒng):
flask run
然后可以使用 postman 來進(jìn)行 POST 請(qǐng)求測(cè)試。
以上就是 Blueprint 的基本使用方法示例。
2、request 請(qǐng)求數(shù)據(jù)獲取
接下來介紹一下 flask 里 request 請(qǐng)求數(shù)據(jù)的獲取
請(qǐng)求方式獲取
判斷請(qǐng)求類型是什么可以直接使用 request.method,引入方式為:
from flask import request
判斷請(qǐng)求類型:
if request.method == "GET": print("GET 請(qǐng)求") elif request.method == "POST": print("POST 請(qǐng)求")
GET 參數(shù)獲取
使用 request.args.get()
的方式可以獲取 GET
請(qǐng)求的參數(shù),比如我們的請(qǐng)求 api 是 /user/login?username=admin&password=123456
可以這樣獲?。?/p>
if request.method == "GET": username = request.args.get("username") password = request.args.get("password")
POST 表單數(shù)據(jù)
如果我們是使用 POST 請(qǐng)求的表單數(shù)據(jù)請(qǐng)求的,我們需要使用 request.form 的方式獲取數(shù)據(jù):
if request.method == "POST": username = request.form.get("username") password = request.form.get("password")
POST json 數(shù)據(jù)
如果是使用 POST 放到 json 里傳輸?shù)?,可以使?request.get_json() 方法獲取全部數(shù)據(jù):
if request.method == "POST": request_json = request.get_json() username = request_json.get("username") password = request_json.get("password")
3、session 會(huì)話操作
接下來介紹一下在 Flask 中使用 session 會(huì)話。
這個(gè)邏輯大概有三個(gè)接口,
第一個(gè)接口是登錄接口,根據(jù)傳進(jìn)來的用戶名和密碼進(jìn)行驗(yàn)證登錄操作,并將登錄信息寫入 session
第二個(gè)接口是用戶信息接口,這個(gè)接口需要登錄之后才可訪問,邏輯是在獲取用戶信息之前 session 中是否有登錄信息
第三個(gè)接口是登出接口,也就是注銷接口,刪除 session 中的登錄信息
因?yàn)檫@里還沒有介紹數(shù)據(jù)庫(kù)的使用,所以接下來示例的檢驗(yàn)操作都忽略,直接獲取驗(yàn)證結(jié)果。
session 的使用介紹
session 通過下面的方式引入:
from flask import session
進(jìn)行 session 的操作和之前 Django 里對(duì) session 的操作類似,我們可以將 user_id 的信息寫入 session,用戶訪問某些需要登錄之后才允許訪問的接口時(shí),需要先讀取 session 信息
# 將 user_id 寫入 session session["user_id"] = user_id
session 的清除處理:
session.clear()
下面介紹三個(gè)接口的示例
在使用 session 之前,需要設(shè)置密鑰
我們?cè)?app/__init__.py 中設(shè)置:
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
secret_key 的值生成方式可以通過下面的操作獲?。?/p>
python3 -c 'import secrets; print(secrets.token_hex())'
登錄接口
@bp.route("/login", methods=("POST",)) def login(): # username = request.form["username"] # password = request.form["password"] # 驗(yàn)證用戶名和密碼 user_id = 1 # 進(jìn)行用戶名和密碼驗(yàn)證,去數(shù)據(jù)庫(kù)查詢獲取 user_id 信息 if user_id: session.clear() session["user_id"] = user_id else: return {"code": -1, "msg": "用戶名或密碼錯(cuò)誤"} return {"code": 0, "msg": "success"}
登出接口
@bp.route("/logout", methods=("POST",)) def logout(): session.clear() return {"code": 0, "msg": "logout success"}
下面定義一個(gè)獲取用戶信息的接口,這個(gè)接口需要設(shè)置成的邏輯是需要登錄之后才可以訪問接口,這里我們可以先設(shè)置一個(gè)裝飾器,然后再加到接口邏輯上:
def login_required(func): def wrapped(*args, **kwargs): if session.get("user_id") is None: return {"code": -1, "msg": "請(qǐng)先登錄系統(tǒng)"} return func(*args, **kwargs) return wrapped @bp.route("/user_info", methods=("POST",)) @login_required def get_user_info(): user_id = session.get("user_id") user_info = {"user_id": user_id} # get user info from db return {"code": 0, "msg": "success", "user_info": user_info}
這個(gè) session 操作相當(dāng)于是直接將用戶信息寫入 cookie,之后我們可以嘗試將其寫入 Redis。
關(guān)于這個(gè)訪問需要登錄的設(shè)置,后續(xù)學(xué)習(xí)了中間件的操作之后,我們可以直接使用中間件的方式來進(jìn)行登錄訪問限制。
以上就是Flask筆記二之blueprint和session介紹的詳細(xì)內(nèi)容,更多關(guān)于Flask筆記blueprint和session介紹的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python爬蟲簡(jiǎn)單的添加代理進(jìn)行訪問的實(shí)現(xiàn)代碼
本文通過實(shí)例代碼給大家介紹了python爬蟲簡(jiǎn)單的添加代理進(jìn)行訪問,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04詳解python使用金山詞霸的翻譯功能(調(diào)試工具斷點(diǎn)的使用)
這篇文章主要介紹了詳解python使用金山詞霸的翻譯功能(調(diào)試工具斷點(diǎn)的使用),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01如何將tensorflow訓(xùn)練好的模型移植到Android (MNIST手寫數(shù)字識(shí)別)
這篇文章主要介紹了將tensorflow訓(xùn)練好的模型移植到Android (MNIST手寫數(shù)字識(shí)別),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04對(duì)Python 語(yǔ)音識(shí)別框架詳解
今天小編就為大家分享一篇對(duì)Python 語(yǔ)音識(shí)別框架詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12Pandas?DataFrame添加一行數(shù)據(jù)的幾種方法
在處理數(shù)據(jù)分析和數(shù)據(jù)科學(xué)項(xiàng)目時(shí),經(jīng)常會(huì)使用到Python中的pandas庫(kù)來進(jìn)行數(shù)據(jù)操作和分析,其中DataFrame是pandas庫(kù)中最重要的數(shù)據(jù)結(jié)構(gòu)之一,這篇文章主要給大家介紹了關(guān)于Pandas?DataFrame添加一行數(shù)據(jù)的幾種方法,需要的朋友可以參考下2024-08-08python實(shí)現(xiàn)股票歷史數(shù)據(jù)可視化分析案例
股票交易數(shù)據(jù)分析可直觀股市走向,對(duì)于如何把握股票行情,快速解讀股票交易數(shù)據(jù)有不可替代的作用,感興趣的可以了解一下2021-06-06