Flask是最适合Python+HTML结合的轻量框架,三行代码即可启动服务并渲染Jinja2模板;变量用{{ name }}自动转义防XSS,静态文件须放static目录并通过url_for引用,复杂交互应改用API+前端JS。

用 Flask 或 FastAPI 启动一个最小 Web 服务
Python 代码和 HTML 结合,本质是让 Python 处理逻辑(比如查数据库、算数据),再把结果塞进 HTML 页面返回给浏览器。最直接的路就是起个 Web 框架服务,不是“嵌入 HTML”,而是“由 Python 渲染 HTML”。
Flask 是入门门槛最低的选择;FastAPI 更适合需要 JSON API + 少量页面的场景。别碰 Django(太重)、也别用纯 http.server(没法方便渲染模板)。
- Flask 安装:
pip install flask - 新建
app.py,写三行就能跑:from flask import Flask, render_template app = Flask(__name__) @app.route("/") def home(): return render_template("index.html", name="Alice") - HTML 文件必须放在
templates/目录下,Flask 才认得render_template
在 HTML 中安全插入 Python 变量(Jinja2 模板语法)
Flask 和 FastAPI(配 Jinja2)都用 Jinja2 做模板引擎。它不是字符串拼接,而是带转义的变量注入——这点不注意,XSS 漏洞立刻出现。
- 变量输出用双大括号:
{{ name }},会自动转义 HTML 特殊字符(比如把变成文字) - 如果真要渲染 HTML 字符串(比如富文本内容),用
{{ html_content | safe }},但前提是这内容你完全可控 - 不要用 Python 的
f-string拼 HTML,也不要用.format()往 HTML 字符串里塞变量——绕过模板引擎就等于放弃安全防护 - 循环示例:
{% for item in items %},- {{ item }}
{% endfor %}{%和%}是 Jinja2 控制结构,不是 Python 语法
静态文件(CSS/JS/图片)怎么放、怎么引用
HTML 里写的 不会自动找到你的 CSS 文件——Web 框架默认不开放任意目录访问,必须显式声明静态资源路径。
初阶PHP Apache MySQL网站设计来自作者多年学习、应用和讲授PHP的经验与体会,是专为学习PHP+MySQL数据库编程人员编与的入门教材。在最后二章设计了2个贴近实际应用的典型案例:留言本系统和论坛系统,每个案例先介绍开发思路、步骤,再给出全部源代码,使所学内容与实际应用紧密结合,特别是论坛系统将全书的案例串讲起来,力求使读者学到最贴近应用前沿的知识和技能。
立即学习“Python免费学习笔记(深入)”;
- Flask 默认从
static/目录提供静态文件,所以把style.css放到static/css/style.css - HTML 中引用必须用
url_for生成路径:,硬写href="static/css/style.css"在生产环境(尤其加了 URL 前缀时)大概率 404 - FastAPI 需手动挂载:
app.mount("/static", StaticFiles(directory="static"), name="static"),然后在模板里仍用url_for(需配置templates时传env.globals["url_for"] = request.url_for) - 浏览器缓存静态文件很凶,改了 CSS 看不到效果?试试加版本参数:
href="{{ url_for('static', filename='css/style.css') }}?v=1.0.1"
什么时候不该用模板渲染,而该用 API + 前端 JS
如果你的页面交互复杂(比如实时搜索、拖拽排序、表单校验反馈),硬塞所有逻辑进 Jinja2 模板会迅速失控。这时候 Python 只管提供数据接口,HTML+JS 自己干活更稳。
- Flask 写个 JSON 接口只需一行:
@app.route("/api/data")+return {"items": [...]}(Flask 自动设 Content-Type) - 前端用
fetch("/api/data")拿数据,再用 JS 拼 DOM 或交给 Vue/React 渲染 - 优势:前后端职责清晰、调试方便、前端可热更新、SEO 需求低时体验更好
- 坑点:跨域问题(开发时 Flask 加
CORS(app),生产用 Nginx 反向代理);CSRF 防护要自己补(比如读XSRF-TOKENheader)
真正的难点不在“怎么连上”,而在决定哪部分逻辑放 Python、哪部分放浏览器——模板适合展示为主、交互简单的页面;AJAX 适合操作频繁、状态多变的界面。选错方向,后期改起来比重写还累。










