extensions.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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-14 23:20:15 (CST)
  10. # By:
  11. # Description:
  12. # **************************************************************************
  13. from flask.json import JSONEncoder
  14. from flask_wtf.csrf import CsrfProtect
  15. from flask_maple import Bootstrap, Error, Captcha
  16. from flask_login import LoginManager
  17. from flask_babel import Babel
  18. from flask_babel import lazy_gettext as _
  19. from flask_mail import Mail
  20. from flask_principal import Principal
  21. from redis import StrictRedis
  22. def register_form(app):
  23. csrf = CsrfProtect()
  24. csrf.init_app(app)
  25. def register_babel(app):
  26. babel = Babel()
  27. babel.init_app(app)
  28. class CustomJSONEncoder(JSONEncoder):
  29. """This class adds support for lazy translation texts to Flask's
  30. JSON encoder. This is necessary when flashing translated texts."""
  31. def default(self, obj):
  32. from speaklater import is_lazy_string
  33. if is_lazy_string(obj):
  34. try:
  35. return unicode(obj) # python 2
  36. except NameError:
  37. return str(obj) # python 3
  38. return super(CustomJSONEncoder, self).default(obj)
  39. app.json_encoder = CustomJSONEncoder
  40. def register_db(db, app):
  41. db.init_app(app)
  42. def register_maple(app):
  43. Bootstrap(app,use_auth=True)
  44. Captcha(app)
  45. Error(app)
  46. def register_principal(app):
  47. principal = Principal()
  48. principal.init_app(app)
  49. def register_mail(app):
  50. mail = Mail()
  51. mail.init_app(app)
  52. return mail
  53. def register_login(app):
  54. login_manager = LoginManager()
  55. login_manager.init_app(app)
  56. login_manager.login_view = "auth.login"
  57. login_manager.session_protection = "strong"
  58. login_manager.login_message = _("Please login to access this page.")
  59. # login_manager.anonymous_user = Anonymous
  60. from maple.user.models import User
  61. # @login_manager.token_loader
  62. # def load_token(token):
  63. # max_age = app.config["REMEMBER_COOKIE_DURATION"].total_seconds()
  64. # data = login_serializer.loads(token, max_age=max_age)
  65. # user = User.load_by_name(data[0])
  66. # if user and data[1] == user.password:
  67. # return user
  68. # return None
  69. @login_manager.user_loader
  70. def user_loader(id):
  71. user = User.query.get(int(id))
  72. return user
  73. return login_manager
  74. def register_redis(app):
  75. redis_data = StrictRedis(db=app.config['CACHE_REDIS_DB'],
  76. password=app.config['CACHE_REDIS_PASSWORD'])
  77. return redis_data
  78. def register_jinja2(app):
  79. from maple import redis_data
  80. from maple.settings import setting
  81. from maple.topic.models import Reply, Topic
  82. from maple.user.models import User
  83. from maple.main.records import load_online_users
  84. def get_last_reply(uid):
  85. reply = Reply.query.join(Reply.topic).filter(Topic.id == uid).first()
  86. return reply
  87. def get_user_infor(name):
  88. user = User.query.filter(User.username == name).first()
  89. return user
  90. def get_read_count(id):
  91. read = redis_data.hget('topic:%s' % str(id), 'read')
  92. replies = redis_data.hget('topic:%s' % str(id), 'replies')
  93. if not read:
  94. read = 0
  95. else:
  96. read = int(read)
  97. if not replies:
  98. replies = 0
  99. else:
  100. replies = int(replies)
  101. return replies, read
  102. class Title(object):
  103. title = setting['title']
  104. picture = setting['picture']
  105. description = setting['description']
  106. app.jinja_env.globals['Title'] = Title
  107. app.jinja_env.filters['get_last_reply'] = get_last_reply
  108. app.jinja_env.filters['get_user_infor'] = get_user_infor
  109. app.jinja_env.filters['get_read_count'] = get_read_count
  110. app.jinja_env.filters['get_online_users'] = load_online_users