일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- pandas
- wetube
- flask
- NeXT
- TypeScript
- S3
- RDS
- dict
- 튜플
- Class
- socket io
- 채팅
- react
- MongoDB
- SSA
- lambda
- EC2
- git
- Props
- docker
- node
- async
- AWS
- crud
- merge
- Vue
- 파이썬
- 카톡
- 중급파이썬
- SAA
- Today
- Total
초보 개발자
photo model 본문
포토 모델에 파일을 업로드하면 지금은 서버에 바로 업로드가 되고
admin페이지에서 이걸 클릭하면 찾을 수 없다고 나온다.
그 이유는 photos는 아직 URL이 없기 때문이다.
settings에 가서 MEDIA_ROOT옵션을 통해서 장고에게 어디다 우리가 업로드한 파일을 써야할 지 말해주는 것이다. 이건 절대 경로를 주어야 한다.
그리고 다시 업로드를 시켜보면 uploads안에 저장이 되어있는 것을 확인할 수 있다.
일단 다시 돌아와서
다음과 같이 upload_to를 지정해주었다. makemigrations와 migrate를 해준 뒤 다시 업로드해주면,
우리가 지정해준 경로로 잘 저장이 된 것을 확인할 수 있다. 아까는 media_root가 base_dir로 되어있었고 upload_to에 값이 없어서 최상단 폴더에 생겼던 것 같다.
또한 경로또한 이렇게 잘 바뀐 것도 확인할 수가 있다.
다만 admin에서 아래의 파일을 눌러도 아까와 같은 오류는 지속된다. 이를 해결하기 위해
MEDIA_URL을 사용해보려고 한다. MEDIA_URL을 uploads와 연결하여.
MEDA_URL = "media/"라고 한다면 이제 uploads는 media로 접근할 수 있는 것이다.
따라서 media/avatars, media/room_photos 이런식으로 접근하게 되는 것이다.
현재 바꾸기 전의 파일의 링크는
http://localhost:8000/admin/rooms/photo/6/change/room_photos/maniac.jpg 이다.
settings에 이걸 추가하고
다시 복사해보면
http://localhost:8000/admin/rooms/photo/6/change/media/room_photos/maniac.jpg 이 나온다. 다시돌아가서
media 앞에 admin/rooms/photo/6/change/ 이걸 지워주고 싶기에 절대 경로로 만들어 주자. /를 추가하면된다.
정리해보자면
MEDIA_ROOT = os.path.join(BASE_DIR, "uploads")
위 코드를 추가해주어서, 기본적으로 우리가 파일을 올리면 uploads안에 저장이 된다.
avatar = models.ImageField(upload_to="avatars", blank=True)
그리고 모델에 upload_to를 주어서 파일이 업로드되면 어떤 폴더에 저장될 지를 저장해주었다. (uploads/avatars)
따라서 파일을 업로드시 uploads/avatars/xxx.jpeg에 저장이된다.
하지만 'admin'에서 업로드된 파일의 이름은 avatar/xxx.jpg라고 인식이 된다. uploads/avatars/xxx.jpeg이 아니다. 단지 upload_to의 이름까지만 반영하는 것 같다.
MEDIA_URL을 설정해주어야 하는데 default 값이 "./"으로 설정되어있는 것 같다. 업로드된 파일을 클릭하였을 때 아래와 같은 주소로 나온다.
http://localhost:8000/admin/rooms/photo/6/change/room_photos/xxx.jpg
MEDIA_URL을 "taehyeki/라고 바꿔주면 아래와 같이 변화가 생긴다.
http://localhost:8000/admin/rooms/photo/6/change/taehyeki/room_photos/xxx.jpg
MEDIA_URL을 절대 경로로 "/taehyeki/라고 바꿔주면 아래와 같이 변화가 생긴다.
http://localhost:8000/taehyeki/room_photos/xxx.jpg
하지만 현재 상태에, 문제점이 있다. 애초에 우리는 서버의 업로드된 폴더를 uploads라고 저장해주었기 때문에 taehyeki라는 폴더는 존재하지 않는다. 따라서 값을 찾아올 수가 없다.
그래서 /taehyeki/라는 url로 접근하면 그걸 uploads로 바꿔줘야 하는 것 같다.
from django.conf import settings
from django.conf.urls.static import static
#settings를 사용하려면 이렇게 사용해야함. 장고가 그렇게 하라고 했기때문
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
첫 번째 인자에, 접속 url 두 번째 인자에 실제 경로을 적는 것 같다. 이렇게 해주면 접속 url을 실제 url로 인식시켜주는 기능같다. -> ~~~/media/로 들어왔다면 그 부분을 ~~~~/uploads/로 바꿔준다. 그리고 static함수를 사용해 static화 시켜준거 같다. 안의 파일을 읽을 수 있게
누군가가 media폴더에 접근하면 uploads폴더 안으로 들어가길 원한다. 즉 media로 접근하는 url과 내 컴퓨터 안의(uploads) 폴더와 연결하고 싶다. url과 디렉토리 이름은 달라도 상관없다. media_url은 uploads폴더 안의 파일들을 다룬다.
admin패널에 썸네일 추가하기
admin에서 썸네일을 보여주기위해서 html태그를 return 하였다. 하지만 장고는 script를 막 실행시키지 않는다. 보안의 위협이 있기 때문이다. 따라서 mark_safr라는 것을 통해서 이 것은 안전하다 라는 시그널을 보내줘야한다. 이를 사용해서 서 위와 같이 사용해주면
이렇게 썸네일이잘 표현된 것을 확인할 수 있다.
mark_safe
django는 기본적으로 autoescape가 on으로 활성화되어 있다. autoescape란 .html 파일이 아닌 외부로부터의 코드를 모드 escape화 시키는 것을 말한다. 그래서 <img> 태그를 사용해도 이미지가 display 되지 않고 <img> 글자가 display 된다.
Django가 이러한 설정을 default로 한 이유는 보안 때문이다. 의심하지 않고 어떠한 입력 값이든 받아들이면 XSS 공격에 취약하기 때문이다. 그래서 안전한다고 생각하는 입력 값만 태그로 받아들여야 한다. 이 때 사용하는 것이 mark_safe()다. mark_safe로 감싸진 code는 안전하니 escaped 하지 않아도 된다는 뜻이다.
'Python > airbnb 클론' 카테고리의 다른 글
django-seed (0) | 2022.02.04 |
---|---|
raw_ids ,inline Admin, save() (0) | 2022.01.26 |
queryset , manytomany (0) | 2022.01.25 |
Room admin, query_set 1 (0) | 2022.01.24 |
(Review, Reservation , List, Conservation) model and admin (0) | 2022.01.24 |