Files
super-bbs/super_bbs/core/viewhandler.py
2020-01-04 10:35:03 +08:00

86 lines
2.5 KiB
Python

import traceback
from flask import views, request, jsonify, make_response, current_app, abort
from .basehandler import BaseHandler, AuthError, LogicError, ParamsError, Dict, VerifyError, BaseError
class BaseViewHandler(views.MethodView, BaseHandler):
@property
def input(self):
d = Dict(request.values.items())
if request.is_json:
d.update(request.json)
return d
class ApiViewHandler(BaseViewHandler):
def dispatch_request(self, *args, **kwargs):
self.set_header = {}
self.set_cookie = {}
self.delete_cookie = []
self.http_origin = request.environ.get('HTTP_ORIGIN', '')
handler = getattr(self, request.method.lower(), None)
if not callable(handler):
if request.method == 'HEAD':
return make_response('', 200)
else:
abort(405)
return self.api_wrapper(handler, *args, **kwargs)
def api_wrapper(self, handler, *args, **kwargs):
code = 1000
data = msg = None
start_time = self.get_timestamp()
try:
data = handler(*args, **kwargs)
except AuthError as e:
code = e.code
msg = str(e)
except LogicError as e:
code = e.code
msg = str(e)
err = traceback.format_exc()
current_app.logger.error(err)
except ParamsError as e:
code = e.code
msg = str(e)
except VerifyError as e:
code = e.code
msg = str(e)
except BaseError as e:
code = e.code
msg = str(e)
err = traceback.format_exc()
current_app.logger.error(err)
except Exception:
code = 5000
msg = '系统内部错误'
err = traceback.format_exc()
current_app.logger.error(err)
cost_time = self.get_timestamp() - start_time
res = {'code': code, 'data': data, 'cost': "{0}ms".format(round(cost_time * 1000, 2))}
if msg:
res.update({'msg': msg})
response = make_response(jsonify(res))
if self.set_header:
for k, v in self.set_header.items():
response.headers[k] = v
if self.set_cookie:
for k, v in self.set_cookie.items():
response.set_cookie(k, v)
if self.delete_cookie:
for k in self.delete_cookie:
response.delete_cookie(k)
return response