为什么python manage.py collectstatic不要将文件复制到正确的位置?

我面临的问题是,我的Django项目无法find静态文件

我在这个问题上挣扎了很长时间,现在我想到了问题出在哪里 ,我不知道如何解决这个问题

真正的静态文件位置:

  1. ls /code/jk/static/jk/css/main.css
  2. ls /code/jk/static/jk/js/main.js

运行时: RUN (python /code/jk/manage.py collectstatic --noinput) 我注意到这给我提供了一个错误的位置:

 ... 61 static files copied to '/code/jk/jk/static', 2 unmodified. ... 

在path中有多余的'/code/jk/jk/static' ,我不知道如何改变它。

settings.py

 ... STATIC_DIR = os.path.join(BASE_DIR, 'static') STATIC_URL = '/static/' STATICFILES_DIRS = [STATIC_DIR] PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') MEDIA_DIR = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/' MEDIA_ROOT = MEDIA_DIR ... 

我在Docker中使用Django应用程序如下:

Dockerfile

 FROM python:3 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code COPY . /code/ RUN (pip install -r reqirements.txt) RUN (python /code/jk/manage.py migrate) RUN (python /code/jk/manage.py collectstatic --noinput) RUN (python /code/jk/manage.py migrate) # clean packages RUN apt-get clean RUN rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* ENTRYPOINT ["/code/jk/start_gunicorn.sh"] 

start_gunicorn.sh

 #!/bin/bash cd /code/jk/ touch ./gunicorn.log touch ./gunicorn-access.log tail -n 0 -f ./gunicorn*.log & #export DJANGO_SETTINGS_MODULE=projectx.settings exec gunicorn jk.wsgi \ --bind 0.0.0.0:8000 \ --workers 3 \ --log-level=info \ --log-file=./gunicorn.log \ --access-logfile=./gunicorn-access.log \ "$@" 

1 – collectstatic收集资产的目录和您存储资产来源的目录是不一样的。

有两种types的目录你必须知道与Django。

  • 从应用程序中存储静态文件源的目录。 通常,这些是应用程序中的static子目录,但您可以通过设置STATICFILES_DIRS设置variables来添加自己的STATICFILES_DIRS

  • 你的静态文件将被收集到生产和服务的目录。 这是由STATIC_ROOT定义的,与我谈到的其他目录一样。 在我个人的情况下,我通常使用/path/to/project/staticfiles所以我仍然可以使用/path/to/project/static来存储源文件。

在这里,你似乎错了。 如果我没有错,你的/code/jk/static就是你期望把你的资产收集到的目录。 然而,你也把它的一些来源。 您不应该手动添加资产到这个目录,这是collectstatic的工作,以从您的源位置检索它们。

[编辑]:你也不应该使用一个目录作为你的STATIC_ROOT位置和一个位置来存储你的资产来源。

2 – Collectstatic不会将您的资产移动到错误的位置,实际上它的行为完全如您所定义。

假设你期望你的资产被收集到/code/jk/static ,你应该像这样定义STATIC_ROOT

 # Note: BASE_DIR value should be `/code/jk` STATIC_ROOT = os.path.join(BASE_DIR, 'static') 

而不是这样的:

 PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') 

后来将PROJECT_ROOT定义为“包含当前__file__的目录,它应该是settings.py ”。 你的settings.py应该包含在/code/jk/jk ,因此你的PROJECT_ROOT值。

所以当你将你的STATIC_ROOT定义为PROJECT_ROOT一个static子目录时,将你的资产存储在/code/jk/jk/static是完全正常的。