extension.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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:星期日 2018-01-07 22:18:41 (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. js=('styles/upload.js', 'styles/forums.js', 'styles/following.js',
  76. 'styles/topic.js'),
  77. use_auth=True)
  78. captcha = Captcha()
  79. error = Error()
  80. redis_data = Redis()
  81. cache = Cache()
  82. mail = Mail()
  83. principal = Principal()
  84. login_manager = register_login()
  85. maple_app = App(json=CustomJSONEncoder)
  86. middleware = Middleware()
  87. search = Search(db=db)
  88. class AvatarCache(Avatar):
  89. @cache.cached(
  90. timeout=180, key_prefix=lambda: "avatar:{}".format(request.url))
  91. def avatar(self, text, width=128):
  92. from flask import abort, make_response
  93. from flask_avatar.avatar import GenAvatar
  94. width_range = current_app.config.get('AVATAR_RANGE', [0, 512])
  95. if width < width_range[0] or width > width_range[1]:
  96. abort(404)
  97. stream = GenAvatar.generate(width, text)
  98. buf_value = stream.getvalue()
  99. response = make_response(buf_value)
  100. response.headers['Content-Type'] = 'image/jpeg'
  101. return response
  102. avatar = AvatarCache()
  103. def init_app(app):
  104. for e in [db, avatar, cache, csrf, bootstrap, captcha, error, redis_data,
  105. principal, babel, login_manager, maple_app, mail, middleware,
  106. search]:
  107. e.init_app(app)