【问题标题】:Static files not served in Django "dockerized" (dev environnement)Django“dockerized”(开发环境)中未提供静态文件
【发布时间】:2025-12-24 20:55:06
【问题描述】:

编辑


- my_project
    |_app
        |_core
             |_wsqi.py
             |_settings
                 |_base.py   <-- settings.py used for development
                 |_dev.py
                 |_prod.py
             |_urls.py       <-- modifications
        |_requirements
             |_base.txt
             |_dev.txt
             |_prod.txt
        |_Dockerfile
        |_Dockerfile.prod
        |_entrypoint.sh
        |_entrypoint.prod.sh
        |_manage.py
        |_.dockerignore
    |_nginx
    |_.env.dev
    |_.env.prod
    |_.gitignore
    |_docker-compose.yml
    |_docker-compose.prod.yml

# from django.conf import settings
import core
from django.conf.urls.static import static

urlpatterns = [
    path('', views.home, name='home'),
    path('registration/', include('django.contrib.auth.urls')),
    path('randomization_management/', include('randomization_management.urls')),
    path('randomization_settings/', include('randomization_settings.urls')),   
    path('randomization/', include('randomization.urls')),
    path('export/', include('export.urls')), 
    path('contact/', views.contact, name='contact'),
    path('admin/', admin.site.urls),
] + static(core.settings.dev.STATIC_URL, document_root=core.settings.dev.STATIC_ROOT)

我尝试“dockerize”一个 Django 应用程序。

除了未提供的静态文件外,一切正常。 我使用 Django Web 服务器 (dev),所以我不必“提供”静态文件。

不过,我运行docker exec -it coverage_africa_web_1 python manage.py collectstatic 命令

并得到确认

您已请求在目的地收集静态文件 设置中指定的位置:

/usr/src/app/static

这将覆盖现有文件! 您确定要这样做吗?

输入“yes”继续,或输入“no”取消:yes 找到另一个目标路径为“randomization/js/script.js”的文件。它将被忽略,因为只收集第一个遇到的文件。如果这不是您想要的,请确保每个静态文件都有唯一的路径。

140 个静态文件复制到“/usr/src/app/static”。

settings.base.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static")

STATICFILES_DIRS = (
    os.path.join(BASE_DIR,'randomization_management/static'),
    os.path.join(BASE_DIR,'randomization_settings/static'),
    os.path.join(BASE_DIR,'randomization/static'),
)

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

.env.dev

SECRET_KEY=*************************************
DEBUG=1
DJANGO_ALLOWED_HOSTS=localhost 127.0.0.1 [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=db_dev
SQL_USER=user
SQL_PASSWORD=user
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgres
DJANGO_SETTINGS_MODULE=core.settings.dev

docker-compose.yml

version: '3.7'

services:
    web:
        build: ./app
        restart: always
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - ./app/:/usr/src/app
        ports:
            - 8000:8000
        env_file:
            - ./.env.dev
        depends_on: 
            - db
    db:
        image: postgres:12.0-alpine
        restart: always
        volumes:
            - postgres_data:/var/lib/postgres/data/
        environment:
            - POSTGRES_USER=user
            - POSTGRES_PASSWORD=user
            - POSTGRES_DB=db_dev
volumes:
    postgres_data:

【问题讨论】:

    标签: django docker-compose static


    【解决方案1】:

    我看到您没有使用 Web 服务器来提供静态文件,因此请确保 Django 正在提供静态文件。

    from django.conf import settings
    from django.conf.urls.static import static
    
    urlpatterns = [
        # ... the rest of your URLconf goes here ...
    ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    

    查看 Django 文档https://docs.djangoproject.com/en/3.1/howto/static-files/#serving-static-files-during-development

    【讨论】:

    • 感谢您的回复。当我使用 Django runserver 时,它应该“单独”服务;我已经用架构项目更新了我的帖子,并按照建议修改了我的 urls.py 文件,但没有改变......
    【解决方案2】:

    好的,缺少设置

    STATIC_URL = '/static/'
    # STATIC_ROOT = os.path.join(BASE_DIR, "static")                   <- removed in dev
    
    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, "static"),                              <- added in dev
        os.path.join(BASE_DIR,'randomization_management/static'),
        os.path.join(BASE_DIR,'randomization_settings/static'),
        os.path.join(BASE_DIR,'randomization/static'),
    )
    

    【讨论】: