middleware.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. # coding=utf-8
  2. from flask import request, make_response, g
  3. from libs.tools import json_response
  4. from apps.account.models import User
  5. from public import app
  6. import time
  7. import flask_excel as excel
  8. def init_app(app):
  9. excel.init_excel(app)
  10. app.before_request(cross_domain_access_before)
  11. app.before_request(auth_middleware)
  12. app.after_request(cross_domain_access_after)
  13. app.register_error_handler(Exception, exception_handler)
  14. app.register_error_handler(404, page_not_found)
  15. def cross_domain_access_before():
  16. if request.method == 'OPTIONS':
  17. response = make_response()
  18. response.headers['Access-Control-Allow-Origin'] = '*'
  19. response.headers['Access-Control-Allow-Headers'] = 'X-TOKEN'
  20. response.headers['Access-Control-Max-Age'] = 24 * 60 * 60
  21. response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, DELETE'
  22. return response
  23. def cross_domain_access_after(response):
  24. response.headers['Access-Control-Allow-Origin'] = '*'
  25. response.headers['Access-Control-Allow-Headers'] = 'Content-Type, X-TOKEN'
  26. return response
  27. def page_not_found(_):
  28. return json_response(message='Resource not found'), 404
  29. def exception_handler(ex):
  30. app.logger.exception(ex)
  31. message = '%s' % ex
  32. if len(message) > 60:
  33. message = message[:60] + '...'
  34. return json_response(message=message)
  35. def auth_middleware():
  36. if request.path == '/account/users/login/' or request.path.startswith('/apis/configs/') \
  37. or request.path.startswith('/apis/files/'):
  38. return None
  39. token = request.headers.get('X-TOKEN')
  40. if token and len(token) == 32:
  41. g.user = User.query.filter_by(access_token=token).first()
  42. if g.user and g.user.is_active and g.user.token_expired >= time.time():
  43. g.user.token_expired = time.time() + 8 * 60 * 60
  44. g.user.save()
  45. return None
  46. return json_response(message='Auth fail, please login'), 401