本文首发于公众号:Hunter后端
前面我们使用 @app.route()
的方式实现了一个简单的接口,用于访问系统接口,接下来介绍一下如何使用 Blueprint
来实现路由的分组以及 Flask
中 session
的使用。
本篇笔记的代码都已经提交到 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。
关于这个访问需要登录的设置,后续学习了中间件的操作之后,我们可以直接使用中间件的方式来进行登录访问限制。
如果想获取更多后端相关文章,可扫码关注阅读:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。