静态文件是指不经常更改的文件,如 CSS 样式表、JavaScript 文件、图片、字体等。Django 提供了强大的静态文件处理系统,可以方便地在开发和生产环境中管理这些文件。
| 静态文件 | 媒体文件 |
|---|---|
| 开发者上传 | 用户上传 |
| 版本控制 | 动态生成 |
| CSS, JS, 图片 | 用户头像, 文档 |
STATIC_URL |
MEDIA_URL |
在 Django 项目中,需要在 settings.py 文件中配置静态文件相关设置。
# 静态文件 URL 前缀
STATIC_URL = '/static/'
# 开发环境下静态文件目录
STATICFILES_DIRS = [
BASE_DIR / "static",
'/var/www/static/',
]
# 生产环境静态文件收集目录
STATIC_ROOT = BASE_DIR / "staticfiles"
# 静态文件查找器
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
| 设置 | 描述 |
|---|---|
STATIC_URL |
静态文件访问的 URL 前缀 |
STATICFILES_DIRS |
开发环境静态文件目录列表 |
STATIC_ROOT |
生产环境静态文件收集目录 |
STATICFILES_FINDERS |
静态文件查找器后端 |
在 Django 模板中,需要使用 {% static %} 模板标签来引用静态文件。
{# 在模板顶部加载 static 标签 #}
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的网站</title>
{# 引入 CSS 文件 #}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'css/style.css' %}">
{# 引入应用特定的 CSS #}
<link rel="stylesheet" href="{% static 'myapp/style.css' %}">
</head>
<body>
{# 使用静态图片 #}
<img src="{% static 'images/logo.png' %}" alt="Logo">
{# 引入 JavaScript 文件 #}
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'js/app.js' %}"></script>
</body>
</html>
{% load static %}
{# 在视图中传递静态文件路径 #}
{% with image_path='images/products/'|add:product.id|add:'.jpg' %}
<img src="{% static image_path %}" alt="{{ product.name }}">
{% endwith %}
{# 或者使用上下文变量 #}
<link rel="stylesheet" href="{% static css_file %}">
{% static %} 标签可以确保在不同环境中(开发/生产)都能正确引用静态文件。
在开发环境中,Django 的内置开发服务器可以自动提供静态文件服务。
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
# 开发环境下提供静态文件服务
if settings.DEBUG:
urlpatterns += static(
settings.STATIC_URL,
document_root=settings.STATIC_ROOT
)
urlpatterns += static(
settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT
)
# 运行开发服务器
python manage.py runserver
# 访问静态文件
# http://localhost:8000/static/css/style.css
# http://localhost:8000/static/js/app.js
# http://localhost:8000/static/images/logo.png
# 查找静态文件位置
python manage.py findstatic css/style.css
# 查找所有静态文件
python manage.py findstatic --all
DEBUG = TrueSTATICFILES_DIRS 配置正确在生产环境中,需要使用 collectstatic 命令收集静态文件,并使用 Web 服务器或 CDN 提供服务。
# 收集所有静态文件到 STATIC_ROOT
python manage.py collectstatic
# 在部署时自动收集
python manage.py collectstatic --noinput
# 清除旧文件后收集
python manage.py collectstatic --clear
# 干运行模式(不实际执行)
python manage.py collectstatic --dry-run
STATIC_ROOT 目录(如果使用 --clear)STATIC_ROOTserver {
listen 80;
server_name example.com;
# 静态文件服务
location /static/ {
alias /path/to/your/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# 媒体文件服务
location /media/ {
alias /path/to/your/media/;
expires 30d;
}
# Django 应用
location / {
proxy_pass http://unix:/path/to/your/app.sock;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Alias /static/ /path/to/your/staticfiles/
<Directory /path/to/your/staticfiles>
Require all granted
</Directory>
Alias /media/ /path/to/your/media/
<Directory /path/to/your/media>
Require all granted
</Directory>
# Django WSGI 配置
WSGIScriptAlias / /path/to/your/project/wsgi.py
WSGIPythonHome /path/to/your/venv
WSGIPythonPath /path/to/your/project
<Directory /path/to/your/project>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WhiteNoise 允许 Django 应用直接提供静态文件服务,无需单独的 Web 服务器。
# 安装 WhiteNoise
pip install whitenoise
# settings.py
MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]
# 静态文件存储
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
# settings.py
AWS_ACCESS_KEY_ID = 'your-access-key'
AWS_SECRET_ACCESS_KEY = 'your-secret-key'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
# 静态文件配置
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# 安装 django-storages
pip install django-storages[boto3]
# settings.py
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
# 或者分别配置静态和媒体文件
STATICFILES_STORAGE = 'myapp.storage_backends.StaticStorage'
DEFAULT_FILE_STORAGE = 'myapp.storage_backends.MediaStorage'
# Nginx 缓存配置
location /static/ {
expires 1y;
add_header Cache-Control "public, immutable";
}
DEBUG = Truecollectstatic