extension.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # **************************************************************************
  4. # Copyright © 2016 jianglin
  5. # File Name: extension.py
  6. # Author: jianglin
  7. # Email: xiyang0807@gmail.com
  8. # Created: 2016-10-25 21:57:10 (CST)
  9. # Last Update:星期五 2017-11-10 11:03:06 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import request, g, current_app
  14. from flask_wtf.csrf import CSRFProtect
  15. from flask_babelex import Babel, Domain
  16. from flask_babelex import lazy_gettext as _
  17. from flask_avatar import Avatar
  18. from flask_maple.middleware import Middleware
  19. from flask_maple.models import db
  20. from flask_maple.app import App
  21. from flask_maple.json import CustomJSONEncoder
  22. from flask_maple.bootstrap import Bootstrap
  23. from flask_maple.error import Error
  24. from flask_maple.captcha import Captcha
  25. from flask_maple.redis import Redis
  26. from flask_maple.mail import Mail
  27. from flask_principal import Principal
  28. from flask_login import LoginManager
  29. from flask_msearch import Search
  30. from flask_caching import Cache
  31. import os
  32. def register_babel():
  33. base_path = os.path.abspath(os.path.dirname(__file__))
  34. translations = os.path.join(base_path, os.pardir, 'translations')
  35. domain = Domain(translations)
  36. babel = Babel(default_domain=domain)
  37. @babel.localeselector
  38. def get_locale():
  39. user = getattr(g, 'user', None)
  40. if user is not None:
  41. if request.path.startswith('/admin'):
  42. return 'zh_Hans_CN'
  43. if g.user.is_authenticated:
  44. return user.setting.locale or 'zh'
  45. return request.accept_languages.best_match(current_app.config[
  46. 'LANGUAGES'].keys())
  47. @babel.timezoneselector
  48. def get_timezone():
  49. user = getattr(g, 'user', None)
  50. if user is not None:
  51. if g.user.is_authenticated:
  52. return user.setting.timezone or 'UTC'
  53. return 'UTC'
  54. return babel
  55. def register_login():
  56. login_manager = LoginManager()
  57. login_manager.login_view = "auth.login"
  58. login_manager.session_protection = "strong"
  59. login_manager.login_message = _("Please login to access this page.")
  60. # login_manager.anonymous_user = Anonymous
  61. @login_manager.user_loader
  62. def user_loader(id):
  63. from forums.api.user.models import User
  64. user = User.query.get(int(id))
  65. return user
  66. # @login_manager.token_loader
  67. # def load_token(token):
  68. # return None
  69. return login_manager
  70. babel = register_babel()
  71. db = db
  72. csrf = CSRFProtect()
  73. bootstrap = Bootstrap(
  74. css=('styles/monokai.css', 'styles/mine.css',
  75. 'tags/css/bootstrap-tokenfield.css', 'select2/css/select2.min.css'),
  76. js=('styles/upload.js', 'styles/forums.js', 'styles/following.js',
  77. 'styles/topic.js', 'tags/bootstrap-tokenfield.min.js',
  78. 'select2/js/select2.min.js'),
  79. use_auth=True)
  80. captcha = Captcha()
  81. error = Error()
  82. redis_data = Redis()
  83. cache = Cache()
  84. mail = Mail()
  85. principal = Principal()
  86. login_manager = register_login()
  87. maple_app = App(json=CustomJSONEncoder)
  88. middleware = Middleware()
  89. search = Search(db=db)
  90. class AvatarCache(Avatar):
  91. @cache.cached(
  92. timeout=180, key_prefix=lambda: "avatar:{}".format(request.url))
  93. def avatar(self, text, width=128):
  94. from flask import abort, make_response
  95. from flask_avatar.avatar import GenAvatar
  96. width_range = current_app.config.get('AVATAR_RANGE', [0, 512])
  97. if width < width_range[0] or width > width_range[1]:
  98. abort(404)
  99. stream = GenAvatar.generate(width, text)
  100. buf_value = stream.getvalue()
  101. response = make_response(buf_value)
  102. response.headers['Content-Type'] = 'image/jpeg'
  103. return response
  104. avatar = AvatarCache()
  105. def init_app(app):
  106. for e in [db, avatar, cache, csrf, bootstrap, captcha, error, redis_data,
  107. principal, babel, login_manager, maple_app, mail, middleware,
  108. search]:
  109. e.init_app(app)