当 Django 的 DEBUG 从 True 设为 False 后,内置的静态文件服务器确实会失效

当 Django 的 DEBUG 从 True 设为 False 后,内置的静态文件服务器确实会失效。这在生产环境中是必要且正确的安全措施,但需要额外配置来确保静态文件(如 CSS、JavaScript、图片)能被正常访问。

下面这个表格汇总了主要的解决方案和适用场景:

 
 
解决方案 适用场景 优点 注意事项
配置 Web 服务器 (如 Nginx) 生产环境首选 高性能、高并发、安全可靠 需要安装和配置额外的服务器软件
Django 内置临时方案 仅用于开发或测试 配置简单,无需其他组件 极度低效且不安全,绝不能用于生产

🛠️ 生产环境配置:使用 Nginx

这是生产环境的标准做法,步骤如下:

  1. 配置 Django 的 settings.py
    确保你的 settings.py 文件中包含以下配置,为收集静态文件做准备:

    python
    # 静态文件的URL访问前缀
    STATIC_URL = '/static/'
    
    # 执行 collectstatic 命令后,所有静态文件将收集到此目录
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    
    # 如果你有分散在不同位置的静态文件,可以指定额外的目录列表
    # STATICFILES_DIRS = [
    #     BASE_DIR / "some_other_static_folder",
    # ]

     

  2. 收集静态文件
    在服务器上运行以下命令,将项目所有应用(包括Admin后台)的静态文件收集到 STATIC_ROOT 指定的目录:

    bash
    python manage.py collectstatic

     

  3. 配置 Nginx
    编辑 Nginx 的配置文件(通常在 /etc/nginx/sites-available/your_project),添加一个用于处理静态文件请求的 location 块:

    nginx
    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 时继续提供静态文件。

警告:此方法仅用于开发,有安全风险且性能低下。

python
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 哪些主机/域名可以服务于这个网站,这是安全策略的一部分。

python
# 允许的域名列表,'*' 表示接受任何域名(生产环境慎用)
ALLOWED_HOSTS = ['your_domain.com', 'localhost', '127.0.0.1']
# 或者更严格的配置
# ALLOWED_HOSTS = ['www.your_production_domain.com']

 

💎 总结