Flask项目的一些封装

geteshi
2024-05-11 / 0 评论 / 27 阅读 / 正在检测是否收录...
  1. 封装传入的参数
    main.py文件

    from base.views import asapi
    from flask import Flask, request, jsonify
    from flask_cors import CORS
    from base.views import ApiException as ex
    
    
    app = Flask(__name__)
    # CORS(app, resources={r"/*": {"origins": ["http://localhost:63343"]}})
    CORS(app, resources={r"/*": {"origins": "*"}})
    
    
    def checker1(param):
     # print("checker", param)
     return True
    
    
    @app.route("/test", methods=['get', 'post'])
    @asapi(checker=checker1)
    def test(param):
     return param
    
    
    if __name__ == '__main__':
     # en = Encipher()
     # res = en.getDatas({"1": "123"})
     # print(res)
     # print(en.encode_data(res))
     app.run(
         host="0.0.0.0",
         port=6003,
         debug=False
     )
  2. main.py文件下,新建一个base目录,创建文件views.py,写入下面内容

    from flask import request, jsonify
    from lxml.html.clean import clean_html
    import inspect
    
    
    class SiteException(Exception):
     def __init__(self, message=None, code=None):
         self.message = message
         self.code = code
    
     def to_json(self):
         pass
    
     def __str__(self):
         # return jsonify({"code": self.code, "msg": self.message})
         return self.message
    
    
    class ApiException(SiteException):
     def __init__(self, message, code=1001):
         self.message = message
         self.code = code
    
     def to_json(self):
         return {"code": self.code, "msg": self.message}
         # return self.message
    
    
    def raiseApiEx(e, c=1001):
     raise ApiException(e, c)
    
    
    def asapi(a=None, checker=None):
     def param_handler(func):
         def wrapper(*args, **kwargs):
             def __func(**kvargs):
                 try:
                     req = kvargs.get("param")
                     if checker and not checker(req):
                         raiseApiEx('检查不通过')
                     params = req
                     datas = {}
                     for k, v in list(params.items()):
                         if v == 'undefined':
                             # 排除JS值空
                             params[k] = ''
                     for k in list(params.keys()):
                         v = params[k]
                         if isinstance(v, str) and '<' in v and '>' in v:
                             lv = v.lower()
                             if 'script' in lv or 'cookie' in lv:
                                 params[k] = clean_html(v)
                     # arginfos = getattr(func, 'arginfos')
                     arginfos = inspect.signature(func).parameters
    
                     for param_name, param_info in arginfos.items():
                         if param_name != "param" and param_name not in params:
                             params[param_name] = param_info.default
                         if param_name == "param":
                             datas['param'] = params
                         elif param_info.default == inspect.Parameter.empty and param_name not in params:
                             raise raiseApiEx(f"{func.__name__}缺少参数:{param_name}")
                         else:
                             datas[param_name] = params.get(param_name, param_info.default)
    
                     res = func(**datas)
                     return apiReaspone(en.getDatas(res))
                 except ApiException as e:
                     return jsonify(e.to_json())
    
             param = dict(request.values.items())
             setattr(__func, 'checker', checker)
             kwargs.setdefault("param", param)
    
             # 在这里可以对参数进行处理,比如验证、转换等操作
    
             # 将参数传递给路由处理函数
             return __func(**kwargs)
    
         return wrapper
     return param_handler
    
    
    def apiReaspone(data):
     return jsonify({"code": 200, "data": data})
0

评论 (0)

取消