2018-06-22 TIL(MEDIA URL설정하기, 세션)

MEDIA URL, MEDIA ROOT설정하기

ImageField를 통해서 사진을 업로드하고 실행해보면 뜨지않는다.

uploat_to 옵션에 설정한대로 파일은 저장이 되지만 제대로된 img의 url을 찾지 못해서 파일을 띄우지 못하는 것이다.(참고로 img를 저장하는 것이 아니라 경로만 str으로 저장한다)

admin 페이지에서 사진 링크에 마우스를 갖다대면 localhost:8000/admin/posts/post/1/change/post/picture.png 같은 식의 링크가 화면 아래 보여질 것이다. 이는 MEDIA_URL 설정이 되지 않아서 현재 페이지를 기준으로 url이 출력된 것이다.

따라서 MEDIA_URL을 설정하여 사용자가 업로드한 파일을 어디를 기준으로 오게할 것인가를 알려줘야한다.

settings.py에 다음과 같이 설정한다.

...
# MEDIA 루트를 설정
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
...
# User-uploded file을 접근할 URL 접두어
MEDIA_URL = '/media/'

admin페이지에서 사진 링크를 클릭해보면 url이 다음과 같이 바뀐 것을 알 수 있다.

localhost:8000/media/post/picture.png

하지만 여전히 사진은 뜨지 않는다. 왜냐하면 해당 url은 urls.py에서 파싱할 수 없는 url이기 때문이다. 따라서 urls.py에 다음과 같이 작성해야한다.

urlpatterns = [
	path('media/', media경로를 통해  request를 처리할  있는 특정view),
]

하지만 너무 귀찮다. 장고는 이를 한번에 해주는 방법이 있다.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 당신이 작성한 urlconfig들
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

urls.py 맨 아래 static()을 이용한 파싱 함수?를 urlpatterns를 추가해주면 된다. static()는 리스트를 반환한다.

요약

  • MEDIA_ROOT는 실제 파일이 업로드되는 기준 경로
  • MEDIA_URL은 사용자가 업로드한 파일을 제공할 URL
  • config.urls에 추가한 static()은 MEDIA_URL로의 requeset에 대해 MEDIA_ROOT에서 찾은 파일을 response로 돌려줌

세션과 쿠키

HTTP요청은 불연속적이다. HTTP로 우리가 어떤 데이터를 보낸다고 가정할 때 수 십, 수 백번을 보내도 같은 IP에서의 요청일 뿐이지 그 주체가 우리인 것을 알 수가 없다. 클라이언트 입장에서는 사용자의 정보를 계속 보내야하고 서버 입장에서는 어떤 사용자가 데이터를 보냈는지 파악해야한다.

HTTP요청을 연속적으로 만들기 위해서 그러니까 매번 요청을 위해서 매번 사용자 파악을 할 필요가 없도록 세션이라는 기법을 사용한다.

장고에서는 사용자 계정, 그룹 및 쿠키 기반 사용자 세션을 처리한다.

여기서 쿠키란 HTTP규격중에 하나로 사용자가 웹사이트에 방문했을 때 그 사이트가 사용하고 있는 서버를 통해 인터넷 사용자의 컴퓨터에 설치되는 작은 기록 정보 파일이다.

서버쪽에서 HTTP Response를 돌려주는데 그 과정에서 HTTP 메시지에 쿠키를 담으라고 명령을 보낼 수 있다. 다음 요청을 보낼 때 쿠키를 통해 사용자의 정보를 서버쪽에서 알 수 있도록 할 수 있다.

브라우저 -> 
로그인요청 -> 
서버 -> 
authentication(인증) -> 
성공시 사용자에 해당하는 "특정 값"을 DB에 저장 -> 
"특정 값"을 HTTP response에 set-cookie헤더로 담아 전송 -> 
브라우저는 response를 받고, set-cookie헤더에 담긴 내용을 쿠키 저장 공간에 저장(세션 값 저장) -> 
브라우저 -> 
서버로 가는 모든 요청에 쿠키 저장 공간에 있는 "특정 값"을 함께 보냄 -> 
서버는 받은 request에 "특정 값"이 있는지 검사하고 매칭이 되면 같은 유저가 요청을 보냈다고 간주함.

이 과정이 장고에서 admin페이지를 만들었을 때 아무 세팅없이도 로그인 유지가 되는 설정이 암시적으로 되어있다.

Comments