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=True和SESSION_COOKIE_SECURE=True(HTTPS)。 - 内容安全策略 (CSP):通过响应头限制资源加载。
密码处理
永远直接存储密码的哈希值,使用 werkzeug.security 的 generate_password_hash 和 check_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