#coding=utf-8 from flask import Flask,request,Response,jsonify,session,url_for import os import config import new_system_api import interface_encrpty import json #是否使用老系统报表(是走两种方式,否的话只走新系统api) if_use_old_baobiao = config.if_use_old_baobiao #自定义的MyResponse(最终调用父类构造新的response) class MyResponse(Response): @classmethod def force_type(cls, rv, environ=None): print rv if isinstance(rv, dict): rv = jsonify(rv) return super(MyResponse, cls).force_type(rv, environ) app = Flask(__name__) app.response_class = MyResponse app.config['SECRET_KEY']=os.urandom(24) #设置为24位的字符,每次运行服务器都是不同的,所以服务器启动一次上次的session就清除。 # app.config['PERMANENT_SESSION_LIFETIME']=timedelta() #设置session的保存时间。 app.config['JSON_AS_ASCII'] = False #使得返回中文 class CustomFlaskErr(Exception): # 默认的返回码 status_code = 400 # 自己定义了一个 return_code,作为更细颗粒度的错误代码 def __init__(self, return_code=None, status_code=None, data=None,message=None): Exception.__init__(self) self.return_code = return_code if status_code is not None: self.status_code = status_code self.data = data self.message = message # 构造要返回的错误代码和错误信息的 dict def to_dict(self): rv = {} rv["data"] = self.data # 增加 dict key: return code rv['return_code'] = self.return_code # 增加 dict key: message, 具体内容由常量定义文件(config)中通过 return_code 转化而来 rv['message'] = self.message return rv #这个是拦截器(加解密的拦截器) @app.before_request def print_request_info(): data = request.args.get("data") data = data.replace(" ","+") if data is None: raise CustomFlaskErr(return_code=500, status_code=200, data="",message="data参数不存在") else: try: data = interface_encrpty.AES_128_CFB_decode(data) except Exception,e: raise CustomFlaskErr(return_code=501, status_code=200, data="", message="data数据解密失败") try: data = json.loads(data) except Exception,e: raise CustomFlaskErr(return_code=502, status_code=200, data="", message="data不是json字符串") session["data"] = data #当raise CustomFlaskErr的时候调用自定义 @app.errorhandler(CustomFlaskErr) def handle_flask_error(error): # response 的 json 内容为自定义错误代码和错误信息 response = jsonify(error.to_dict()) # response 返回 error 发生时定义的标准错误代码 response.status_code = error.status_code return response @app.route('/<path:url>',methods=['POST','GET']) def init(url): path = url_for("get_account_date_result") return generate_response(path+"|"+session["data"],"",200) def generate_response(data=None, message=None, code=None): return {'message': message,'code': code,'data': data} if __name__ == '__main__': app.run(host='0.0.0.0',port=8090)
总结:上述自定义了异常处理 前置拦截器对数据加解密 统一返回处理。