views.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2017 jianglin
  5. # File Name: views.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2017-03-13 13:29:37 (CST)
  9. # Last Update: Wednesday 2019-05-08 14:24:25 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import (request, flash, redirect, url_for, render_template,
  14. current_app)
  15. from flask_login import login_required, current_user
  16. from flask_maple.views import MethodView as _MethodView
  17. from forums.permission import confirm_permission
  18. from forums.extension import cache
  19. def cache_key():
  20. if current_user.is_authenticated:
  21. return 'view:{}:{}'.format(current_user.id, request.url)
  22. return 'view:{}'.format(request.url)
  23. def is_confirmed(func):
  24. def _is_confirmed(*args, **kwargs):
  25. if confirm_permission.can():
  26. ret = func(*args, **kwargs)
  27. return ret
  28. flash('请验证你的帐号', 'warning')
  29. return redirect(url_for('user.user', username=current_user.username))
  30. return _is_confirmed
  31. class MethodView(_MethodView):
  32. @property
  33. def pageinfo(self):
  34. page = request.args.get('page', 1, type=int)
  35. if hasattr(self, 'per_page'):
  36. per_page = getattr(self, 'per_page')
  37. else:
  38. per_page = current_app.config.setdefault('PER_PAGE', 20)
  39. number = request.args.get('number', per_page, type=int)
  40. if number < -1:
  41. number = per_page
  42. if number > 100 or number == -1:
  43. number = 100
  44. return page, number
  45. def dispatch_request(self, *args, **kwargs):
  46. method = request.method
  47. meth = getattr(self, method.lower(), None)
  48. if meth is None and method == 'HEAD':
  49. meth = getattr(self, 'get', None)
  50. assert meth is not None, 'Unimplemented method %r' % request.method
  51. return meth(*args, **kwargs)
  52. def render_template(self, template, **kwargs):
  53. return render_template(template, **kwargs)
  54. class BaseMethodView(_MethodView):
  55. @cache.cached(timeout=180, key_prefix=cache_key)
  56. def dispatch_request(self, *args, **kwargs):
  57. return super(BaseMethodView, self).dispatch_request(*args, **kwargs)
  58. def render_template(self, template, **kwargs):
  59. return render_template(template, **kwargs)
  60. def render(self, template, **kwargs):
  61. return render_template(template, **kwargs)
  62. class IsAuthMethodView(BaseMethodView):
  63. decorators = [login_required]
  64. class IsConfirmedMethodView(BaseMethodView):
  65. decorators = [is_confirmed, login_required]