Flask 最佳实践

本章汇总 Flask 项目中最常见、最实用的工程实践,帮助你把示例应用逐步整理成可维护的生产项目。

使用应用工厂

推荐用应用工厂函数创建 Flask 实例,避免在导入模块时立刻初始化所有资源。这样更方便测试、配置切换和多实例部署。

from flask import Flask

def create_app(config_object="config.DevelopmentConfig"):
    app = Flask(__name__)
    app.config.from_object(config_object)

    from .views import bp as main_bp
    app.register_blueprint(main_bp)

    return app

分离配置

不要把密钥、数据库地址等敏感配置写死在代码中。常见做法是使用环境变量,并按环境拆分配置类。

import os

class Config:
    SECRET_KEY = os.environ.get("SECRET_KEY", "dev-only-secret")
    SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL")

class DevelopmentConfig(Config):
    DEBUG = True

class ProductionConfig(Config):
    DEBUG = False

使用蓝图组织功能

当项目变大后,应按功能模块创建蓝图,例如 authadminapiblog。这样可以降低路由、模板和业务逻辑之间的耦合。

from flask import Blueprint

bp = Blueprint("blog", __name__, url_prefix="/blog")

@bp.get("/")
def index():
    return "Blog list"

保持视图函数简洁

视图函数应负责处理请求和返回响应,复杂业务逻辑应放到服务层、模型方法或独立工具函数中。

@bp.post("/posts")
def create_post():
    data = request.get_json()
    post = post_service.create_post(data)
    return jsonify(post.to_dict()), 201

统一错误处理

为常见错误注册统一处理器,避免每个视图重复编写异常响应。

@app.errorhandler(404)
def not_found(error):
    return {"message": "Resource not found"}, 404

@app.errorhandler(500)
def server_error(error):
    return {"message": "Internal server error"}, 500

编写自动化测试

Flask 内置测试客户端,适合测试路由、认证、表单和 API 响应。

def test_home_page(client):
    response = client.get("/")
    assert response.status_code == 200

生产环境注意事项

  • 不要在生产环境启用 debug=True
  • 使用 HTTPS 和安全 Cookie 配置
  • 使用 Gunicorn、uWSGI 等 WSGI 服务器运行应用
  • 对日志、异常、慢查询和外部服务调用进行监控
  • 对输入数据做校验,对数据库操作使用参数化查询或 ORM

小结

好的 Flask 项目通常具备清晰的目录结构、可替换的配置、模块化蓝图、统一错误处理和自动化测试。先从应用工厂和配置分离开始,后续扩展会轻松很多。