Logo
Published on

4.1.Flask 通用模块

Authors
  • avatar
    Name
    xiaobai
    Twitter

1.应用工厂(Application Factory)

# app/__init__.py
from flask import Flask

def create_app(config_object=None):
    app = Flask(__name__)
    if config_object:
        app.config.from_object(config_object)
    # 这里可初始化数据库、注册蓝图、加载扩展等
    return app

好处:解耦环境配置、利于测试与多实例部署。

2.配置管理

# app/config.py
import os

class BaseConfig:
    SECRET_KEY = os.getenv('SECRET_KEY', 'dev-secret')
    JSON_SORT_KEYS = False

class DevConfig(BaseConfig):
    DEBUG = True

class ProdConfig(BaseConfig):
    DEBUG = False

在入口根据环境切换:

from app import create_app
from app.config import DevConfig, ProdConfig
import os

cfg = DevConfig if os.getenv('ENV', 'dev') == 'dev' else ProdConfig
app = create_app(cfg)

3.Blueprint 组织

from flask import Blueprint

api = Blueprint('api', __name__, url_prefix='/api')
admin = Blueprint('admin', __name__, url_prefix='/admin')

def register_blueprints(app):
    app.register_blueprint(api)
    app.register_blueprint(admin)

4.错误处理与统一响应

from flask import jsonify

def register_error_handlers(app):
    @app.errorhandler(404)
    def not_found(e):
        return jsonify({'error': 'not found'}), 404

    @app.errorhandler(500)
    def server_error(e):
        return jsonify({'error': 'server error'}), 500

建议:定义通用响应结构(codemessagedata),中台接口更易消费。

5.日志与请求追踪

import logging

def setup_logging(app):
    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    app.logger.addHandler(handler)
  • 结合 request 信息输出 traceId / 简易链路;生产使用结构化日志(JSON)。

6.前后置钩子(类似中间件)

from flask import request

def register_hooks(app):
    @app.before_request
    def before():
        app.logger.info(f'Incoming: {request.method} {request.path}')

    @app.after_request
    def after(response):
        response.headers['X-App'] = 'flask-demo'
        return response

7.跨域(CORS)

pip install flask-cors
from flask_cors import CORS

def enable_cors(app):
    CORS(app, resources={r"/api/*": {"origins": "*"}})

8.性能与部署建议

  • 使用 gunicorn 多进程:gunicorn -w 4 -b 0.0.0.0:5000 app:app
  • 前置 Nginx,启用压缩与缓存策略;静态资源由前端 CDN 托管。

9.总结

  • 通过工厂、配置、蓝图与钩子打造可维护的工程骨架;
  • 辅以统一错误、日志与 CORS,满足通用后端服务需求。