• Flask笔记二之blueprint和session介绍


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

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

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

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

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

    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"}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    这里,我们实例化了 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    然后运行我们的系统:

    flask run
    
    • 1

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

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

    2、request 请求数据获取

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

    0. 请求方式获取

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

    from flask import request
    
    • 1

    判断请求类型:

    if request.method == "GET":
        print("GET 请求")
    elif request.method == "POST":
        print("POST 请求")
    
    • 1
    • 2
    • 3
    • 4
    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")
    
    • 1
    • 2
    • 3
    2. POST 表单数据

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

    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")
    
    • 1
    • 2
    • 3
    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")
    
    • 1
    • 2
    • 3
    • 4

    3、session 会话操作

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

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

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

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

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

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

    session 的使用介绍

    session 通过下面的方式引入:

    from flask import session
    
    • 1

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

    # 将 user_id 写入 session
    session["user_id"] = user_id 
    
    • 1
    • 2

    session 的清除处理:

    session.clear()
    
    • 1

    下面介绍三个接口的示例

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

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

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

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

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

    登录接口

    @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"}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    登出接口

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

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

    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}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

  • 相关阅读:
    [HDLBits] Exams/2013 q2afsm
    nasa教学纳卫星计划-36
    【Java】IO流体常用类FileReader和FileWriter
    自定义Key类型的字典无法序列化的N种解决方案
    【MyBatis源码分析】一.JDBC回顾
    【面试经典150 | 哈希表】赎金信
    SpringBoot实战:国际化组件MessageSource的执行逻辑与源码
    【学习笔记】构造
    【每日一题】掷骰子等于目标和的方法数
    力扣刷题笔记28——验证回文串/isalnum/逆序string
  • 原文地址:https://blog.csdn.net/weixin_43354181/article/details/134543705