django -- STATIC_URL , STATIC_ROOT , STATICFILES_DIR, Media file 정리 노트
이 포스팅에서
좀 더 자세히 공부하면 좋을 것 같아 따로 포스팅으로 공부!
여기서 보면 STATIC_URL , STATIC_ROOT 가 있는데 이 두 가지 기능이 정확히 무엇을 의미하는 것일까?
또 STATICFILES_DIR 는 무엇을 의미하는 것일까?
먼저 저 3개의 개념이 들어가기 전에,
우리는 정적 페이지와 동적페이지의 개념부터 알아보자!
정적인 페이지는 기존에 있던 것들을 활용해서 사용자 요청에 따라 미리 저장되어있는 것을 보여주는 역할!
동적인 페이지는 사용자에 따라 달라지는 페이지로, 사용자들이 요청을 보내면 그 것을 가공해 보내주는 것!
오늘은 장고에서 2가지, static 파일과 media 파일을 정리하는 노트.
먼저 우리가 CRUD 에서 써줬던 static을 들고와서 같이 준비해볼까유 ㅎㅁㅎ!
이렇게 static 폴더 안에 css 와 image 폴더를 분리해주고, image 폴더를 생성하고 내가 조아하는 보라색의 jpg 파일을 넣어주었다.
이미지는 폴더의 경로 안에 끌어와서 넣어줘도 되고, vs 코드에서 직접 끌어와 넣어줘도 된다! 나는 파일로 들어가서 끌어서 넣어주었음 .
이제 css 와 같은 static 파일과 image 등과 같은 media 파일의 차이점을 알아보자!
static
은 우리가 개발해준 자원 그대로 정적인 파일로, 프로젝트, 앱 단위로 저장하고 서빙이 가능하다!
css, javascript 등이 있고, 우리가 띄워준 로고 이미지 같은 것도 static에 포함된다.
개발자를 위한 파일인 것.
media
은 유저가 업로드한 값의 파일들로, 프로젝트 단위로 저장하고 서빙이 가능.
유저가 업로드한 jpg , pdf 같은 것들이 포함된다.
사용자들을 위한 파일.
먼저 static을 알아보자!
static을 장고에서 적용하는 방법은, 위 링크인 CRUD_1 포스팅 을 보면 나와있으니
오늘은 맨 처음 사진으로 돌아가서, settings.py 에 있는 STATIC_URL , STATIC_ROOT, 추가로 STATIC_DIR 을 알아볼까?
STATIC_URL
은 우리가 정적파일들을 참조하기 위한 최상위 url 경로 단위이다. 말그대로 이 경로 자체는 그냥 요청되는 url 경로의 이름, 단위 정도라고 생각하면 될 것 같다. url은 문자열로 써줘야하며 반드시 / 를 끝에 붙이고 써줘야한다.
STATIC_ROOT
은 우리가 파일들을 담아주는 장소라고 생각하면 된다. 우리가 코드를 치는 개발 단계에서는 static의 경로를 알아서 runserver를 통해 모아주지만, 실제 배포 단계에서는 python manage.py collectstatic 이라는 명령어를 통해 한 프로젝트 안에 있는 앱 각각으로 흩어진 static 파일들을 이 곳으로 다 모아주거라라고 실행하게 되는데, 이 때의 절대 경로가 바로 ROOT. ' ' 요롷게 문자열로 쓴다!
BASE_DIR, ‘static’ 이 부분은 우리가 프로젝트 밑( BASE_DIR ) 의 static라는 파일로 스태틱 다 모여! 이런 느낌.
static은 앱 단위로도 써줄 수 있으니, 앱 안에 위치한 root static 이 있다면 다른 앱별로 흩어져있는 static 파일을 다 이 곳으로 모아줄 수 있다.
개발할 때는 http://127.0.0.1:8000/ 라는 우리가 만들어준 가상환경, 로컬 컴퓨터 안의 장고 로컬 서버에서 돌리기 때문에 굳이 ROOT를 안 써주어도 문제가 없지만, 실제로 웹 서버 배포에서 정적파일을 제공해주기 위해서는 ROOT 경로로 collectstatic이라는 명령어를 통해 static 파일 다 모여라 ! 라고 해주어야한다.
정리하자면, static이라는 이름은 URl 요청이고, collectstatic을 통해 이렇게 static 파일들을 모아주고 담아주는 장소가 ROOT인 셈!
STATIC_DIR
은 당장에 필요한 것은 아니지만, 우리가 앱이 아닌 프로젝트에 css 라는 파일을 만들어 주거나, 바탕화면, 외부 등등... 여러 곳에서 만든, 혹은 가져오는 정적 파일들이 있을 경우 그 경로를 써주는 실행문이다. 그래서 나중에 배포 때 여기도 static 있어요!!!! File Finder 기능!!! 이것도 찾아가주세요!!!! 하는 느낌이랄까..ㅎ
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'basicstatic') ,
)
대신 이 DIR은 리스트나 튜플로 담아 보내줘야한다는 거다. 그리고 꼭 맨 뒤 쉼표 잊지말자!!!
흐어 이제 media file 로 ㄱㄱ
미디어를 사용해주기 위해서는 먼저 미디어파일을 담아줄 필드를 설정해주어야겠지. 담아줄 곳을 설정해주는 곳은 !!! models 이지. 모델로갑씨다
저번에 썼던 코드 중 새로운 것이 추가가 되었다!
모델스에 있는 이미지 필드를 사용해줄 건데, 이상한게 있다. null, blank 라는 아이 ..
null
말그대로 '없는' 값. 즉 없는 값을 허용해준다는 건데, blank 와 다른 것은 null 은 필드에 아무것도 안써줘도 된다고 허용해주는 것이다! 즉, 데이터 베이스에 안담겨도 된다는 말씀 ! 디폴트 값은 False 라서 True 라고 써주었다.
blank
그럼 이 개념은..? 이 것도 뜻은 '빈칸' 인데 뭐가 다른거지..?
이 개념은 폼에서 html input tag에 빈 폼을 입력하는 것을 방지하고자 기본 옵션이 필수로 입력되야 한다고 정해져있다. 그래서 우리는 이 경우를 비워도 된다고 정의해줄 때 바로 blank를 쓰게 되는데, 이 경우, 데이터베이스에는 "" 빈 문자열이 담기게 된다. 요고는 admin 계정이나, 내가 직접 정의해준 폼에도 쓸 수 있다. 마찬가지로 디폴트 값은 False!
이 둘을 같이 써줄 수 있다.
null = True, blank = True - 어떤 조건으로도 비워둘 수 있다.
null = True, blank - False - DB ( 데이터 베이스 ) 에는 null 값( 없는 값 ) 을 가지지만, 폼에서 입력을 받을 때 필수로 입력을 받아 야한다.
나는 여기서 폼에 이미지를 첨부할 때, 어떠한 조건으로도 비워둘 수 있는 코드로 저 둘을 추가했다!
예외 1
위에서 써준 Charfield , Textfield 처럼 문자열 기반 필드에서는 null 의 값이 빈 문자열, None으로 없는 개념이 두 개가 충돌하여 null 값을 가지지 않는다.
만약,
TextField = ( null = True, blank = True )
이렇게 정의해준다면, 빈 값을 해당 필드에 넣어주게 되면, null 은 작동하지 않고, 즉 null 값을 가지지 않고 ""라는 빈 문자열을 저장하게 된다.
그래서 문자열 기반 필드에는 null 을 쓰지말고, blank = True로 줘야 한다.
예외 2
불리언필드(BooleanField)) 에서 null 값을 주려면 널 불리언 필드(NullBooleanField) 를 통해 사용해야 한다.
자자 null 값도 정리해주었으니 다시 모델로 ㄱㄱ
모델을 저장해주자!
오잉잉 에러라니... 에러 코드를 읽어볼까..
ㅇㅎ Pillow 라는 것을 설치해주지 않았다. 우리가 이미지필드를 쓰려면 장고에서 Pillow라는 것을 깔아주어야 한다.
pip install pillow 로 깔아주는 중..
또!! 우리가 모델을 추가해주거나 수정해주면 뭐다!?!??!?
python manage.py makemigration 과 python manage.py migrate 를 해주어야 한다!
자자 이제 폼으로 넘어가자.
모델폼의 필드에도 myimage를 추가해주었따.
자 이제 우리가 글을 생성해주는 create.html 에다가
이렇게 만들었던 폼 태그를,
이렇게 enctype 이라는 옵션으로 입력받은 데이터 (첨부 파일) 가 폼을 통해 잘 넘어가도록 되도록 입력해주었다.
자 이제 파일도 같이 넘겨주게 기능을 작성하는 views.py 로가서
요청받은 파일도 같이 넣어주어 우리가 첨부한 이미지 파일이 모델에 잘 저장되도록 하자!
테스트 테스트 !
쟌쟌쟌 이렇게 이미지를 첨부할 수 있는 버튼이 뜨고,
오잉잉 안보이지만 ? 이건 아직 우리가 미디어 파일을 보여주지 않아서 그렇지
admin 으로 들어가서 모델에서 이미지를 넣은 3번째 오브젝트를 보게 되면,
요롷게 모델에 잘 들어가 있다.
이제 static 처럼 media도 url과 root를 붙여서 우리가 media 파일들을 관리할 수 있게 해주자.
또또.. 나왔지만, static이랑 개념은 비슷하다.
다만 MEDIA_ROOT 의 경우 외부 등등에서 우리가 첨부해준 이미지들을 static 과 같이 (BASE_DIR, ' media' ) 를 써줘서
프로젝트 밑에 media 폴더에 다 모여 ~ 가 된다. 확인해보자.
요롷게 프로젝트 밑에 media 폴더가 생성이 되며, jpg들이 짠짠하고 모이는 것을 볼 수 있다.
자 이제 이미지를 우리가 페이지에서 보일 수 있게 url 로 간다!
이 옵션은 , settings.py 에 저장해준 MEDIA_URL, MEDIA_ROOT 를 써서 유저가 MEDIA_URL (/'media'/ ) 요청을 하면, MEDIA_ROOT 에 있는 미디어 파일들을 찾아서 유저에게 응답을 해준다.
요 옵션을 위해서는 이렇게 settings 와 static 을 불러와 준다!
으아 마지막으로 html 상에서 띄워주면 끝!!!!!
index.html 로 가서!!!!!!적어주자. 요롷게 밑에 if 문이랑 같이 3줄 추가!
왜 if 적어주냐 ? 우리가 이미지필드는 모델에 뒤늦게 만들어줬기 때무네 모델을 수정하기 전 생성하였던, 게시물에는 적용이 되지 않을 수도 있어서, 미디어 파일이 있으면 파일을 띄워줘라라고 정확하게 적어주었다!
자 이제 잘 되는지 볼까.
저번에 적어줬던 2번 게시물... 안된다. 게다가 새로 생성해서 이미지를 만들어버리면,
.......어마어마하게 원본 사이즈로 들어간다 하나 하나 해결 해보자.
먼저 if문을 해줬음에도 수정을 했을 때 이미지가 안들어가는 것은?
>>> 수정했을때 파일 ( request.FILES ) 을 안불러와줘서 그렇다..^^
이렇게 수정하는 함수인 update에 request.FILES 을 추가해준다.
혹시 정말 만약 나같이 아무것도 모르는 사람을 위해서,
단순히 추가해준다고 request.FILES 을 뒤에다가 추가해주면,
positional argument follows keyword argument - 위치 인수는 키워드 인수 뒤에옵니다.
라는 에러가 뜬다..^^ 그러니 키워드 인수인 request.FILES는 꼭 위치 인수 앞에 써주자..
그렇게 수정하면,
이렇게 수정도 잘되고,
미디어 파일도 잘 들어가 있다. 같은 이미지더라도 자동으로 사용자의 요청에 따라 다르게 잘 들어간다!
자 다음은 크기.. 크기는 모델이나, pillow 에서 주는 방법이 있지만.. 오늘은 그냥 간단하게 css 를 통해 살짝만 만지자.
이렇게 게시물 자체의 높이를 살짝 크게 만들고 이미지도 작게 만들어주면,
짝짞짜까짜ㅏ짜짝.. 그래도 이렇게 css 를 통해 한번 만져보았다 ㅎㅁㅎ
오늘 포스팅 끝!
오늘은 간단할 줄 알았지만 역시 쉬운건 하나도 없고 난 끝없이 멍청하기 때문에.. 오늘도 길어졌지만 이 긴 포스팅 여기서 마무리!
'django' 카테고리의 다른 글
2020.09.02_django_template 상속 (0) | 2020.09.03 |
---|---|
2020.09.01_django_makemigrations,migrate (2) | 2020.09.02 |
2020.08.31_django_ sign_up, login, logout (0) | 2020.09.01 |
2020.08.23_django_CRUD_2 (0) | 2020.08.24 |
2020.08.20 django_CRUD_1 (3) | 2020.08.21 |
댓글