头图

本文首发于公众号:Hunter后端

原文链接:Flask笔记二之blueprint和session介绍

前面我们使用 @app.route() 的方式实现了一个简单的接口,用于访问系统接口,接下来介绍一下如何使用 Blueprint 来实现路由的分组以及 Flasksession 的使用。

本篇笔记的代码都已经提交到 github 上,可使用下面的操作获取代码:

git clone https://github.com/x1204604036/flask_backend.git

1、Blueprint 介绍和使用

Blueprint 的使用主要有两步,一步是定义,一步是注册。

下面我们用一个实例来介绍如何使用,比如我们这里使用用户登录验证的接口来操作。

我们在 app/ 文件夹下创建一个名为 user 的文件夹,在其下再创建一个名为 bp_user.py 文件,其内容如下:

# 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"}

这里,我们实例化了 Blueprint,定义一个 bp,然后使用 @bp.route() 的方式定义路由和可以调用的方法,比如 GET,比如 POST

在 login() 函数内部可以进行我们必要的一些逻辑处理,比如用户名密码进行验证操作。

然后需要将其在 app/__init__.py 中注册:

# 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

然后运行我们的系统:

flask run

然后可以使用 postman 来进行 POST 请求测试。

以上就是 Blueprint 的基本使用方法示例。

2、request 请求数据获取

接下来介绍一下 flask 里 request 请求数据的获取

0. 请求方式获取

判断请求类型是什么可以直接使用 request.method,引入方式为:

from flask import request

判断请求类型:

if request.method == "GET":
    print("GET 请求")
elif request.method == "POST":
    print("POST 请求")

1. GET 参数获取

使用 request.args.get() 的方式可以获取 GET 请求的参数,比如我们的请求 api 是 /user/login?username=admin&password=123456
可以这样获取:

if request.method == "GET":
    username = request.args.get("username")
    password = request.args.get("password")

2. POST 表单数据

如果我们是使用 POST 请求的表单数据请求的,我们需要使用 request.form 的方式获取数据:

if request.method == "POST":
    username = request.form.get("username")
    password = request.form.get("password")

3. POST json 数据

如果是使用 POST 放到 json 里传输的,可以使用 request.get_json() 方法获取全部数据:

if request.method == "POST":
    request_json = request.get_json()
    username = request_json.get("username")
    password = request_json.get("password")

3、session 会话操作

接下来介绍一下在 Flask 中使用 session 会话。

这个逻辑大概有三个接口,

第一个接口是登录接口,根据传进来的用户名和密码进行验证登录操作,并将登录信息写入 session

第二个接口是用户信息接口,这个接口需要登录之后才可访问,逻辑是在获取用户信息之前 session 中是否有登录信息

第三个接口是登出接口,也就是注销接口,删除 session 中的登录信息

因为这里还没有介绍数据库的使用,所以接下来示例的检验操作都忽略,直接获取验证结果。

session 的使用介绍

session 通过下面的方式引入:

from flask import session

进行 session 的操作和之前 Django 里对 session 的操作类似,我们可以将 user_id 的信息写入 session,用户访问某些需要登录之后才允许访问的接口时,需要先读取 session 信息

# 将 user_id 写入 session
session["user_id"] = user_id 

session 的清除处理:

session.clear()

下面介绍三个接口的示例

在使用 session 之前,需要设置密钥

我们在 app/__init__.py 中设置:

app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

secret_key 的值生成方式可以通过下面的操作获取:

python3 -c 'import secrets; print(secrets.token_hex())'

登录接口

@bp.route("/login", methods=("POST",))
def login():
    # username = request.form["username"]
    # password = request.form["password"]

    # 验证用户名和密码
    user_id = 1  # 进行用户名和密码验证,去数据库查询获取 user_id 信息
    if user_id:
        session.clear()
        session["user_id"] = user_id
    else:
        return {"code": -1, "msg": "用户名或密码错误"}

    return {"code": 0, "msg": "success"}

登出接口

@bp.route("/logout", methods=("POST",))
def logout():
    session.clear()
    return {"code": 0, "msg": "logout success"}

下面定义一个获取用户信息的接口,这个接口需要设置成的逻辑是需要登录之后才可以访问接口,这里我们可以先设置一个装饰器,然后再加到接口逻辑上:

def login_required(func):
    def wrapped(*args, **kwargs):
        if session.get("user_id") is None:
            return {"code": -1, "msg": "请先登录系统"}
        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}

这个 session 操作相当于是直接将用户信息写入 cookie,之后我们可以尝试将其写入 Redis。

关于这个访问需要登录的设置,后续学习了中间件的操作之后,我们可以直接使用中间件的方式来进行登录访问限制。

如果想获取更多后端相关文章,可扫码关注阅读:


Hunter
27 声望12 粉丝