1. 默认静态文件约定
Flask默认从应用目录下的static/文件夹提供静态文件。你只需要创建这个文件夹并将静态资源放入其中即可:
myflaskapp/ ├── app.py ├── templates/ │ └── index.html └── static/ ├── css/ │ └── style.css # 样式文件 ├── js/ │ └── main.js # JavaScript文件 └── images/ └── logo.png # 图片文件
2. 在模板中引用静态文件
不要硬编码路径 ,使用url_for('static', filename='...')生成静态文件的URL。这样做的好处是:即使将来应用挂载到子路径(如/myapp),URL也会自动调整。
templates/index.html:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>RUNOOB Flask 教程</title> <!-- 引用CSS文件 --> <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"> <!-- 网站图标favicon --> <link rel="icon" href="{{ url_for('static', filename='images/favicon.ico') }}"> </head> <body> <!-- 引用图片 --> <img src="{{ url_for('static', filename='images/logo.png') }}" alt="RUNOOB Logo" width="200"> <h1>欢迎来到 RUNOOB</h1> <p>这是一个使用 Flask 构建的 Web 应用。</p> <!-- 引用JavaScript文件 --> <script src="{{ url_for('static', filename='js/main.js') }}"></script> </body> </html>
url_for()参数 |
生成的URL |
|---|---|
url_for('static', filename='css/style.css') |
/static/css/style.css |
url_for('static', filename='images/logo.png') |
/static/images/logo.png |
url_for('static', filename='js/main.js') |
/static/js/main.js |
3. CSS文件示例
创建一个基本样式文件,让页面看起来更专业:
static/css/style.css:
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; line-height: 1.6; color: #333; } h1 { color: #2c3e50; border-bottom: 2px solid #3498db; padding-bottom: 10px; } nav { background: #f8f9fa; padding: 10px; border-radius: 4px; margin-bottom: 20px; } nav a { color: #3498db; text-decoration: none; margin-right: 15px; } footer { margin-top: 40px; padding-top: 20px; border-top: 1px solid #eee; color: #999; font-size: 14px; }
4. 自定义静态文件路径
如果不想使用默认的static/文件夹,可以在创建Flask应用时自定义:
from flask import Flask # static_folder:服务器上的文件夹路径 # static_url_path:URL中的访问路径 app = Flask(__name__, static_folder="public", # 静态文件放在 public/ 目录下 static_url_path="/assets") # 通过 /assets 路径访问 # 此时访问 /assets/css/style.css 对应文件 public/css/style.css
| 参数 | 默认值 | 说明 |
|---|---|---|
static_folder |
"static" |
存放静态文件的本地文件夹 |
static_url_path |
None(使用static_folder的名称) |
静态文件对外暴露的URL前缀 |
5. 直接访问静态文件
除了在模板中通过url_for()引用,你也可以直接在浏览器中访问静态文件。
例如,项目结构为:
myflaskapp/ ├── app.py └── static/ └── css/ └── style.css
启动应用后,访问http://127.0.0.1:5000/static/css/style.css即可直接查看该CSS文件的内容。
6. 静态文件的缓存与控制
浏览器会缓存静态文件以加快加载速度。在开发阶段,如果你修改了CSS或JS文件但浏览器没有更新,可以:
| 方法 | 操作 |
|---|---|
| 强制刷新 | Ctrl + F5(Windows)或 Cmd + Shift + R(Mac) |
| 清除缓存 | 浏览器开发者工具 → 禁用缓存 |
| 添加版本参数 | {``{ url_for('static', filename='css/style.css', v=1) }} |
在生产环境中,可以通过在文件名中加入版本号(如style.v1.css)或使用查询参数来实现缓存更新。
7. 开发与生产环境的区别
| 环境 | 静态文件服务方式 | 原因 |
|---|---|---|
| 开发环境 | Flask内置服务(static/) |
方便调试,无需额外配置 |
| 生产环境 | Nginx、Apache等专业Web服务器 | 效率远高于Python代码服务 |
Flask内置的静态文件服务只适合开发环境。在生产环境中,应该由Nginx、Apache等专业Web服务器直接处理静态文件,这样效率远高于通过Python代码来服务。
生产环境部署示例(Nginx配置片段)
location /static/ { alias /var/www/myapp/static/; expires 30d; }
生产部署的详细内容将在后续章节中详细介绍。
8. 静态文件管理最佳实践
| 实践 | 说明 |
|---|---|
✅ 使用url_for() |
始终通过url_for('static', filename=...)生成URL |
| ✅ 合理组织目录 | 按文件类型分目录:css/、js/、images/、fonts/ |
| ✅ 合并与压缩 | 生产环境可合并多个CSS/JS文件并压缩,减少HTTP请求 |
| ✅ 使用CDN | 对于公共库(如Bootstrap、jQuery),可考虑使用CDN加速 |
| ❌ 硬编码路径 | 避免在模板中写死/static/css/style.css |
| ❌ 生产环境用Flask提供静态 | 生产环境应使用Nginx等专业服务器 |
小结
本章介绍了Flask中静态文件的管理方式。Flask默认从static/目录提供静态文件,在模板中通过url_for('static', filename='...')生成正确的静态文件URL,避免硬编码路径带来的维护问题;也可以通过static_folder和static_url_path参数自定义静态文件目录和访问路径。静态文件在开发环境由Flask内置服务提供,方便调试;在生产环境则应交给Nginx等专业Web服务器处理,以获得更好的性能。合理的静态文件组织和引用方式是构建专业Web应用的基础。