Python Web 开发 | Flask(一) 简单实现用户注册、登录、注销、查询接口 | 初学者案例 | 简单封装响应数据 | 使用 Postman 进行接口测试

文章目录

Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架。接下来以初学者的角度来编写后端的接口,不涉及前端代码,即没有用到 Flask 的模板渲染。

运行环境:

  • windows11
  • PyCharm 专业版 2021.3
  • MySQL 5.7.36
  • Navicat 15 数据库管理工具
  • Postman 接口请求工具
  • Anaconda 3
  • python 3.8
  • flask 2.2.0
  • flask_sqlalchemy 2.5.1 ,flask 框架支持ORM 数据持久化的库

案例的文件结构:

Python Web 开发 | Flask(一) 简单实现用户注册、登录、注销、查询接口 | 初学者案例 | 简单封装响应数据 | 使用 Postman 进行接口测试

; 一、前置准备

1.1 创建数据表

本次小案例,只用到一张用户表 sys_user

Python Web 开发 | Flask(一) 简单实现用户注册、登录、注销、查询接口 | 初学者案例 | 简单封装响应数据 | 使用 Postman 进行接口测试

建表的 MySQL 语句:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS sys_user;
CREATE TABLE sys_user  (
  user_id int(11) NOT NULL AUTO_INCREMENT,
  user_name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  user_password varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (user_id) USING BTREE,
  UNIQUE INDEX user_name(user_name) USING BTREE COMMENT '用户名称不可重复'
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO sys_user VALUES (1, '小王', '123456');
INSERT INTO sys_user VALUES (2, '小绿', '123456');
INSERT INTO sys_user VALUES (3, 'uni', '123456');

SET FOREIGN_KEY_CHECKS = 1;

1.2 修改 Postman 的请求头

最后在进行接口测试时,需要通过 JSON 传值,这里需要指定为 application/json; 的格式,为避免出现中文乱码,最好加上charset=utf8

Python Web 开发 | Flask(一) 简单实现用户注册、登录、注销、查询接口 | 初学者案例 | 简单封装响应数据 | 使用 Postman 进行接口测试
Content-Type = application/json;charset=utf8

二、具体实现

2.1 utils.py

Flask 框架在处理请求后,返回的数据必须是可转化为JSON的类型,即字典类型。此工具文件中的方法支持将列表里的所有 User 对象转化到 dict 字典中,其中的 key 为下标,value 则为 Use对象调用 dict() 的结果,这个方法是自定义的,待会在 models.py 里会说明。

"""
    将列表里的对象逐一转化为字典, 对象需提供 dict 方法
"""
def model_list_to_dict(modelList: list):
    result = {}
    for index, model in enumerate(modelList):
        result.update({index: model.dict()})
    return result

2.2 mysql.py

该脚本只是创建了 SQLAlchemy() 对象,至于为什么将它单独放在这个文件里,是因为后面的 models.py 和 app.py 都将用到它,这里类似单例模式的设计,是为了防止重复创建 SQLAlchemy() 对象

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

2.3 models.py

Flask 框架中 flask_sqlalchemy 库 支持数据库的交互,使用前需定义数据库中表的对应类,该类的特点有:

  • 必须继承 SQLAlchemy() 对象中的 Model
  • 必须指定表名, __tablename__
  • 定义字段对应的变量必须是静态变量,且需调用 SQLAlchemy() 对象的 Column 方法

这里的 dict() 方法是我自定义的,个人觉得这样比较方便,在 Flask 返回数据时必须是能转化成 JSON 的字符串,同时在输出时也方便查看,相当于 Java 的 toString

`python
from mysql import db

“””————————————–
定义 MySQL 用户的映射类

pymysql.install_as_MySQLdb()

app.config[‘SQLALCHEMY_DATABASE_URI’] = “mysql://root:woaini@localhost:3306/flask_test_db”

app.config[‘JSON_AS_ASCII’] = False

app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = False

app.config[‘SECRET_KEY’] = ‘I LIKE U’

db.init_app(app)

“””—————————————-
API: 初始化
@app.route(‘/user’, methods=[‘GET’])
def user_find_all():
userList: List[User] = User.query.all()
return r(code=200, msg=’用户查询成功’, data=model_list_to_dict(userList))

“””—————————————-
API: 根据ID查询指定用户
@app.route(‘/register’, methods=[‘POST’])
def user_register():
reqJSONData = request.get_json(silent=True)

if not reqJSONData: return r(code=401, msg='注册失败, 请求参数为空')
username = reqJSONData.get('username')
password = reqJSONData.get('password')

if not all([username, password]):
    return r(code=401, msg='注册失败, 缺少请求参数', )

try:
    user = User.query.filter_by(name=username).first()
    if user:
        return r(code=401, msg='注册失败, 用户已存在')
except Exception as e:
    print(e, '[Error] in [/user] [POST] when select MYSQL user where name=[] .')
    return r(code=402, msg='服务器内部出错')

user = User(name=username, password=password)
try:
    db.session.add(user)
    db.session.commit()
except Exception as e:
    db.session.rollback()
    print(e, '[Error] in [/user] [POST] when inserting a user into MySQL.')
    return r(code=402, msg='服务器内部出错')
print('新用户注册成功:  ', user.dict())
return r(code=200, msg='注册成功', data=user.dict())

“””—————————————-
API: 用户登录
@app.route(‘/login’, methods=[‘GET’])
def user_check_login():
userDict = session.get(‘user_info’)
if not userDict:
return r(code=401, msg=’未登录’)
else:
return r(msg=’用户已登录’, data=userDict)

“””—————————————-
API: 注销登录

Original: https://blog.csdn.net/Unirithe/article/details/126151896
Author: 尤Ni
Title: Python Web 开发 | Flask(一) 简单实现用户注册、登录、注销、查询接口 | 初学者案例 | 简单封装响应数据 | 使用 Postman 进行接口测试

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/744298/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球