无论你用的是 Django、Flask 还是 FastAPI,一个 Web 框架的本质工作都可以拆解为这六大块。理解了它们,就掌握了 Web 开发的通用语言。
路由(URL 分发)
路由把用户请求的 URL 映射到对应的处理函数上。
- Django:在
urls.py中用path()或re_path()定义,支持正则和路径转换器。 - Flask:用装饰器
@app.route('/user/<id>')直接在视图函数上声明,直观简洁。 - FastAPI:同样用装饰器
@app.get('/user/{id}'),并自动根据类型注解生成文档。 - 实用要点:RESTful 设计中通常按资源组织路由,如
/users、/users/123,配合 HTTP 方法区分操作。
视图(请求处理逻辑)
视图就是接收请求、调用业务逻辑、返回响应的函数或类。
- Django:有 FBV(基于函数的视图)和 CBV(基于类的视图),CBV 封装了通用模式(列表页、详情页)。
- Flask:简单的函数视图,通过
request全局对象获取请求数据,返回字符串、JSON 或模板渲染结果。 - FastAPI:视图函数通过参数接收请求体、查询参数、路径参数,并利用 Pydantic 模型自动校验。
- 真实写法:视图应该“瘦”——只做参数解析和返回格式化,业务逻辑交给 service 层。
模板(页面渲染)
模板让你把动态数据嵌入 HTML,生成最终页面。
- Django 自带的模板语言支持变量、过滤器、标签、模板继承,非侵入式,适合前后端不分离场景。
- Flask 使用 Jinja2,语法与 Django 模板相似,但更灵活。
- FastAPI 也可以搭配 Jinja2 使用,但现在更多项目采用前后端分离,模板用得少了。
- 最佳实践:模板里只做展示逻辑,不要写复杂业务代码,保持干净。
ORM(对象关系映射)
ORM 让你用 Python 对象操作数据库,而不用手写 SQL。
- Django ORM 是最强效的:一个
Model类对应一张表,QuerySet提供链式过滤、聚合、关联查询,迁移工具自动管理表结构。 - Flask 通常搭配 SQLAlchemy(独立 ORM),通过模型类定义表,session 管理读写,灵活性极高。
- FastAPI 也常用 SQLAlchemy 或异步 ORM(如 Tortoise-ORM、SQLModel)。
- 实用提醒:ORM 方便,但不能完全替代 SQL 知识。遇到复杂查询或性能问题,还是要看生成的 SQL 并优化索引。
中间件(请求/响应处理链)
中间件是全局的请求和响应处理器,可以在视图之前或之后执行统一逻辑。
- Django 的中间件是一个类,包含
process_request、process_response等方法,用于跨请求的认证、日志、压缩等。 - Flask 同样可编写中间件,或使用装饰器、
before_request/after_request钩子。 - FastAPI 的中间件是简单的 ASGI 中间件,可以拦截和处理所有请求/响应。
- 常见场景:用户认证拦截、跨域处理、请求日志、异常统一捕获和返回友好错误。
异常处理(错误返回与兜底)
Web 应用难免出错,优雅地处理异常是专业性的体现。
- Django 有内置的 404、500 页面,可在
handler404中自定义,业务异常可通过继承django.core.exceptions实现。 - Flask 使用
errorhandler装饰器注册错误处理函数,捕捉特定 HTTP 异常或自定义异常。 - FastAPI 可以直接抛出
HTTPException,框架会自动返回规范 JSON;还可以通过exception_handler注册全局异常处理器。 - 实用原则:不要向用户暴露内部调用栈,统一返回
{"detail": "原因"}格式的 JSON,并在日志中记录完整异常信息。
这六大核心能力构成了 Web 框架的骨架。不同的框架在写法、默认配置上有差异,但思想相通。掌握它们之后,切换框架会非常快,并且你能清晰判断项目在哪个环节出了问题。