extensions.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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-6-17 13:36:25 (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_babel import Babel
  19. from flask_babel import lazy_gettext as _
  20. from flask_mail import Mail
  21. from flask_principal import Principal
  22. from redis import StrictRedis
  23. def register_form(app):
  24. csrf = CsrfProtect()
  25. csrf.init_app(app)
  26. def register_babel(app):
  27. babel = Babel()
  28. babel.init_app(app)
  29. class CustomJSONEncoder(JSONEncoder):
  30. """This class adds support for lazy translation texts to Flask's
  31. JSON encoder. This is necessary when flashing translated texts."""
  32. def default(self, obj):
  33. from speaklater import is_lazy_string
  34. if is_lazy_string(obj):
  35. try:
  36. return unicode(obj) # python 2
  37. except NameError:
  38. return str(obj) # python 3
  39. return super(CustomJSONEncoder, self).default(obj)
  40. app.json_encoder = CustomJSONEncoder
  41. @babel.localeselector
  42. def get_locale():
  43. user = getattr(g, 'user', None)
  44. if user is not None:
  45. if g.user.is_authenticated:
  46. return user.setting.locale or 'zh'
  47. return request.accept_languages.best_match(app.config[
  48. 'LANGUAGES'].keys())
  49. @babel.timezoneselector
  50. def get_timezone():
  51. user = getattr(g, 'user', None)
  52. if user is not None:
  53. if g.user.is_authenticated:
  54. return user.setting.timezone or 'UTC'
  55. return 'UTC'
  56. def register_maple(app):
  57. Bootstrap(app,
  58. css=('styles/monokai.css', 'styles/mine.css'),
  59. use_auth=True)
  60. Captcha(app)
  61. Error(app)
  62. def register_principal(app):
  63. principal = Principal()
  64. principal.init_app(app)
  65. def register_mail(app):
  66. mail = Mail()
  67. mail.init_app(app)
  68. return mail
  69. def register_login(app):
  70. login_manager = LoginManager()
  71. login_manager.init_app(app)
  72. login_manager.login_view = "auth.login"
  73. login_manager.session_protection = "strong"
  74. login_manager.login_message = _("Please login to access this page.")
  75. # login_manager.anonymous_user = Anonymous
  76. from maple.user.models import User
  77. # @login_manager.token_loader
  78. # def load_token(token):
  79. # max_age = app.config["REMEMBER_COOKIE_DURATION"].total_seconds()
  80. # data = login_serializer.loads(token, max_age=max_age)
  81. # user = User.load_by_name(data[0])
  82. # if user and data[1] == user.password:
  83. # return user
  84. # return None
  85. @login_manager.user_loader
  86. def user_loader(id):
  87. user = User.query.get(int(id))
  88. return user
  89. return login_manager
  90. def register_redis(app):
  91. redis_data = StrictRedis(db=app.config['CACHE_REDIS_DB'],
  92. password=app.config['CACHE_REDIS_PASSWORD'])
  93. return redis_data
  94. def register_jinja2(app):
  95. from maple.main.records import load_online_users
  96. from .filters import Filters
  97. app.jinja_env.globals['Title'] = Filters.Title
  98. app.jinja_env.filters['get_last_reply'] = Filters.get_last_reply
  99. app.jinja_env.filters['get_user_infor'] = Filters.get_user_infor
  100. app.jinja_env.filters['get_read_count'] = Filters.get_read_count
  101. app.jinja_env.filters['timesince'] = Filters.timesince
  102. app.jinja_env.filters['get_online_users'] = load_online_users
  103. app.jinja_env.filters['markdown'] = Filters.safe_markdown