当 Django 的 DEBUG 从 True 设为 False 后,内置的静态文件服务器确实会失效。这在生产环境中是必要且正确的安全措施,但需要额外配置来确保静态文件(如 CSS、JavaScript、图片)能被正常访问。
下面这个表格汇总了主要的解决方案和适用场景:
| 解决方案 | 适用场景 | 优点 | 注意事项 |
|---|---|---|---|
| 配置 Web 服务器 (如 Nginx) | 生产环境首选 | 高性能、高并发、安全可靠 | 需要安装和配置额外的服务器软件 |
| Django 内置临时方案 | 仅用于开发或测试 | 配置简单,无需其他组件 | 极度低效且不安全,绝不能用于生产 |
🛠️ 生产环境配置:使用 Nginx
这是生产环境的标准做法,步骤如下:
-
配置 Django 的
settings.py
确保你的settings.py文件中包含以下配置,为收集静态文件做准备:# 静态文件的URL访问前缀 STATIC_URL = '/static/' # 执行 collectstatic 命令后,所有静态文件将收集到此目录 STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 如果你有分散在不同位置的静态文件,可以指定额外的目录列表 # STATICFILES_DIRS = [ # BASE_DIR / "some_other_static_folder", # ]
-
收集静态文件
在服务器上运行以下命令,将项目所有应用(包括Admin后台)的静态文件收集到STATIC_ROOT指定的目录:python manage.py collectstatic
-
配置 Nginx
编辑 Nginx 的配置文件(通常在/etc/nginx/sites-available/your_project),添加一个用于处理静态文件请求的location块:server { listen 80; server_name your_domain.com; # 你的域名或IP # 配置静态文件路径 location /static/ { # 这里的路径必须与 settings.py 中的 STATIC_ROOT 一致 alias /path/to/your/project/static/; # 可以设置文件过期时间,提升性能 expires 30d; } # 动态请求转发给Django应用(如Gunicorn或uWSGI) location / { proxy_pass http://127.0.0.1:8000; # 假设Django运行在本机8000端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
配置完成后,使用sudo nginx -s reload重新加载配置使改动生效。
🔧 开发环境临时方案
如果仅用于开发或测试,不希望配置完整的 Nginx,可以临时修改 Django 的 urls.py 文件,让 Django 在 DEBUG=False 时继续提供静态文件。
警告:此方法仅用于开发,有安全风险且性能低下。
from django.conf import settings from django.conf.urls.static import static from django.urls import path, include urlpatterns = [ # ... 你的其他URL配置 ... ] # 仅在非调试模式下添加静态文件路由 if not settings.DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
⚠️ 其他重要设置
将 DEBUG 设置为 False 后,还必须配置 ALLOWED_HOSTS 设置。这个设置告诉 Django 哪些主机/域名可以服务于这个网站,这是安全策略的一部分。
# 允许的域名列表,'*' 表示接受任何域名(生产环境慎用) ALLOWED_HOSTS = ['your_domain.com', 'localhost', '127.0.0.1'] # 或者更严格的配置 # ALLOWED_HOSTS = ['www.your_production_domain.com']
💎 总结
-
生产环境:务必使用 Nginx 或 Apache 等专业 Web 服务器来处理静态文件。这是唯一推荐的做法。
-
开发测试:可使用修改
urls.py的临时方法快速让静态文件恢复,但切记不能用于生产环境。 -
通用步骤:正确配置
settings.py中的STATIC_ROOT并运行collectstatic命令是基础。