32、Flask实战第32天:优化json数据的返回
接着上节,我们通过jsonify返回json数据非常方便
... return jsonify({"code": 400, "message": message})
返回什么数据则是公司接口编写的规范
返回值的规范(就算值为空,我们也必须返回以下字段)
{ "code": 200, #状态码 "message": "", #信息提示 "data": {}, #返回的数据,比如文章列表等等 }
状态码的规范
200:成功 401:没有授权 400:参数错误 405:方法错误 500:服务器错误
前面,我们每一次返回json数据需要写一串"jsonify({"code": 400, "message": message})"这样很麻烦,项目后期可能还有很多地方需要返回json。因此我们可以把它抽取出来进行封装成一个工具
1、先在项目下面建一个python package命名为utils(工具包,以后项目的工具都写在这里面)
2、在utils.py下新建xjson.py
from flask import jsonify class StatusCode(object): ok = 200 paramserror = 400 unauth = 401 methoderror = 405 servererror = 500 def json_result(code, message, data): return jsonify({"code": code, "message":message, "data":data or {}})
这样,我们就可以在视图返回json的时候这样用:
from utils import xjson ... return xjson.json_result(code=200, message='', data={})
但是这样依然不够方便,我们还是需要加上3个参数。因此我们继续改造xjson.py
from flask import jsonify class StatusCode(object): ok = 200 paramserror = 400 unauth = 401 methoderror = 405 servererror = 500 def json_result(code, message, data): return jsonify({"code": code, "message":message, "data":data or {}}) def json_success(message='', data=None): return json_result(code=StatusCode.ok, message=message, data=data) def json_params_error(message='', data=None): """ 请求参数错误 """ return json_result(code=StatusCode.paramserror, message=message, data=data) def json_unauth_error(message='', data=None): """ 没有权限访问 """ return json_result(code=StatusCode.unauth, message=message, data=data) def json_method_error(message='', data=None): """ 请求方法错误 """ return json_result(code=StatusCode.methoderror, message=message, data=data) def json_server_error(message='', data=None): """ 服务器内部错误 """ return json_result(code=StatusCode.servererror, message=message, data=data)
这样,我们只要根据不同的情况使用定义好的函数就行了。
参数: code(已经不用自己传了),message(成功的状态下可以不传,默认为空),data(没有传此参数,也会自动为空字典))
把上节内容的代码,可以写成如下:
... from utils import xjson from class ResetPwdView(views.MethodView): decorators = [login_required] def get(self): return render_template('cms/cms_resetpwd.html') def post(self): resetpwd_form = ResetPwdForm(request.form) if resetpwd_form.validate(): oldpwd = resetpwd_form.oldpwd.data newpwd = resetpwd_form.newpwd.data user = g.cms_user if user.check_password(oldpwd): user.password = newpwd db.session.commit() return xjson.json_success('修改成功') else: return xjson.json_params_error('原密码错误') else: message = resetpwd_form.get_error() return xjson.json_params_error(message)
每天进步一点,加油!