为什么python manage.py collectstatic不要将文件复制到正确的位置?
我面临的问题是,我的Django项目无法find静态文件 。
我在这个问题上挣扎了很长时间,现在我想到了问题出在哪里 ,我不知道如何解决这个问题 。
真正的静态文件位置:
- ls /code/jk/static/jk/css/main.css
- 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
是完全正常的。