파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.
static 파일이란? 개발 리소스로서의 정적인 파일들이다. (js, css, image)
project_root/app/static/app
경로에 저장
settings.STATICFILES_DIRS
에 지정된 경로에 둔다.
STATIC_URL : 정적 파일 요청이 오는 URL
STATIC_DIRS : 장고의 File System Loader에 의해 참조되는 디렉토리 설정이다. 이 경로에서 정적 파일을 찾는다.
STATIC_ROOT : python manage.py collectstatic
명령이 참조하는 설정이다.
collectstatic
명령은 여러 디렉토리로 나눠진 정적 파일들을 STATIC_ROOT에 설정된 경로의 디렉토리로 복사한다. (배포를 위한 설정)
추후 nginx 등의 서버에서 정적 파일을 서빙하기 위해 꼭 필요한 절차다.
아래와 같이 설정하기를 추천한다.
# project/askcompany/settings.py
# ...
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [
BASE_DIR / 'askcompany' / 'static',
]
/static/
주소를 통해 요청이 오면 정적 파일 디렉토리 목록으로부터 정적 파일을 서빙하게 된다.
정적 파일 디렉토리 목록은 어떻게 구성될까?
- 장고의 App Directories Finder에 의해 앱들의 정적 파일 경로들(
project_root/app/static
)이 정적 파일 디렉토리 목록에 추가된다.- 장고의 File System Finder에 의해
settings.STATICFILES_DIRS
설정한 디렉토리 목록을 정적 파일 디렉토리 목록에 추가된다.
템플릿 태그를 통해 정적 파일 주소를 유연하게 처리할 수 있다.
정적 주소를 하드코딩하면 추후 static_url이 CDN, Azure, AWS S3 등을 이용하기 위해 바뀌었을 때 모든 코드를 수정해야한다. 매우 번거로운 작업이다.
{% load static %}
: static 모듈을 임포트 한다.
{% static 'jquery-3.6.0.min222.js' %}
: jquery 정적 파일 주소를 동적으로 가져온다.
{% load static %}
...
<!DOCTYPE html>
<html lang="ko">
<head>
...
<link rel="stylesheet" href="{% static 'bootstrap-4.6.1-dist/css/bootstrap.css' %}">
<script src="{% static 'jquery-3.6.0.min222.js' %}"></script>
</head>
...
실 서비스 명령 전에는 python manage.py collectstatic
명령을 통해 여러 디렉토리에 나뉘어져있는 static 파일들을 복사해야 한다.
명령을 실행하자. 그리고 앞서 settings에 설정했던 바(STATIC_ROOT = BASE_DIR / 'staticfiles'
)와 같이 staticfiles 디렉토리가 생성됨을 확인해보자.
(askcompany) ➜ askcompany python manage.py collectstatic # collectstatic 명령 수행
161 static files copied to '/Users/jaesik/Projects/dev/askcompany/staticfiles'.
(askcompany) ➜ askcompany ls # 디렉토리 확인
Pipfile Untitled.ipynb accounts blog1 htmlcov instagram media templates
Pipfile.lock __pycache__ askcompany db.sqlite3 identifier.sqlite manage.py staticfiles
(askcompany) ➜ askcompany
여러 디렉토리에 나뉘어 저장된 static파일의 위치는 현재 장고 프로젝트만이 알고 있다.
collectstatic은 외부 웹서버가 Finder의 도움 없이도 static의 파일을 서빙하기 위한 작업이다.
정적인 컨텐츠는 외부 웹서버를 통해 처리하면 더 효율적인 처리가 가능하다.
정적 컨텐츠만의 최적화된 방법을 사용해보자.
1. memcache/redis 캐시
2. CDN(Content Delivery Network)
server {
# 중략
location /static {
autoindex off;
alias /var/www/staticfiles; # settings.STATIC_ROOT와 동일
}
location /media {
autoindex off;
alias /var/www/media; # settings.MEDIA_ROOT와 동일
}
}
python manage.py collectstatic --settings={{ 서비스용 settings }}
settings.STATIC_ROOT 경로로 복사된다. Storage설정에 따라 한 번에 클라우드 스토리지로의 복사를 수행하기도 한다.
django-storages
storage 관련 라이브러리로서 Amazon S3, Google Cloud Storage, FTP 등을 지원한다. Azure Storage의 경우 django-storages-azure가 있다.