Flask 最佳实践

FreeGuideOnline 最新 2026-07-15

{# templates/base.html #}

{% block content %}{% endblock %} ```

静态文件缓存与CDN

生产环境应配置静态文件缓存。对于大型静态资源,可使用 CDN 或反向代理(如 Nginx)直接提供服务,减轻应用负载。

日志记录

Flask 内置日志系统,建议配置格式化输出和文件记录,便于问题排查。

import logging
from logging.handlers import RotatingFileHandler

def setup_logging(app):
    if not app.debug:
        handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=3)
        handler.setFormatter(logging.Formatter(
            '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
        ))
        handler.setLevel(logging.INFO)
        app.logger.addHandler(handler)

安全防护

必须启用的安全措施

  • CSRF 保护:使用 Flask-WTF 自动处理表单 CSRF(需要设置 SECRET_KEY)。
  • XSS 防护:模板默认自动转义;避免使用 | safe 过滤器。
  • SQL 注入防护:使用 ORM 或参数化查询。
  • 会话安全:设置 SESSION_COOKIE_HTTPONLY=TrueSESSION_COOKIE_SECURE=True(HTTPS)。
  • 内容安全策略 (CSP):通过响应头限制资源加载。

密码处理

永远直接存储密码的哈希值,使用 werkzeug.securitygenerate_password_hashcheck_password_hash

from werkzeug.security import generate_password_hash, check_password_hash

class User(db.Model):
    password_hash = db.Column(db.String(128))
    def set_password(self, password):
        self.password_hash = generate_password_hash(password)
    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

测试:保证代码质量

使用 pytest 进行单元测试和集成测试,利用应用工厂创建测试配置。

# tests/conftest.py
import pytest
from app import create_app
from app.extensions import db
from config import TestingConfig

@pytest.fixture
def app():
    app = create_app(TestingConfig)
    with app.app_context():
        db.create_all()
    yield app
    with app.app_context():
        db.drop_all()

@pytest.fixture
def client(app):
    return app.test_client()

测试示例:

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