2017-12-03 1 views
1

내가 직면하고있는 문제는 내 장고 프로젝트가 정적 파일을 찾을 수 없다는 것입니다.왜 python manage.py collectstatic가 올바른 위치에 파일을 복사하지 않습니까?

나는 따라서 아주 잠시 동안이 문제를 고민하고, 지금 나는 문제 그러나이고, 나는 그것을를 해결하는 방법에 어떤 아이디어가 생각.

리얼 정적 파일 위치 :

  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. 
... 

경로에 중복 '/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 
... 

나는 다음과 같은 고정 표시기에 장고 응용 프로그램을 사용하고 있습니다 :

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 \ 
"[email protected]" 

답변

1

1 - 디렉토리 collectstatic는 동일하지 않습니다 당신이 당신의 자산 소스를 저장소에 자산을 수집 및 디렉토리.

django에 대해 알아야 할 두 가지 종류의 디렉토리가 있습니다.

  • 응용 프로그램에서 정적 파일 원본을 저장할 디렉터리입니다. 일반적으로 응용 프로그램에있는 서브 디렉토리는 static이지만, 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_ROOTsettings.py "이어야하는 현재 __file__을 포함합니다. settings.py/code/jk/jk에 포함되어야하며 따라서 PROJECT_ROOT 값입니다.

그래서 당신은 당신의 STATIC_ROOTstatic 유사한 하위 디렉토리를 정의 할 때 PROJECT_ROOT 그것은 당신의 자산 /code/jk/jk/static에 저장하기가 완벽하게 정상입니다.

+0

아니요. 그는 'STATIC_DIR'이라고하는 것을 프로젝트 전체의 정적 소스로 올바르게 사용합니다. 그러나 웹 서버는'/ static'을 제공하는 방법을 모른다. – Melvyn

+0

@Melvyn 나는 그의'STATIC_DIR'에 아무런 문제가 없다. 그러나 그것은 자산이 수집되는 곳을 정의하는'STATIC_ROOT'입니다. 저에게이 파일을 프로덕션 환경에서 제공하는 것은이 질문에서 논란이 아닌 것 같습니다. – vmonteco

+0

안녕 얘들 아, 내가 STATIC_DIR 및 STATIC_ROOT에 대해 읽고 내가 부분적으로 모두 동의하고 또한 파일을 STATIC_ROOT에서 읽어야한다는 것을 이해합니다. Btw. 필수 파일'main.css'와'main.js'는 두 위치에 있습니다. 그래서 @Melvyn이 맞다고 생각합니다. 장고는 그 파일을 제공하는 방법을 모른다. 'STATIC_ROOT = os.path.join (BASE_DIR, 'static')'을 곧바로 시도 할 것입니다. – user2156115

관련 문제