def create_app(config, enable_config_file=False): """ 创建flask应用 并 初始化各组件 :param config: 配置类 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: flask应用 """ app = create_flask_app(config, enable_config_file) # 添加自定义正则转换器 from utils.converters import register_converters register_converters(app) # TODO 创建redis哨兵 from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) # 获取redis主从连接对象 app.redis_master = _sentinel.master_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) # 配置日志 from utils.logging import create_logger create_logger(app) # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册新闻模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册搜索模块蓝图 from .resources.search import search_bp app.register_blueprint(search_bp) return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 注册url转换器 sys.path.append('../') from utils.converters import register_converters register_converters(app) # Redis配置 from flask_redis import FlaskRedis app.config['REDIS_URL'] = global_config.getRaw('redis', 'REDIS_URL') app.redis_cli = FlaskRedis(app) # 配置限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 添加请求钩子 from utils.middlewares import jwt_authentication app.before_request(jwt_authentication) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册用户模块蓝图 from haozhuan.resources.user import user_bp app.register_blueprint(user_bp) # 允许跨域 return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 创建Snowflake ID worker from utils.snowflake.id_worker import IdWorker app.id_worker = IdWorker(app.config['DATACENTER_ID'], app.config['WORKER_ID'], app.config['SEQUENCE']) # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册url转换器 from utils.converters import register_converters register_converters(app) from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) app.redis_master = _sentinel.master_for(app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for(app.config['REDIS_SENTINEL_SERVICE_NAME']) from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster(startup_nodes=app.config['REDIS_CLUSTER']) # rpc # app.rpc_reco = grpc.insecure_channel(app.config['RPC'].RECOMMEND) # Elasticsearch app.es = Elasticsearch( app.config['ES'], # sniff before doing anything sniff_on_start=True, # refresh nodes after a node fails to respond sniff_on_connection_fail=True, # and also every 60 seconds sniffer_timeout=60 ) # socket.io # app.sio_maneger = socketio.KombuManager(app.config['RABBITMQ'], write_only=True) # MySQL数据库连接初始化 from models import db db.init_app(app) # 添加请求钩子 from utils.middlewares import jwt_authentication app.before_request(jwt_authentication) # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册新闻模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册通知模块 from .resources.notice import notice_bp app.register_blueprint(notice_bp) # 搜索 from .resources.search import search_bp app.register_blueprint(search_bp) return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 创建Snowflake ID worker from utils.snowflake.id_worker import IdWorker app.id_worker = IdWorker(app.config['DATACENTER_ID'], app.config['WORKER_ID'], app.config['SEQUENCE']) # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # CORS CORS(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册url转换器 from utils.converters import register_converters register_converters(app) # redis # 暂时保留旧redis接口 from utils.redis_client import create_redis_clients app.redis_cli = create_redis_clients(app) from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) app.redis_master = _sentinel.master_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster( startup_nodes=app.config['REDIS_CLUSTER']) # Elasticsearch app.es = Elasticsearch( app.config['ES'], # sniff before doing anything sniff_on_start=True, # refresh nodes after a node fails to respond sniff_on_connection_fail=True, # and also every 60 seconds sniffer_timeout=60) # MySQL数据库连接初始化 from models import db db.init_app(app) # 已废弃 添加异常处理 # from utils.error_handlers import handle_redis_error, handler_mysql_error # app.register_error_handler(RedisError, handle_redis_error) # app.register_error_handler(SQLAlchemyError, handler_mysql_error) # 添加请求钩子 from utils.middlewares import jwt_authentication app.before_request(jwt_authentication) # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册用户模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册统计模块 from .resources.statistic import statistic_bp app.register_blueprint(statistic_bp) return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 允许跨域 CORS(app, supports_credentials=True) # 限流器 from utils.limiter import limiter limiter.init_app(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册url转换器 from utils.converters import register_converters register_converters(app) # redis # 暂时保留旧redis接口 from utils.redis_client import create_redis_clients app.redis_cli = create_redis_clients(app) from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) app.redis_master = _sentinel.master_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster( startup_nodes=app.config['REDIS_CLUSTER']) # rpc # app.rpc_reco = grpc.insecure_channel(app.config['RPC'].RECOMMEND) # Elasticsearch app.es = Elasticsearch( app.config['ES'], # sniff before doing anything sniff_on_start=True, # refresh nodes after a node fails to respond sniff_on_connection_fail=True, # and also every 60 seconds sniffer_timeout=60) # socket.io # app.sio = socketio.KombuManager(app.config['RABBITMQ'], write_only=True) # 与推荐系统对接的kafka app.kafka_producer = KafkaProducer( bootstrap_servers=app.config['KAFKA_SERVERS']) # MySQL数据库连接初始化 from models import db db.init_app(app) # 已废弃 添加异常处理 # from utils.error_handlers import handle_redis_error, handler_mysql_error # app.register_error_handler(RedisError, handle_redis_error) # app.register_error_handler(SQLAlchemyError, handler_mysql_error) # 添加请求钩子 from utils.middlewares import mis_jwt_authentication app.before_request(mis_jwt_authentication) # 注册用户管理模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册信息管理模块蓝图 from .resources.information import information_bp app.register_blueprint(information_bp) # 注册数据统计模块蓝图 from .resources.statistics import statistics_bp app.register_blueprint(statistics_bp) # 注册系统管理模块蓝图 from .resources.system import system_bp app.register_blueprint(system_bp) # 注册推荐系统模块蓝图 from .resources.recommend import recommend_bp app.register_blueprint(recommend_bp) return app
def create_app(env_type, enable_config_file=False): """ 创建flask应用 并 初始化各组件 :param env_type: 环境类型 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: flask应用 """ app = create_flask_app(env_type, enable_config_file) # 添加自定义正则转换器 from utils.converters import register_converters register_converters(app) # 创建redis哨兵 from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) # 获取redis主从连接对象 app.redis_master = _sentinel.master_for(app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for(app.config['REDIS_SENTINEL_SERVICE_NAME']) # 创建redis集群 from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster(startup_nodes=app.config['REDIS_CLUSTER']) # 配置myql数据库 from models import db db.init_app(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 创建Snowflake ID worker from utils.snowflake.id_worker import IdWorker app.id_worker = IdWorker(app.config['DATACENTER_ID'], app.config['WORKER_ID'], app.config['SEQUENCE']) # 创建执行器 from apscheduler.executors.pool import ThreadPoolExecutor executor = ThreadPoolExecutor() # 创建定时任务调度器 from apscheduler.schedulers.background import BackgroundScheduler app.scheduler = BackgroundScheduler(executors={'default': executor}) from scheduler.cache_schedule import fix_statistic # 添加定时任务 每天3天同步数据 # app.scheduler.add_job(fix_statistic, 'cron', hour=3) app.scheduler.add_job(fix_statistic, 'date', args=[app]) # 启动调度器 app.scheduler.start() # 建立grpc的连接 app.channel = grpc.insecure_channel(app.config['RPC'].RECOMMEND) # 创建socketio的消息队列管理器(要求flask应用处于生产模式) 将消息保存到消息队列中 import socketio app.siomgr = socketio.KombuManager(app.config['RABBIT_MQ']) # 创建es客户端 from elasticsearch5 import Elasticsearch app.es = Elasticsearch( app.config['ES_HOST'], # 启动前嗅探es集群服务器 sniff_on_start=True, # es集群服务器结点连接异常时是否刷新es节点信息 sniff_on_connection_fail=True, # 每60秒刷新节点信息 sniffer_timeout=60 ) # 添加请求钩子 from utils.middlewares import jwt_authentication app.before_request(jwt_authentication) # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册新闻模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册搜索模块蓝图 from .resources.search import search_bp app.register_blueprint(search_bp) return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 创建Snowflake ID worker from utils.snowflake.id_worker import IdWorker app.id_worker = IdWorker(app.config['DATACENTER_ID'], app.config['WORKER_ID'], app.config['SEQUENCE']) # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册url转换器 from utils.converters import register_converters register_converters(app) from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) app.redis_master = _sentinel.master_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster( startup_nodes=app.config['REDIS_CLUSTER']) # rpc app.rpc_reco = grpc.insecure_channel(app.config['RPC'].RECOMMEND) # Elasticsearch app.es = Elasticsearch( app.config['ES'], # sniff before doing anything sniff_on_start=True, # refresh nodes after a node fails to respond sniff_on_connection_fail=True, # and also every 60 seconds sniffer_timeout=60) # socket.io # app.sio = socketio.KombuManager(app.config['RABBITMQ'], write_only=True) # MySQL数据库连接初始化 from models import db db.init_app(app) # 添加请求钩子 from utils.middlewares import jwt_authentication app.before_request(jwt_authentication) # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册新闻模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册通知模块 from .resources.notice import notice_bp app.register_blueprint(notice_bp) # 搜索 from .resources.search import search_bp app.register_blueprint(search_bp) # 定义apscheduler的调度器对象 # 保存到flask的app对象,方便在视图中使用调度器添加新的定时任务 executors = { 'default': ThreadPoolExecutor(20), } app.scheduler = BackgroundScheduler(executors=executors) # 由scheduler管理的定时任务 两种: # 一种是一开始就明确确定的 ,比如 修正redis的统计数据 # 在此处定义 add_job # app.scheduler.add_job() # 添加定时修正统计数据的定时任务 from .schedulers.statistic import fix_statistics # 每天的凌晨3点执行 # 通过args 可以在调度器执行定时任务方法的时候,传递给定时任务方法参数 # app.scheduler.add_job(fix_statistics, 'cron', hour=3, args=[app]) # 为了测试方便,需要立即执行 app.scheduler.add_job(fix_statistics, 'date', args=[app]) # 另一种 是在flask运行期间,由视图函数产生的,动态添加的新定时任务 # 在视图函数中 调用 current_app.scheduler.add_job来添加 app.scheduler.start() # 非阻塞,不会阻塞住flask程序的执行,会在后台单独创建进程或线程进行计时 return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 创建Snowflake ID worker from utils.snowflake.id_worker import IdWorker app.id_worker = IdWorker(app.config['DATACENTER_ID'], app.config['WORKER_ID'], app.config['SEQUENCE']) # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册url转换器 from utils.converters import register_converters register_converters(app) from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) app.redis_master = _sentinel.master_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster( startup_nodes=app.config['REDIS_CLUSTER']) # rpc app.rpc_reco_channel = grpc.insecure_channel(app.config['RPC'].RECOMMEND) app.rpc_reco = app.rpc_reco_channel # Elasticsearch app.es = Elasticsearch( app.config['ES'], # sniff before doing anything sniff_on_start=True, # refresh nodes after a node fails to respond sniff_on_connection_fail=True, # and also every 60 seconds sniffer_timeout=60) # socket.io # 通过sio mgr对象 可以发布要进行即使消息推送的任务,由socketio服务器从rabbitmq中取出任务,推送消息 app.sio_mgr = socketio.KombuManager(app.config['RABBITMQ'], write_only=True) # MySQL数据库连接初始化 from models import db db.init_app(app) # 创建APScheduler定时任务调度器对象 executors = {'default': ThreadPoolExecutor(10)} app.scheduler = BackgroundScheduler(executors=executors) # 添加"静态的"定时任务 from .schedule.statistic import fix_statistics # app.scheduler.add_job(fix_statistics, 'date', args=[app]) app.scheduler.add_job(fix_statistics, 'cron', hour=3, args=[app]) # 启动定时任务调度器 app.scheduler.start() # 废弃 添加异常处理 对于flask-restful无效 # from utils.error_handlers import handle_redis_error, handler_mysql_error # app.register_error_handler(RedisError, handle_redis_error) # app.register_error_handler(SQLAlchemyError, handler_mysql_error) # 添加请求钩子 from utils.middlewares import jwt_authentication app.before_request(jwt_authentication) # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册新闻模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册通知模块 from .resources.notice import notice_bp app.register_blueprint(notice_bp) # 搜索 from .resources.search import search_bp app.register_blueprint(search_bp) return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 创建Snowflake ID worker from utils.snowflake.id_worker import IdWorker app.id_worker = IdWorker(app.config['DATACENTER_ID'], app.config['WORKER_ID'], app.config['SEQUENCE']) # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册url转换器 from utils.converters import register_converters register_converters(app) from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) app.redis_master = _sentinel.master_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster( startup_nodes=app.config['REDIS_CLUSTER']) # rpc app.rpc_reco_channel = grpc.insecure_channel(app.config['RPC'].RECOMMEND) # app.rpc_reco = grpc.insecure_channel(app.config['RPC'].RECOMMEND) # Elasticsearch app.es = Elasticsearch( app.config['ES'], # sniff before doing anything sniff_on_start=True, # refresh nodes after a node fails to respond sniff_on_connection_fail=True, # and also every 60 seconds sniffer_timeout=60) # socket.io # app.sio = socketio.KombuManager(app.config['RABBITMQ'], write_only=True) # MySQL数据库连接初始化 from models import db db.init_app(app) # # 添加请求钩子 from utils.middleware import jwt_authorization app.before_request(jwt_authorization) # 添加定时任务APScheduler from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.executors.pool import ThreadPoolExecutor # 触发器 from apscheduler.triggers import date, interval, cron from toutiao.schedule.statistics import fix_statistics # 1.创建执行器对象executors executors = { # 默认会将定时任务使用线程执行,并且添加到线程池,最大并发10个线程 "default": ThreadPoolExecutor(max_workers=10) } # 2.创建调度器对象-使用executors进行配置 scheduler = BackgroundScheduler(executors=executors) # 2.1 将scheduler对象保存到app中,其他地方如果需要添加`动态任务` :current_app.scheduler.add_job(动态任务) app.scheduler = scheduler # 3.添加任务--修正统计数据--`静态任务` # app.scheduler.add_job(func="定时任务函数引用", trigger="触发器", args=["参数"]) # app.scheduler.add_job(func=fix_statistics, trigger=cron.CronTrigger(hour=4), args=["参数"]) # 触发器凌晨4点执行任务 # app.scheduler.add_job(func=fix_statistics, trigger="cron", hour=4, args=[app]) app.scheduler.add_job(func=fix_statistics, trigger="date", args=[app]) # 4.开启定时任务 app.scheduler.start() # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册新闻模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册通知模块 from .resources.notice import notice_bp app.register_blueprint(notice_bp) # 搜索 from .resources.search import search_bp app.register_blueprint(search_bp) return app
def create_app(config, enable_config_file=False): """ 创建应用 :param config: 配置信息对象 :param enable_config_file: 是否允许运行环境中的配置文件覆盖已加载的配置信息 :return: 应用 """ app = create_flask_app(config, enable_config_file) # 创建Snowflake ID worker from utils.snowflake.id_worker import IdWorker app.id_worker = IdWorker(app.config['DATACENTER_ID'], app.config['WORKER_ID'], app.config['SEQUENCE']) # 如果在视图中需要生成分布式ID # id = current_app.id_worker.get_id() # 限流器 from utils.limiter import limiter as lmt lmt.init_app(app) # 配置日志 from utils.logging import create_logger create_logger(app) # 注册url转换器 from utils.converters import register_converters register_converters(app) from redis.sentinel import Sentinel _sentinel = Sentinel(app.config['REDIS_SENTINELS']) app.redis_master = _sentinel.master_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) app.redis_slave = _sentinel.slave_for( app.config['REDIS_SENTINEL_SERVICE_NAME']) from rediscluster import StrictRedisCluster app.redis_cluster = StrictRedisCluster( startup_nodes=app.config['REDIS_CLUSTER']) # 视图 # current_app.redis_master.set() # current_app.redis_cluster.get() # rpc app.rpc_reco = grpc.insecure_channel(app.config['RPC'].RECOMMEND) # Elasticsearch app.es = Elasticsearch( app.config['ES'], # sniff before doing anything sniff_on_start=True, # refresh nodes after a node fails to respond sniff_on_connection_fail=True, # and also every 60 seconds sniffer_timeout=60) # socket.io # app.sio = socketio.KombuManager(app.config['RABBITMQ'], write_only=True) # MySQL数据库连接初始化 from models import db db.init_app(app) # db = SQLAlchmey(app) # db = SQLAlchemy() # db.init_app(app_ # 创建定时任务工具对象 # 将scheduler对象保存到flask app对象中的目的,是方便视图执行的时候随时产生新的定时任务需求,可以借助current_app.scheduler.add_job()来 # 动态添加新的定时任务 executors = { 'default': ThreadPoolExecutor(10), } app.scheduler = BackgroundScheduler(executors=executors) # 此处可以添加定时任务,这些定时任务与视图程序的执行无关,是在程序启动一开始就确定好的 from .schedule import statistic # 每天凌晨3点执行 app.scheduler.add_job(statistic.fix_statistics, 'cron', hour=3, args=[app]) # 为了测试方便,立即执行 # app.scheduler.add_job(statistic.fix_statistics, 'date', args=[app]) # app.scheduler.add_job() # app.scheduler.add_job() # app.scheduler.add_job() app.scheduler.start() # 添加请求钩子 from utils.middlewares import jwt_authentication app.before_request(jwt_authentication) # 注册用户模块蓝图 from .resources.user import user_bp app.register_blueprint(user_bp) # 注册新闻模块蓝图 from .resources.news import news_bp app.register_blueprint(news_bp) # 注册通知模块 from .resources.notice import notice_bp app.register_blueprint(notice_bp) # 搜索 from .resources.search import search_bp app.register_blueprint(search_bp) return app