__init__.py 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from flask import Flask, render_template, Response
  2. from flask.logging import default_handler
  3. import logging
  4. import logging.handlers
  5. import os
  6. import sys
  7. from datetime import datetime
  8. from .db import db, Role, User
  9. from .moment import moment
  10. from .mail import mail
  11. from .migrate import migrate
  12. from .login import login
  13. from .logger import Logger
  14. from configure import conf
  15. if conf["DEBUG_PROFILE"]:
  16. from werkzeug.middleware.profiler import ProfilerMiddleware
  17. class HTalkFlask(Flask):
  18. def __init__(self, name):
  19. super(HTalkFlask, self).__init__(name)
  20. self.update_configure()
  21. self.profile_setting()
  22. self.logging_setting()
  23. self.blueprint()
  24. db.init_app(self)
  25. moment.init_app(self)
  26. mail.init_app(self)
  27. migrate.init_app(self, db)
  28. login.init_app(self)
  29. @self.context_processor
  30. def inject_base():
  31. """ app默认模板变量 """
  32. return {"conf": conf,
  33. "Role": Role,
  34. "User": User,
  35. "datetime": datetime}
  36. self.error_page([400, 401, 403, 404, 405, 408, 410, 413, 414, 423, 500, 501, 502])
  37. def blueprint(self):
  38. from .index import index
  39. self.register_blueprint(index, url_prefix="/")
  40. from .auth import auth
  41. self.register_blueprint(auth, url_prefix="/auth")
  42. from .comment import comment
  43. self.register_blueprint(comment, url_prefix="/cm")
  44. from .archive import archive
  45. self.register_blueprint(archive, url_prefix="/ac")
  46. def profile_setting(self):
  47. if conf["DEBUG_PROFILE"]:
  48. self.wsgi_app = ProfilerMiddleware(self.wsgi_app, sort_by=("cumtime",))
  49. def logging_setting(self):
  50. self.logger.removeHandler(default_handler)
  51. self.logger.setLevel(conf["LOG_LEVEL"])
  52. self.logger.propagate = False # 不传递给更高级别的处理器处理日志
  53. if len(conf["LOG_HOME"]) > 0:
  54. handle = logging.handlers.TimedRotatingFileHandler(
  55. os.path.join(conf["LOG_HOME"], f"flask.log"), backupCount=10)
  56. handle.setFormatter(logging.Formatter(conf["LOG_FORMAT"]))
  57. self.logger.addHandler(handle)
  58. if conf["LOG_STDERR"]:
  59. handle = logging.StreamHandler(sys.stderr)
  60. handle.setFormatter(logging.Formatter(conf["LOG_FORMAT"]))
  61. self.logger.addHandler(handle)
  62. def update_configure(self):
  63. """ 更新配置 """
  64. self.config.update(conf)
  65. def error_page(self, error_code):
  66. for i in error_code:
  67. def create_error_handle(status): # 创建一个 status 变量给 error_handle
  68. def error_handle(e):
  69. Logger.print_load_page_log(status)
  70. data = render_template('error.html', error_code=status, error_info=e)
  71. return Response(response=data, status=status)
  72. return error_handle
  73. self.errorhandler(i)(create_error_handle(i))