extensions.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #!/usr/bin/env python
  2. # -*- coding=UTF-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: extensions.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-05-20 13:02:50 (CST)
  9. # Last Update:星期五 2016-7-29 14:12:55 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import request, g
  14. from flask.json import JSONEncoder
  15. from flask_wtf.csrf import CsrfProtect
  16. from flask_maple import Bootstrap, Error, Captcha
  17. from flask_login import LoginManager
  18. from flask_babelex import Babel
  19. from flask_babelex import lazy_gettext as _
  20. from flask_mail import Mail
  21. from flask_principal import Principal
  22. from flask_avatar import Avatar
  23. from flask_cache import Cache
  24. from flask_maple.rbac import Rbac
  25. from redis import StrictRedis
  26. def register_avatar(app):
  27. Avatar(app)
  28. def register_form(app):
  29. csrf = CsrfProtect()
  30. csrf.init_app(app)
  31. def register_rbac(app):
  32. from maple.user.models import Role
  33. from maple.permission.models import Route, Permiss
  34. from flask_login import current_user
  35. rbac = Rbac(app,
  36. role_model=Role,
  37. route_model=Route,
  38. permission_model=Permiss,
  39. user_loader=current_user,
  40. skip_startswith_rules=['/admin', '/static'],
  41. skip_rules=['topic.topic', 'static_from_root', 'avatar',
  42. 'upload.avatar_file'])
  43. return rbac
  44. def register_babel(app):
  45. babel = Babel()
  46. babel.init_app(app)
  47. class CustomJSONEncoder(JSONEncoder):
  48. """This class adds support for lazy translation texts to Flask's
  49. JSON encoder. This is necessary when flashing translated texts."""
  50. def default(self, obj):
  51. from speaklater import is_lazy_string
  52. if is_lazy_string(obj):
  53. try:
  54. return unicode(obj) # python 2
  55. except NameError:
  56. return str(obj) # python 3
  57. return super(CustomJSONEncoder, self).default(obj)
  58. app.json_encoder = CustomJSONEncoder
  59. @babel.localeselector
  60. def get_locale():
  61. user = getattr(g, 'user', None)
  62. if user is not None:
  63. if g.user.is_authenticated:
  64. return user.setting.locale or 'zh'
  65. return request.accept_languages.best_match(app.config[
  66. 'LANGUAGES'].keys())
  67. @babel.timezoneselector
  68. def get_timezone():
  69. user = getattr(g, 'user', None)
  70. if user is not None:
  71. if g.user.is_authenticated:
  72. return user.setting.timezone or 'UTC'
  73. return 'UTC'
  74. def register_maple(app):
  75. Bootstrap(app,
  76. css=('styles/monokai.css', 'styles/mine.css',
  77. 'tags/css/bootstrap-tokenfield.css',
  78. 'select2/css/select2.min.css'),
  79. js=('styles/upload.js', 'styles/forums.js', 'styles/mine.js',
  80. 'styles/topic.js', 'tags/bootstrap-tokenfield.min.js',
  81. 'select2/js/select2.min.js'),
  82. use_auth=True)
  83. Captcha(app)
  84. Error(app)
  85. def register_redis(app):
  86. redis_data = StrictRedis(db=app.config['CACHE_REDIS_DB'],
  87. password=app.config['CACHE_REDIS_PASSWORD'],
  88. decode_responses=True)
  89. return redis_data
  90. def register_cache(app):
  91. cache = Cache()
  92. cache.init_app(app)
  93. return cache
  94. def register_mail(app):
  95. mail = Mail()
  96. mail.init_app(app)
  97. return mail
  98. def register_login(app):
  99. login_manager = LoginManager()
  100. login_manager.init_app(app)
  101. login_manager.login_view = "auth.login"
  102. login_manager.session_protection = "strong"
  103. login_manager.login_message = _("Please login to access this page.")
  104. # login_manager.anonymous_user = Anonymous
  105. from maple.user.models import User
  106. # @login_manager.token_loader
  107. # def load_token(token):
  108. # max_age = app.config["REMEMBER_COOKIE_DURATION"].total_seconds()
  109. # data = login_serializer.loads(token, max_age=max_age)
  110. # user = User.load_by_name(data[0])
  111. # if user and data[1] == user.password:
  112. # return user
  113. # return None
  114. @login_manager.user_loader
  115. def user_loader(id):
  116. user = User.query.get(int(id))
  117. return user
  118. return login_manager
  119. def register_principal(app):
  120. principal = Principal()
  121. principal.init_app(app)
  122. def register_jinja2(app):
  123. from maple.main.records import load_online_users
  124. from .filters import Filters, safe_clean
  125. app.jinja_env.globals['Title'] = Filters.Title
  126. app.jinja_env.globals['hot_tags'] = Filters.hot_tags
  127. app.jinja_env.globals['recent_tags'] = Filters.recent_tags
  128. app.jinja_env.globals['notice_count'] = Filters.notice_count
  129. app.jinja_env.globals['show_time'] = Filters.show_time
  130. app.jinja_env.filters['get_last_reply'] = Filters.get_last_reply
  131. app.jinja_env.filters['get_user_infor'] = Filters.get_user_infor
  132. app.jinja_env.filters['get_read_count'] = Filters.get_read_count
  133. app.jinja_env.filters['timesince'] = Filters.timesince
  134. app.jinja_env.filters['get_online_users'] = load_online_users
  135. app.jinja_env.filters['markdown'] = Filters.safe_markdown
  136. app.jinja_env.filters['safe_clean'] = safe_clean
  137. app.jinja_env.filters['is_collected'] = Filters.is_collected