현재 우리가 만들어왔던 서비스를 생각해보자. 게시글을 생성, 조회, 수정, 삭제를 해왔다. 아주 기본적인 기능만 구현해 놓은 시점에서 한 가지 놀라운 사실을 하나 말하자면, 인스타그램이라는 서비스도 Django를 통해 만들었다고 한다. 놀랍기도 하고 열심히 더 배워보자는 동기부여가 될 수 있을 것이다. 하지만 말하고자 했던 부분은 img 파일은 user가 어떻게 생성하고 어떤 방식으로 조회가 이루어지는지가 궁금하지 않은가? 였으니 한 번 알아보러 가보자.
서버 측에서 변경되지 않고 고정적으로 제공되는 파일(img, js, css, etc)
이러한 정적 파일을 어떻게 저장하고 응답하는지보다 중요한 기초적인 사진을 다시 보도록 하자.
이젠 당연하기도 한 사진 같지만 Static files 또한 같은 원리로 요청과 응답의 과정을 피해갈 수는 없다는 사실이 중요하다. 이 말인 즉슨, 정적 파일을 제공하기 위한 경로(URL)이 존재해야한다. 정적 파일을 제공하는 방법은 크게 2가지로, 첫째 기본 경로에서 제공하는 것과 둘째 추가 경로에서 제공하는 방법이 있다. 이해에 도움이 되는 것은 base.html 을 상속 받을 때 그 파일의 위치나 주소를 생각하면 좋을 것이다.
app폴더/static/
을 기본적으로 자동으로 인식한다. 우리가 html 파일의 주소를 적을 때, app폴더/templates/ 를 자동으로 인식하는 것과 동일
-> app 폴더에 static 폴더를 만들어야겠네? -> 정답!
index.html을 보면 이미지 소스를 절대경로로 바로 들고 오지 않는다. 그리고 url 태그가 아닌 static 태그를 통해 주소로 가져오고 있다. 하지만 static 태그는 url 태그처럼 built-in 태그가 아니기 때문에 import 해줘야한다. 그 역할을 하는 것이 load 태그이다.
STATICFILES_DIRS에 문자열 값으로 추가 경로 설정
정적 파일의 기본 경로 외에 추가적인 경로 목록을 정의하는 리스트
위의 코드처럼 설정을 한다면 app폴더 안이 아닌 최상위 폴더에 static 폴더 안에 files를 담으면 된다. 그렇다면 상대주소는 더욱 간단해질수 있다. 이미지들을 어떻게 관리할 것인지는 관리자의 몫이 된다.
사용자가 웹에서 업로드하는 정적파일(User Upload File)
이미지 업로드에 사용되는 모델 필드
이미지 객체가 직접 저장되는 것이 아닌 '이미지 파일의 경로'가 문자열로 DB에 저장됨
미디어 파일을 제공하기 위해서는 많은 준비를 해야하는데 이걸 전부 외워야할까?
이해를 해야할까? 그렇지 않다. 필요한 경우 참고하여 설정하자. 여러 단계에 거쳐 천천히 진행해보자!
# settings.py
MEDIA_ROOT = BASE_DIR / 'media'
MEDIA_URL = 'media/'
미디어 파일에 대한 주소를 설정하는 과정으로 STATIC_URL과 동일한 역할을 한다.
ImageField를 사용하려면 반드시 Pillow 라이브러리가 필요하다.
이 속성을 추가하지 않으면 form 요소는 이미지 파일을 받을 수 없다.
여기까지가 이미지를 DB에 저장하는 형태이며, DB를 들여다보면 우리의 생각과 달리 img 필드는 경로가 적혀있음을 알 수 있다. 폴더 안에 이미지를 잘 받아지는 모습도 볼 수 있는데 어떻게 다시 html에 반환할 수 있는지도 알아보자. 이 과정은 3가지로 진행된다.
여기서 article.image.url 은 업로드 파일의 경로를 말하는 것이며, article.image는 업로드 파일의 파일 이름을 의미한다.
ImageField()에 blank=True로 설정했으므로 이미지가 있는 경우에만 반환해야하므로 조건문을 통해 제시하는 것이 바람직해 보인다.