在Flask中構建API介面的相關概念

2023-02-11 06:01:00

在Flask中構建API介面的相關概念

重定向行為

斜槓

以下兩個路由的不同之處在於是否使用尾部的斜槓。

第一個路由的URL尾部有一個斜槓,看起來就像一個資料夾,存取一個沒有斜槓結尾的URL時,Flask會自動進行重定向,在結尾加上一個斜槓。

第二個路由的URL沒有尾部斜槓,因此其行為表現與一個檔案類似,如果存取這個URL時新增了尾部斜槓就會得到一個404錯誤,這樣可以保持URL唯一,並幫助搜尋引擎避免重複索引同一頁面。

@app.route('/home/')
def hello_world():
    return 'Hello World!'
    
@app.route('/home')
def hello_world():
    return 'Hello World!'

redirect

from flask import Flask, redirect

@app.route('/baidu')
def baidu():
    return redirect('https://www.baidu.com')

Flask HTTP方法

1 GET 請求指定的頁面資訊,並返回實體主體。
2 POST 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
3 PUT 從使用者端向伺服器傳送的資料取代指定的檔案的內容。
4 DELETE 請求伺服器刪除指定的頁面。
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

登入登出案例

# 登入
@app.route("/login", methods=['POST'])
def login():
    """
    username: 123456
    password: 123456
    :return:
    """
    get_data = request.get_json()
    username = get_data.get("username")
    password = get_data.get("password")

    if not all([username, password]):
        return jsonify(msg="引數不完整")

    if username == '123456' and password == '123456':
        # 如果驗證通過,儲存登入狀態在session中
        session['username'] = username
        return jsonify(msg='登入成功')
    else:
        return jsonify(msg='賬號或密碼錯誤')

# 檢查登入狀態
@app.route("/session", methods=["GET"])
def check_session():
    username = session.get("username")
    if username is not None:
        return jsonify(username=username)
    else:
        return jsonify(msg="出錯了,沒登入")

# 登出
@app.route('/logout', methods=['GET'])
def logout():
    session.clear()
    return jsonify(msg='成功退出登入')

要存取cookie,可以使用cookie屬性,通過使用響應物件的set_cookie方法來設定cookie。請求物件的cookie屬性是一個包含了使用者端傳輸的所有cookie的字典。在Flask中,如果使用session,就不要直接使用cookie,因為session比較安全一些。

Session

session 是基於cookie實現, 儲存在伺服器端的鍵值對(形式為 {隨機字串:‘xxxxxx’}), 同時在瀏覽器中的cookie中也對應一相同的隨機字串,用來再次請求的 時候驗證。

一、設定SECRET_KEY

因為flask的session是通過加密之後放到了cookie中,所以需要設定「SECRET_KEY」。

設定方法

新建一個config.py的檔案設定secret_key

config.py

SECRET_KEY = 'XXXXXXXXX'

然後在主執行檔案裡面新增config檔案裡面的內容。

from flask import Flask,session
import config
app = Flask(__name__)
app.config['SECRET_KEY'] = config.SECRET_KEY  # 寫法一
app.secret_key = config.SECRET_KEY  # 寫法二

二、操作session

操作session的方法就如同操作字典。

設定session

# 設定session
@app.route('/')
def set():
     session['name'] = 'lili' # 設定「字典」鍵值對
     return 'success'

讀取session

因為session就像字典一樣所以,操作它的時候有兩種方法:

  • (1)result = session[‘key’] :如果內容不存在,將會報異常。
  • (2)result = session.get(‘key’) :如果內容不存在,將返回None(推薦用法)。
# 讀取session
@app.route('/get')
def get():
    session['name']  # 寫法一
    session.get('name')  # 寫法二
    return 'success'

刪除session

# 刪除session
@app.route('/delete/')
def delete():
    session.pop('name',None)  # 寫法一
    session['name'] = False  # 寫法二
    return 'success'

清除session中所有資料

# 清除session中所有資料
@app.route('/clear')
def clear():
    session.clear()
    return 'success'

三、設定session的過期時間

若沒有指定session的過期時間,那麼預設是瀏覽器關閉後就自動結束。session.permanent = True語句在flask下則可以將有效期延長至一個月。

方法一

 # 設定session
 @app.route('/')
 def set():
     session['name'] = 'lili'
     session.permanent = True # 長期有效,一個月的時間有效
     return 'success'

方法二

  • 1.引入包:from datetime import timedelta
  • 2.設定有效期限:app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 設定7天有效
  • 3.設定:session.permanent = True
#encoding: utf-8
from flask import Flask,session
from datetime import timedelta
import os 
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7) # 設定7天有效 

# 設定session
@app.route('/')
def set():
    session['username'] = 'liefyuan'
    session.permanent = True
    return 'success'

Postman

在構建API介面時,可以使用Postman工具來進行介面測試。

Postman介面導航