MEDIA_ROOT, MEDIA_URL

Error Coder·2022년 12월 18일
0

MEDIA_ROOT, MEDIA_URL

  • media 파일 다루기

장고에서 미디어 파일을 다루려면, settings.py 에 추가적으로 파라미터를 설정해줘야 한다.

class User(AbstractUser):
    """ Custom User Model """

    
    avatar = models.ImageField(upload_to="avatar", blank=True)

일단 models.py에서 ImageField 로 설정을 해준 뒤에 admin 패널에서 파일을 추가하면,

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemlAKx%2FbtqA1znhZBs%2FIBn7QKAMRRik2DVgnXkP80%2Fimg.png

그런데, 지금은 경로가 avatar 폴더 안에 있지만,

이건 설정을 해주었기 때문이고, 설정을 해주지 않게 되면, 가장 상위 폴더에 지저분하게 사진들이 업로드된다.

이 부분을 막고, 추가적으로 저 사진 경로를 클릭했을 때, 사진을 볼 수 있도록 만들어보자.

  • Media_root, Media_url
# 미디어 파일의 경로 설정
MEDIA_ROOT = os.path.join(BASE_DIR, "uploads")

# 앞에 /를 더하면 절대 경로로 바뀐다.
# 127.0.0.1:8000/media/room_photos/1.jpg
# 만약 /를 안 붙이면, 내가 이 파일에 접속할 때 상대경로로 URL이 생성된다. -> 지저분해진다.
# 127.0.0.1:8000/admin/rooms/photo/1/change/media/room_photos/1.jpg
# 이 URL로 접속하면, 위의 미디어 파일의 경로로 들어가도록 하는 것이다.
MEDIA_URL = "/media/"

위는, 미디어 파일이 들어올 때, 어떤 폴더에 저장할지 결정하는 부분이다.

밑은, 그 경로의 url을 정해주는 것이다. 정리하는 것이라 보면 된다.

이 작업을 하고나서 위의 사진 경로를 웹상에서 클릭하면,

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1Ijx%2FbtqA5PvrXx6%2F4y1Yf0mYoE9DVtd2CZxk1K%2Fimg.png

media url 변경 전

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWCUFX%2FbtqA05fN7u8%2Fb7i0wxBETxRKNDxN592XK1%2Fimg.png

media url 변경 후

요청된 url이 변경된 것을 알 수 있다.

  • Debug Mode

장고를 기본적으로 시작하면 debug = True라고 되어있다.

이는 장고가 에러가 났을 때 개발자를 위해 에러 페이지를 띄워주는 것을 말한다.

개발 모드에서는 적극 사용하지만, 프로덕션 레벨에서는 이 기능을 꺼주어야 한다.

이 부분을 언급하는 이유는, media 파일은 서버에 올리지 않고 다른 방법으로 사용할 것이기 때문이다.

  • URL Setting

다시 돌아와서, 변경된 url로 요청했을 때 사진을 보내주면된다.

url에 대해 setting하기 위해서는 urls.py에 들어가야 한다.

그런데 이 부분에서는 지금 환경이 개발 모드이냐 아니냐에 따라서 작동하는  방식이  다르다.

따라서 우리는 이 부분을 확인할 수 있도록 settings.py를 import 해서 알아내는 방법을 사용하고자 한다.

from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path("admin/", admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

이 작업을 할 때 우리는 static이라는 것을 가져와서 사용할 것인데,

정적 파일들의 url을 관리하는 함수이다. 접근한 url을 리턴하는 함수이다.

이 함수에 파라미터는 기본적으로 어떤 url로 접근할 것인지,

그리고 그곳으로 접근했을 때, media 파일의 경로는 어디인지를 넣어준다.

그럴 경우, 자동으로 접속한 url에 대한 파일을 가져와 보여줄 것이다.

Permission_classes

Authentication이 로그인 여부 인증이라면

Permission은 Authorization, 즉 로그인한 사용자가 어디까지 서비스를 이용할 수 있는지에 대한 권한이다.

클래스 속성 또는 데코레이터를 통해 새 권한 클래스를 설정하면 settings.py 파일에 설정된 기본 목록을 무시하도록 뷰에 지시하는 것

기존 코드는 이렇게,  테스트를 원활하게 진행하기 위해 AllowAny로 설정했었다.

from rest_framework.decorators import permission_classes
from rest_framework.permissions import AllowAny

회원가입할때는 permission 을 AllowAny로 설정해주어야 한다.

왜냐하면 회원가입 한다는 것은 미로그인 상태라는 것이기 때문에 미로그인상태에서도 접근이 가능해야 하기 때문이다.

그외에도 프로젝트의 메인페이지에 나오는 모든 영화 read기능, 영화 검색기능은 로그인 없이도 가능하게 설정한다.

표로 나누어보았다.

로그인 필요x로그인 필요
@permission_classes([AllowAny])@permission_classes([IsAuthenticated])
회원가입, 로그인, 메인페이지 영화 출력, 영화 상세정보, 영화 검색프로필 마이페이지, 영화 추천, 영화 북마크, 리뷰 리스트 가져오기 및 작성 -> 가져오기만 어떻게 분리하지?특정 영화의 리뷰 보기 수정 및 삭제 -> 보기만 어떻게 분리하지?

문제는 REST_API 형식으로 if문으로 GET과 POST 방식을 나누고 하나로 구현한 view함수를 어떻게 처리할지였다.

리뷰 리스트 보기와 특정 영화의 리뷰 보기는 읽기 기능이라 로그인 안해도 볼 수 있도록 하고싶은데, 수정삭제와 view함수가 묶여있어서 어떻게 처리해야할지 난감했다.

  • 공식문서

https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv2wcy%2Fbtrn14yx7a7%2FFX9nYOPDrZnkRyVicvhzZK%2Fimg.png

이걸 사용하면 GET은 read_only로, 그 외 CREATE, PUT, DELETE는 로그인 승인이 필요한 상태로 view함수를 데코레이팅 할 수 있을 것 같다!!

변경된 표

로그인 필요 xGET만 허용로그인 필요
@permission_classes([AllowAny])@permission_classes([IsAuthenticatedOrReadOnly])@permission_classes([IsAuthenticated])
회원가입, 로그인, 메인페이지 영화 출력, 영화 상세정보, 영화 검색프로필 마이페이지, 리뷰리스트 보기, 특정 영화의 리뷰 보기, 팔로우 기능영화 추천, 영화 북마크, 리뷰 작성, 수정 및 삭제
  • 출처 :

https://ninefloor-design.tistory.com/312

https://egg-money.tistory.com/222

profile
개발자 지망생

0개의 댓글