1.概述

对于新增加的用户字段,需要在接口中添加。

2.流程概述

2.1后端通过Flask-SQLAlchemy新增用户数据(添加字段rid)

def put(self):
        # 这次不适用reqparse获取数据,采用form表单中获取
        try:
            id = int(request.form.get('id').strip())
            email = request.form.get('email').strip() if request.form.get('email') else ''
            phone = request.form.get('phone').strip() if request.form.get('phone') else ''
            rid = request.form.get('role_name').strip() if request.form.get('role_name') else ''
            usr = models.User.query.get(id)
            if usr:
                usr.email = email
                usr.phone = phone
                usr.rid = rid
                # 提交给数据库
                db.session.commit()
                return to_dict_msg(200,msg="修改数据成功!!!")
        except Exception as e:
            print(e)
            return to_dict_msg(10018)

2.2 后端通过Flask-SQLAlchemy修改用户数据(添加字段rid)

def post(self):
        name = request.form.get('name')
        pwd= request.form.get('pwd')
        real_pwd = request.form.get('real_pwd')
        nick_name = request.form.get('nick_name')
        phone = request.form.get('phone')
        email = request.form.get('email')
        # 验证数据的正确性
        if not all([name,pwd,real_pwd]):
            print(name,pwd,real_pwd)
            return to_dict_msg(10000)
        if len(name)<2:
            return to_dict_msg(10001)
        if len(pwd)<2:
            return to_dict_msg(10012)
        if pwd != real_pwd:
            return to_dict_msg(10013)
        # 正则表达式验证手机号和邮箱
        # ^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$
        if not re.match(r'^1[35789]\d{9}$',phone):
            return to_dict_msg(10014)
        if not re.match(r'^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$',email):
            return to_dict_msg(10015)
        # 由于可能在数据库中会抛出异常,还是得做一个尝试
        try:
            # 提交数据
            # 注意这里的密码要加密处理,不可以直接返回给保存到数据库中得变量pwd,返回给函数password
            rid = int(request.form.get('role_name')) if request.form.get('role_name') else 0
            usr = models.User(name=name, password = pwd, nick_name = nick_name, phone = phone,email = email)
            db.session.add(usr)
            db.session.commit()
            return to_dict_msg(200)
        except Exception as e:
            print(e)
            return to_dict_msg(2000)

3.Postman测试

3.1测试1——修改用户

flask sqlalchemy 时间大小比较查询 flask sqlalchemy更新_mysql

3.2测试2——添加用户到数据库

flask sqlalchemy 时间大小比较查询 flask sqlalchemy更新_数据库_02

4.完整代码展示

# flask_shop/user/view.py
# 此文件用于处理关于用户的业务逻辑,视图都写在这

# 导入用户的蓝图对象,这里的user不是文件,是在user.py定义好的蓝图对象
from flask import request
from flask_shop.user import user,user_api
from flask_shop import models,db
from flask_restful import Resource,reqparse
import re
from flask_shop.utils.message import to_dict_msg
from flask_shop.utils.tokens import generate_auth_token,verify_auth_token,login_requed
@user.route("/")
def index():
    return "Hello user"

# 用flask_restful实现注册功能
# 使用flask_restful 必须继承Resource类
class User(Resource):
    # get请求访问
    def get(self):
        # 防止没有用户id产生报错
        try:
            # 通过参数获取用户的id
            id = int(request.args.get('id').strip())
            print("888")
            usr = models.User.query.filter_by(id = id).first()
            print(type(usr))
            if usr:
                return to_dict_msg(200, usr.to_dict(), "获取用户成功!")
            else:
                return to_dict_msg(200, [], '没有此用户')
        except Exception as e:
            print(e)
            return to_dict_msg(10000)
    # post请求访问
    # 注册用户    
    def post(self):
        name = request.form.get('name')
        pwd= request.form.get('pwd')
        real_pwd = request.form.get('real_pwd')
        nick_name = request.form.get('nick_name')
        phone = request.form.get('phone')
        email = request.form.get('email')
        # 验证数据的正确性
        if not all([name,pwd,real_pwd]):
            print(name,pwd,real_pwd)
            return to_dict_msg(10000)
        if len(name)<2:
            return to_dict_msg(10001)
        if len(pwd)<2:
            return to_dict_msg(10012)
        if pwd != real_pwd:
            return to_dict_msg(10013)
        # 正则表达式验证手机号和邮箱
        # ^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$
        if not re.match(r'^1[35789]\d{9}$',phone):
            return to_dict_msg(10014)
        if not re.match(r'^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$',email):
            return to_dict_msg(10015)
        # 由于可能在数据库中会抛出异常,还是得做一个尝试
        try:
            # 提交数据
            # 注意这里的密码要加密处理,不可以直接返回给保存到数据库中得变量pwd,返回给函数password
            rid = int(request.form.get('role_name')) if request.form.get('role_name') else 0
            usr = models.User(name=name, password = pwd, nick_name = nick_name, phone = phone,email = email)
            db.session.add(usr)
            db.session.commit()
            return to_dict_msg(200)
        except Exception as e:
            print(e)
            return to_dict_msg(2000)
    
    # 修改用户信息
    def put(self):
        # 这次不适用reqparse获取数据,采用form表单中获取
        try:
            id = int(request.form.get('id').strip())
            email = request.form.get('email').strip() if request.form.get('email') else ''
            phone = request.form.get('phone').strip() if request.form.get('phone') else ''
            rid = int(request.form.get('role_name')) if request.form.get('role_name') else ''

            usr = models.User.query.get(id)
            if usr:
                usr.email = email
                usr.phone = phone
                usr.rid = rid
                # 提交给数据库
                db.session.commit()
                return to_dict_msg(200,msg="修改数据成功!!!")
        except Exception as e:
            print(e)
            return to_dict_msg(10018)
    
    def delete(self):
        try:
            id = request.json.get('id')
            usr = models.User.query.get(id)
            if usr:
                db.session.delete(usr)
                db.session.commit()
                return to_dict_msg(200,msg='删除用户成功!')
            else:
                return to_dict_msg(10019)
        except Exception as e:
            print(e)
            return to_dict_msg(2000)



# flask_restful注册路由地址
user_api.add_resource(User,'/user')




# 定义一个获取用户列表的类
class UserList(Resource):
    def get(self):
        # 用于数据验证
        parser = reqparse.RequestParser()
        # 给定规定的数据格式
        parser.add_argument('name',type=str)
        parser.add_argument('pnum',type=int)
        parser.add_argument('psize',type=int)
        try:
            # 获取数据
            args = parser.parse_args()
            # 把参数传递给变量
            name = args.get('name')
            # 如果获取不到就往下执行,如果获取到就赋值给pnum
            pnum = args.get('pnum') if args.get('pnum') else 1
            psize = args.get('psize') if args.get('psize') else 2
            # 对name进行过滤
            if name:
                # 如果存在,则就模糊搜索
                users_p = models.User.query.filter(models.User.name.like(f'%{name}%')).paginate(pnum,psize)
            else:
                # 如果不存在name,全部输出
                users_p = models.User.query.paginate(pnum,psize)
            data = {
                'pnum':pnum,
                'totalPage':users_p.total,
                'users':[u.to_dict() for u in users_p.items]
            }
            return to_dict_msg(200,data,'获取用户列表成功')
        except Exception as e:
            return to_dict_msg(10000)

user_api.add_resource(UserList,'/user_list')




# 后端登录的实现
# 使用get请求不安全
@user.route('/login',methods=['POST'])
# 调用验证是否登录的装饰器
# @login_requed
def login():
    # 从前端输入框中获取,此时还没写前端使用postman测试
    name = request.form.get('name')
    pwd= request.form.get('pwd')
    # 判断两个是否为非空值
    if not all([name,pwd]):
        return {'status':10000,'msg':'数据不完整'}
    if len(name) > 1:
        # SQLALCHEMY查询语句:获取用户字段,得到实例对象
        usr = models.User.query.filter_by(name =name).first()
        if usr:
            # 调用usr视图中的验证蓝图
            if usr.check_password(pwd):
                # 登录成功生成token,实现免密登录
                token = generate_auth_token(usr.id,10000000000)
                # 用于验证token是否可以使用
                verify_auth_token(token)
                return to_dict_msg(200,data={'token':token})
    return {'status':10001,'msg':'用户名或密码错误'}#防止用户暴力测试


# 用户重置密码接口
@user.route('/reset',methods=['GET'])
def reset():
    try:
        id = int(request.args.get('id'))
        usr = models.User.query.get(id)
        # 注意,这里是使用password,pwd是数据库用的加密过后的密码
        usr.password = '123'
        db.session.commit()
        return to_dict_msg(200, msg='重置密码成功!!')
    except Exception as e:
        return to_dict_msg(20000)