我们在开发flask项目的时候,估计遇到最多的就是json格式数据,这是因为,前端向后端发起请求,我们后端返回给前端的数据类型需要是json格式,json格式的数据类型Python中的字典格式,只有先把数据转化为字典格式,才能进一步将数据转换为json格式,那么我们每次在查询数据库数据的时候,不想每次都在后端将查询出来的单个数据再转换成字典格式,因为那样比较繁琐,所以我们选择在数据库模型类中去执行这个操作,具体的实现如下:
数据库模型类
class User(BaseModel, db.Model):
"""用户"""
__tablename__ = "ih_user_profile"
id = db.Column(db.Integer, primary_key=True) # 用户编号
name = db.Column(db.String(32), unique=True, nullable=False) # 用户暱称
password_hash = db.Column(db.String(128), nullable=False) # 加密的密码
mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号
real_name = db.Column(db.String(32)) # 真实姓名
id_card = db.Column(db.String(20)) # 身份证号
avatar_url = db.Column(db.String(128)) # 用户头像路径
houses = db.relationship("House", backref="user") # 用户发布的房屋
orders = db.relationship("Order", backref="user") # 用户下的订单
@property
def password(self):
'''对应的password属性的读取操作'''
raise AttributeError("不支持读取操作")
@password.setter
def password(self, value):
'''对应的password 的属性的设置操作,value 为用户设置的密码值'''
self.password_hash = generate_password_hash(value)
def check_password(self, value):
'''检查用户密码,value为用户输入的密码值'''
return check_password_hash(self.password_hash, value)
def to_dict(self):
'''将对象转换为字典数据'''
user_dict = {
"user_id": self.id,
"name": self.name,
"mobile": self.mobile,
"avatar": constants.QINIU_URL_DOMAIN + self.avatar_url if self.avatar_url else "",
"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S")
}
return user_dict
def auth_to_dict(self):
'''将对象转换为字典数据'''
auth_dict = {
"user_id": self.id,
"real_name": self.real_name,
"id_card": self.id_card,
}
return auth_dict
后端处理逻辑
@api.route("/users/auth", methods=["GET"])
@login_required
def get_user_auth():
'''获取用户实名认证的信息'''
user_id = g.user_id
# 在数据库中查询信息
try:
user = User.query.get(user_id)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg="获取用户实名信息失败")
if user is None:
return jsonify(errno=RET.NODATA, errmsg="实名信息不存在")
return jsonify(errno=RET.OK, errmsg="OK", data=user.auth_to_dict())
前端处理逻辑
//查询用户实名认证信息
$.get("/api/v1_0/users/auth", function (resp) {
//4101代表用户未登录
if (resp.errno == 4101) {
location.href = "/login.html"
} else if (resp.errno == 0) {
//如果返回的数据中real_name与id_card不为null,表示用户已经填写过实名信息
if (resp.data.real_name && resp.data.id_card) {
$("#real-name").val(resp.data.real_name);
$("#id-card").val(resp.data.id_card);
//给input 添加disabled属性 禁止用户修改
$("#real-name").prop("disabled", true);
$("#id-card").prop("disabled", true);
//隐藏提交保存按钮
$("#form-auth>input[type=submit]").hide();
}
}
}, "json");