전체 메세지
Page not found (404)
Directory indexes are not allowed here.
Request Method: GET
Request URL: <http://127.0.0.1:8000/admin>
Raised by: django.views.static.serve
Using the URLconf defined in M_shopping_mall.urls, Django tried these URL patterns, in this order:
admin/
user/
product/
^(?P<path>.*)$
The current path, admin, matched the last one.
You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
배경
- 필자는 Django에 image를 업로드 하기 위해 settings.py 에 해당 code를 추가한 상태다.
# settings.py
# image를 저장하면 'media' 폴더가 생성되고 해당 image는 'media'에 저장된다.
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- 필자는 Django에서 기본적으로 제공하는 sqlite3 를 사용하다. MySql 로 DB 를 변경하였다. 따라서 새로운 DB 를 만들어 python manage.py createsuperuser 를 통해 새로운 admin을 만드는 과정에서 해당 오류가 발생했다.
- 이 문제를 해결하기 위해서는 django.views.static.serve 뷰 함수는 DEBUG=True일 경우에만 동작한다는 것을 알아야 한다. 이 함수는 Django 애플리케이션에서 정적 파일을 서빙하는 데 사용되며, DEBUG=True일 때만 사용할 수 있도록 설계되었다.
- 개발 중에만 DEBUG=True 를 사용하고 배포 환경에서는 보안상의 이유로 사용하지 않습니다. 배포 환경에서는 Nginx 와 같은 webserver 혹은 Gunicorn 과 같은 WAS를 사용해야 합니다.
에러 메세지 분석
- Raised by: django.views.static.serve
- django.views.static.serve의 뷰 함수에서 문제가 발생하고 있다.
- Directory indexes are not allowed here.
- Directory를 인식하지 못한다. (’필자는 media_root에 admin Directory를 만들었다. 하지만 django.views.static.serve의 뷰 함수는 해당 디렉토리를 인식하지 못하는 상태인 것이다.’)
- You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
- 해당 메세지를 보면 Django에서 해결 방안을 알려준다. Django settings file에 DEBUG = True 이기 때문에 문제가 발생한다고 한다. 하지만 DEBUG = Fals 로 바꾸면 404 error가 발생한다고 한다.
문제가 발생하는 이유
메세지에서 알 수 있든 해당 error은 django.views.static.server 뷰 함수에서 발생한다. DEBUG = True일 경우, Django는 정적 파일을(’image’ 등) 제공하기 위해 django.views.static.serve뷰 함수를 사용합니다.
해결 방법
해결을 위해서는 2가지 방법을 사용할 수 있다.
1. settings.py 파일에서 DEBUG = True를 False로 변경한다.
settings.py 파일에서 DEBUG = True를 False로 변경하여 프로덕션 모드로 전환한 후,웹 서버를 재시작합니다. DEBUG = True를 False로 변경하면 ALLOWED_HOSTS 를 열어 주어야 합니다.
# settings.py
DEBUG = False # DEBUG = True
ALLOWED_HOSTS = ['127.0.0.1', 'localhost'] # ALLOWED_HOSTS = []
하지만 DEBUG = False로 설정한 경우, static 파일들이 로드되지 않을 수 있습니다. 그 문제를 해결하기 위해서는 settings.py 에서 간단하지만 추가적인 설정을 해야 합니다.(해당 글에서는 추가 설정하는 법은 다루지 않습니다.)
2. urls.py 파일에서 정적 파일 경로를 지정한다.
urls.py 파일에서 정적 파일 경로를 지정하는 코드를 추가하여 media_root/admin/ 경로를 직접 지정할 수 있습니다.
Django 개발 서버에서 정적 파일(MEDIA_ROOT 디렉토리의 파일)을 서빙하는 기능을 활성화하게 됩니다
위의 코드를 추가하면, MEDIA_URL로 시작하는 URL 경로에 대해서는 MEDIA_ROOT 디렉토리에서 파일을 찾아 제공하게 됩니다. 따라서 http://127.0.0.1:8000/admin URL에 대해서도 MEDIA_ROOT/admin/index.html 파일이 있다면 해당 파일을 제공할 수 있게 됩니다.
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... your url patterns here ...
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
위의 code 해설
# if settings.DEBUG: 부분은 DEBUG=True 일 때에만 실행된다는 의미입니다.
if settings.DEBUG:
# static() 함수는 MEDIA_URL로 시작하는 URL 경로를 찾으면 해당 경로에 대한 요청이 올 때마다
static(settings.MEDIA_URL,
# settings에서 MEDIA_ROOT 디렉토리에서 파일을 찾아 반환하게 됩니다.
document_root=settings.MEDIA_ROOT)
따라서, http://127.0.0.1:8000/admin URL에 대해서도 MEDIA_ROOT/admin/index.html 파일이 있다면 해당 파일을 제공할 수 있게 됩니다.
댓글