본문 바로가기

컴퓨터 프로그래밍/Django

[Django] settings.py에서 media_url과 media_root 설정 및 ruls.py에서 import 구분하기

반응형

안녕하세요 시란입니다. 

 

이번 포스팅에서는 media root와 media url 사용법 과 urls.py에서 import 를 할때 같은 앱명을 구분할때 할 수 있는 팁을 알려드리겠습니다. 

 

먼저 media_root 와 media_url은 어떨때 사용할까요?

 

post요청을 통해서 이미지를 올렸을때 따로 settings.py 를 건들지 않는다면 이미지는 아래와 같이 나의 BASE_DIR에 저장될것이에요

 

보이시죠? 내 베이스디렉토리에 이렇게 업로드가 되버립니다. 

한두개 post를 통해 이미지들을 올릴때는 상관없겠지만 post 요청을 통해 이미지를 업로드하는 갯수가 많아질수록 

내 base directory는 더러워질꺼에요.

 

보통 우리는 컴퓨터를 쓸때 폴더를 지정하고 해당 폴더에 목적에 맞는 파일들을 모아두고 쓰곤 하죠?

마찬가지로 이미지를 한대 모아둘수 있으면 찾기도 편하고 정리도 깔끔하게 될 거에요. 

 

우리는 장고한테 이미지를 저장할때는 이 폴더에 저장해줘!라고 알려줘야합니다. 

이런 기본적인 세팅은 대부분 settings.py 에서 해결하게 되어있습니다. 

settings.py에 아래와 같이 써주시면 됩니다. 

이렇게 settings.py에 우리가 앞으로 사용할 정보에 대해서 적어놓고 필요한곳에 꺼내서 쓰시면 됩니다. 

MEDIA_ROOT = BASE_DIR / 'templates/jpg'
MEDIA_URL = 'templates/'

 

자 하나하나 설명드릴께요'

MEDIA_ROOT는 실제로 사용자가 올리는 이미지의 폴더 위치를 의미합니다. 

저의 경우는 BASE_DIR/templates/jpg라는 경로로 설정해줬습니다. 

 

BASE_DIR를 어디를 말할까요? 

이 위치 또한 django의 settings.py에 적혀있습니다.

위의 사진을 보시면

BASE_DIR에 대해서 써있죠? Path를 통해서 현재 폴더의 부모의 부모 폴더, 즉 내 프로젝트 폴더가 되겠네요.

그리고 주석처리로  BASE_DIR를 사용하는 방법에 대해서도 적혀있습니다. 

그 방법대로 똑같이 썼습니다. 

그래서  BASE_DIR/templates/jpg는 내 프로젝트의 폴더의  templates/jpg라는 경로가 되겠죠?

해당 경로에 새로운 폴더들을 설치해준다면 이제 해당 경로에 파일들이 저장되게 됩니다.

 

그리고 MEDIA_URL이 의미하는 것은 저장된 MEDIA_ROOT를 어떤 URL을 써서 매핑할껀지를 의미합니다. 

저는 template/라고 써줬습니다. 

그러면 127.0.0.1:8000/template/'이미지파일이름'

이라는 url로 제가 저장한 이미지 파일들을 찾을수 있게 됩니다. 

 

별로 어렵지 않죠? 

중요한게 빠졌네요. 

urls.py에 내가 이런 설정을 해줬다는걸 알려줘야합니다. 

from django.conf import settings
 
urlpatterns = [
path('',FeedListView.as_view(),name='feed'),
path('<int:pk>/', FeedListDetailView.as_view(), name='feed')
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)

자 위의 코드처럼 urlpatterns = [~~~] 에 추가로 static() 정보를 위에 처럼 주시면 됩니다. 

 

urls.py가 나온김에 import할때 발생할 수 있는 이슈거리도 정리해봅시다. 

from django.urls import include, path
from django.contrib import admin
from rest_framework import routers
from feed import urls
from app import urls
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.

urlpatterns = [
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('admin/', admin.site.urls),
path('feed/', include(urls)),
path('', include(urls)),
]

자 다음과 같은 코드가 있습니다. 

이 코드의 문제점은 무엇일까요?

아래 두 path를 살펴볼께요. 둘다 urls를 include하고 있죠. 

이렇게 작성한 의도는 'feed'라는 url을 주었을땐, feed의 urls을 참조하고, (127.0.0.1:8000/feed/)

''이라는 url을 썻을땐 app의 urls를 참조했으면 좋겠다는 내용이에요. (127.0.0.1:8000/)

 

하지만 의도와는 다르게 전부 urls는 마지막으로 선언한 app의 urls로 이어지게 되어있습니다. 

(너무 당연하죠?)

그러면 이걸 원래 원하는대로 하려면 어떻게 해야될까요?

 

from feed import urls as feed_urls
from app import urls as app_urls
 
 
urlpatterns = [
path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
path('admin/', admin.site.urls),
path('feed/', include(feed_urls)),
path('', include(app_urls)),
]

바로 이렇게 해결하면 됩니다. 

무엇이 바뀌었냐면 같은 urls를 import 하지만 as를 써서 변수명을 구분해주면 됩니다. 

생각보다 간단하죠?

근데 막상 해결하려고 할땐 생각이 잘 안나더라고요. 

 

제가 했던 고생을 안하셨으면 좋겠네요. 

그럼 여기까지 이번 포스팅을 마무리 하겠습니다. 

감사합니다. 

 

 

반응형