티스토리 뷰

장고에서 사용자가 업로드하는 파일을 media file 이라고 합니다.

media 파일을 사용하기 위해서는 저번 글의 static에 대한 설정과 동일한 과정을 media에도 적용해줘야 합니다.

 

이번 글에서는 이미지 파일을 업로드하여 서버에 저장하는 페이지를 만들며 media 파일에 필요한 내용들에 대해 알아보겠습니다.

 

 

media 경로 추가

settings.py의 아래에 다음 경로를 입력해줍니다.

 

앱 디렉터리 밑의 urls.py에 아래 코드를 추가해줍니다.

 

아파치 conf 파일에 media 경로의 접근 권한을 허용해주기 위해 아래 빨간 박스에 해당하는 부분을 추가해줍니다.

 

 

모델 생성

파일을 업로드하기 위해서는 모델을 생성해줘야 합니다.

장고에서는 파일뿐만아니라 text, integer, datetime 등의 데이터 타입도 모델의 필드로 지정할 수 있습니다.

아래 models.py 코드의 Filefield에 upload_to 라는 옵션으로 경로를 지정해줄 수 있습니다. 여기서 경로는 위에서 설정한 media 경로를 기준으로 합니다.

여기서는 FileFiled를 사용했지만 ImageField도 사용할 수 있습니다.

ImageField를 사용하려면 pillow라는 패키지를 설치해주기 위해 pip install pillow로 설치해줍니다.

 

아래의 두 명령어를 통해 모델에 대한 마이그레이션을 해줍니다.

 

폼 생성

생성한 모델을 html 페이지에서 입력할 수 있도록 폼을 생성해줍니다.

 

뷰 & 템플릿 생성

파일 업로드 페이지를 구현하기 위해 list.html과 upload.html을 만들었습니다.

각 파일을 생성하고 코드를 아래와 같이 작성해줍니다.

index.html에는 아래 빨간 박스를 추가해줍니다.

 

upload.html의 첫 번째 라인은 index.html의 모든 코드를 그대로 가져와줍니다.

지금의 index.html에는 h1태그 하나만 출력해주지만 실제 프로젝트에서 모든 페이지에 동일하게 적용할 기본 틀을 만들어서 사용할 수 있습니다.

아래의 content 블럭이 위 index.html의 빨간 박스에 해당합니다.

 

list.html은 성공적으로 업로드가 되었을 때 표시되는 페이지입니다.

각 페이지의 경로를 추가하기 위해 앱 디렉터리 밑의 urls.py에 아래 path를 추가해 줍니다.

views.py의 아래 image_list, upload_image 함수를 추가해 줍니다.

upload_image 함수같은 경우 POST 요청으로 받은 업로드 파일이 유효하면 해당 파일을 media 경로에 저장하고 image_list로 redirect 해줍니다.

 

이제 업로드에 필요한 모든 기능을 구현했습니다. 아파치를 재시작해서 내용을 확인해봅시다.

 

주소:포트/upload/ 로 접속하면 아래와 같은 페이지를 확인할 수 있습니다.

index.html에서 출력했던 h1태그 글자 밑에 upload.html에서 작성한 h2태그 글자와 업로드 폼이 있습니다.

 

 

업로드할 파일을 선택하고 Title에 글자를 입력해서 Upload image 버튼을 눌러보니 다음과 같은 에러가 뜹니다.

아래 에러메시지를 따라가보면 가장 밑에서 해당 디렉터리를 생성하는데서 권한 에러가 발생했습니다.

로컬에서 시도해보아도 동일한 에러가 발생합니다.

 

장고에서는 media 경로를 제대로 추가해줬으면 업로드한 파일이 해당 경로에 저장되어야하고 경로의 디렉터리가 존재하지 않으면 자동으로 생성해줍니다.

현재 media 경로의 media 디렉터리가 존재하지 않기 때문에 해당 디렉터리를 만드는 과정에서 에러가 발생해 media 디렉터리를 직접 생성도 해보았지만 이번에는 파일을 쓰는 과정에서 동일한 권한 에러가 발생했습니다.

 

해당 에러를 해결하려면 프로젝트 아래 모든 디렉터리, 파일에 대한 권한을 변경해줘야 합니다.

sudo chmod -R 777 "프로젝트경로"

권한을 777로 변경해주면 보안상의 이슈가 생길 수도 있을 것 같아 다른 방법을 찾아봤지만 해당 방법 이외에는 아무리 찾아도 없었습니다... 다른 방법을 찾으시면 꼭 댓글로 알려주세요ㅜㅜ

 

 

권한을 변경해주고 아파치를 재시작하여 다시 업로드를 시도해보면 아래와 같이 list 경로로 이동하여 list.html이 표시된 것이 확인됩니다.

서버에는 media 디렉터리가 생성되어 업로드한 파일이 성공적으로 저장된 것을 확인할 수 있습니다.

'Programming > Django' 카테고리의 다른 글

Django Apache 배포환경에서 static 파일 관리하기  (0) 2020.01.17
Django app, templates 생성  (1) 2020.01.17
Django, Apache 연동하기  (0) 2020.01.16
우분투에 Django 설치  (0) 2020.01.16