utils.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from functools import wraps
  4. from flask import make_response, g, request
  5. from flask.wrappers import Response
  6. from werkzeug.utils import import_string, cached_property
  7. import jwt
  8. from models.initialize import *
  9. __author__ = 'James Iter'
  10. __date__ = '16/06/08'
  11. __contact__ = 'james.iter.cn@gmail.com'
  12. __copyright__ = '(c) 2016 by James Iter.'
  13. class Utils(object):
  14. @staticmethod
  15. def dumps2response(func):
  16. """
  17. 视图装饰器
  18. http://dormousehole.readthedocs.org/en/latest/patterns/viewdecorators.html
  19. """
  20. @wraps(func)
  21. def _dumps2response(*args, **kwargs):
  22. ret = func(*args, **kwargs)
  23. if func.func_name != 'r_before_request' and ret is None:
  24. ret = dict()
  25. ret['state'] = ji.Common.exchange_state(20000)
  26. if isinstance(ret, dict) and 'state' in ret:
  27. response = make_response()
  28. response.data = json.dumps(ret, ensure_ascii=False)
  29. response.status_code = int(ret['state']['code'])
  30. if 'redirect' in ret and request.args.get('auto_redirect', 'True') == 'True':
  31. response.status_code = int(ret['redirect'].get('code', ret['state']['code']))
  32. response.headers['location'] = ret['redirect'].get('location', request.host_url)
  33. # 参考链接:
  34. # http://werkzeug.pocoo.org/docs/0.11/wrappers/#werkzeug.wrappers.BaseResponse.autocorrect_location_header
  35. # 变量操纵位置 werkzeug/wrappers.py
  36. response.autocorrect_location_header = False
  37. return response
  38. if isinstance(ret, Response):
  39. return ret
  40. return _dumps2response
  41. @staticmethod
  42. def superuser(func):
  43. @wraps(func)
  44. def _superuser(*args, **kwargs):
  45. if not g.superuser:
  46. ret = dict()
  47. ret['state'] = ji.Common.exchange_state(40301)
  48. return ret
  49. return func(*args, **kwargs)
  50. return _superuser
  51. @staticmethod
  52. def generate_token(uid):
  53. payload = {
  54. 'iat': ji.Common.ts(), # 创建于
  55. 'nbf': ji.Common.ts(), # 在此之前不可用
  56. 'exp': ji.Common.ts() + app.config['token_ttl'], # 过期时间
  57. 'uid': uid
  58. }
  59. return jwt.encode(payload=payload, key=app.config['jwt_secret'], algorithm=app.config['jwt_algorithm'])
  60. @staticmethod
  61. def verify_token(token):
  62. ret = dict()
  63. ret['state'] = ji.Common.exchange_state(20000)
  64. try:
  65. payload = jwt.decode(jwt=token, key=app.config['jwt_secret'], algorithms=app.config['jwt_algorithm'])
  66. return payload
  67. except jwt.InvalidTokenError, e:
  68. logger.error(e.message)
  69. ret['state'] = ji.Common.exchange_state(41208)
  70. raise ji.JITError(json.dumps(ret))
  71. class LazyView(object):
  72. """
  73. 惰性载入视图
  74. http://dormousehole.readthedocs.org/en/latest/patterns/lazyloading.html
  75. """
  76. def __init__(self, import_name):
  77. self.__module__, self.__name__ = import_name.rsplit('.', 1)
  78. self.import_name = import_name
  79. @cached_property
  80. def view(self):
  81. return import_string(self.import_name)
  82. def __call__(self, *args, **kwargs):
  83. return self.view(*args, **kwargs)
  84. def add_rule(blueprint, rule, view_func=None, **options):
  85. blueprint.add_url_rule(rule=rule, view_func=LazyView(''.join(['views.', view_func])), **options)