__init__.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import logging
  2. from logging.handlers import RotatingFileHandler
  3. from redis import StrictRedis
  4. from flask import Flask, g, render_template
  5. from flask_sqlalchemy import SQLAlchemy
  6. from flask_session import Session
  7. from flask_wtf.csrf import CSRFProtect, generate_csrf
  8. from app.utils.common import do_index_class, user_login_data
  9. from config import config_dict
  10. db = SQLAlchemy()
  11. redis_store = None # type:StrictRedis
  12. def setup_log(config_name):
  13. """配置日志"""
  14. # 设置日志的记录等级
  15. logging.basicConfig(level=config_dict[config_name].LOG_LEVEL) # 调试debug级
  16. # 创建日志记录器,指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
  17. file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)
  18. # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
  19. formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')
  20. # 为刚创建的日志记录器设置日志记录格式
  21. file_log_handler.setFormatter(formatter)
  22. # 为全局的日志工具对象(flask app使用的)添加日志记录器
  23. logging.getLogger().addHandler(file_log_handler)
  24. def create_app(config_name):
  25. """通过传入不同的配置名字,初始化其对应配置的应用实例"""
  26. app = Flask(__name__)
  27. setup_log(config_name)
  28. # 设置app应用的config配置
  29. app.config.from_object(config_dict[config_name])
  30. # 构建数据库对象
  31. db.init_app(app)
  32. # 构建redis数据库对象
  33. global redis_store
  34. redis_store = StrictRedis(host=config_dict[config_name].REDIS_HOST,
  35. port=config_dict[config_name].REDIS_PORT,
  36. decode_responses=True)
  37. # 开启csrf保护
  38. CSRFProtect(app)
  39. # 每个post请求带上csrf_token参数
  40. @app.after_request
  41. def after_request(response):
  42. # 调用函数生成csrf_token
  43. csrf_token = generate_csrf()
  44. # 通过cookie将值传给前端
  45. response.set_cookie("csrf_token", csrf_token)
  46. return response
  47. @app.errorhandler(404)
  48. @user_login_data
  49. def page_not_found(_):
  50. user = g.user
  51. data = {"user_info": user.to_dict() if user else None}
  52. return render_template("news/404.html", data=data)
  53. # 设置session保存位置
  54. Session(app)
  55. # 添加自定义过滤器
  56. app.add_template_filter(do_index_class, "index_class")
  57. # 首页蓝图注册
  58. register_index(app)
  59. # 登录注册模块的蓝图注册
  60. register_passport(app)
  61. # 新闻模块的蓝图注册
  62. register_news(app)
  63. # 个人中心的蓝图注册
  64. register_profile(app)
  65. # 管理员后台注册
  66. register_admin(app)
  67. return app
  68. def register_passport(app):
  69. from app.modules.passport import passport_bp
  70. app.register_blueprint(passport_bp)
  71. def register_index(app):
  72. # 注册蓝图
  73. from app.modules.index import index_bp
  74. app.register_blueprint(index_bp)
  75. def register_news(app):
  76. # 注册蓝图
  77. from app.modules.news import news_bp
  78. app.register_blueprint(news_bp)
  79. def register_profile(app):
  80. from app.modules.profile import profile_bp
  81. app.register_blueprint(profile_bp)
  82. def register_admin(app):
  83. from app.modules.admin import admin_bp
  84. app.register_blueprint(admin_bp)