extension.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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:星期四 2016-12-29 20:56:11 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask import request, g, current_app
  14. from flask_wtf.csrf import CsrfProtect
  15. from flask_sqlalchemy import SQLAlchemy
  16. from flask_admin import Admin
  17. from flask_babelex import Babel, Domain
  18. from flask_babelex import lazy_gettext as _
  19. from flask_avatar import Avatar
  20. from flask_maple.middleware import Middleware
  21. from flask_maple.models import db
  22. from flask_maple.app import App
  23. from flask_maple.json import CustomJSONEncoder
  24. from flask_maple.bootstrap import Bootstrap
  25. from flask_maple.error import Error
  26. from flask_maple.captcha import Captcha
  27. from flask_maple.redis import Redis
  28. from flask_mail import Mail
  29. from flask_cache import Cache
  30. from flask_principal import Principal
  31. from flask_login import LoginManager
  32. import os
  33. def register_babel():
  34. translations = os.path.abspath(
  35. os.path.join(os.path.dirname(__file__), os.pardir, 'translations'))
  36. domain = Domain(translations)
  37. babel = Babel(default_domain=domain)
  38. @babel.localeselector
  39. def get_locale():
  40. # user = getattr(g, 'user', None)
  41. # if user is not None:
  42. # if request.path.startswith('/admin'):
  43. # return 'zh_Hans_CN'
  44. # if g.user.is_authenticated:
  45. # return user.setting.locale or 'zh'
  46. return request.accept_languages.best_match(current_app.config[
  47. 'LANGUAGES'].keys())
  48. @babel.timezoneselector
  49. def get_timezone():
  50. user = getattr(g, 'user', None)
  51. if user is not None:
  52. if g.user.is_authenticated:
  53. return user.setting.timezone or 'UTC'
  54. return 'UTC'
  55. return babel
  56. def register_login():
  57. login_manager = LoginManager()
  58. login_manager.login_view = "auth.login"
  59. login_manager.session_protection = "strong"
  60. login_manager.login_message = _("Please login to access this page.")
  61. # login_manager.anonymous_user = Anonymous
  62. from api.user.models import User
  63. # @login_manager.token_loader
  64. # def load_token(token):
  65. # max_age = app.config["REMEMBER_COOKIE_DURATION"].total_seconds()
  66. # data = login_serializer.loads(token, max_age=max_age)
  67. # user = User.load_by_name(data[0])
  68. # if user and data[1] == user.password:
  69. # return user
  70. # return None
  71. @login_manager.user_loader
  72. def user_loader(id):
  73. user = User.query.get(int(id))
  74. return user
  75. return login_manager
  76. babel = register_babel()
  77. db = db
  78. admin = Admin(name='HonMaple', template_mode='bootstrap3')
  79. avatar = Avatar()
  80. csrf = CsrfProtect()
  81. bootstrap = Bootstrap(
  82. css=('styles/monokai.css', 'styles/mine.css',
  83. 'tags/css/bootstrap-tokenfield.css', 'select2/css/select2.min.css'),
  84. js=('styles/upload.js', 'styles/forums.js', 'styles/mine.js',
  85. 'styles/topic.js', 'tags/bootstrap-tokenfield.min.js',
  86. 'select2/js/select2.min.js'),
  87. use_auth=True)
  88. captcha = Captcha()
  89. error = Error()
  90. redis_data = Redis()
  91. cache = Cache()
  92. mail = Mail()
  93. principal = Principal()
  94. login_manager = register_login()
  95. maple_app = App(json=CustomJSONEncoder)
  96. middleware = Middleware()