장고 공부(4) - 앱 생성, urls.py, views.py
이 포스팅에서는 중요하다고 생각되는 것들만 기록합니다. 자세한 내용은 위키독스를 보시면 됩니다.(https://wikidocs.net/book/4223)
이전 포스팅
장고 공부(3) - 기본 환경 세팅
이 포스팅에서는 중요하다고 생각되는 것들만 기록합니다. 자세한 내용은 위키독스를 보시면 됩니다.(https://wikidocs.net/book/4223) 이전 포스팅 장고 공부(2) - 프로젝트 생성 이 포스팅에서는 중요하
jang-sn.tistory.com
위에 적은 위키독스를 보며 공부하는 중이다. 이제 pybo라는 앱을 만들 것이다. 앱을 생성하는 법은 간단하다.
django-admin의 startapp이라는 명령어와 만들 앱의 이름을 같이 적으면 된다. 그러면 관련 파일들과 디렉토리가 생성된다. 참고로 "startproject"라는 명령어도 있다.
궁금한 점. django-admin을 어떻게 실행시킬 수 있는가? 아니 그전에 django-admin은 무엇인가? 물론 추측하기로는 이전에 장고 프로젝트를 생성할 때, 같이 설치된 장고 프로그램 같다.(https://jang-sn.tistory.com/124) -> 나중에 찾아보기로 하자.
다시 돌아와서, 서버를 구동시킨 뒤, "localhost:8000/pybo"페이지로 들어가보자. 그러면 404 에러가 날 것이다. 해당 url 주소와 매핑되는 페이지가 없기 때문이다. 오류 페이지에 자세한 내용이 있다.
에러 메시지를 보면 config.uris에 요청한 /pybo 에 매핑되는 url패턴이 없다고 한다. 이 에러를 해결하기 위해서는 "pybo" url에 대한 매핑을 추가해주면 된다. "config/urls.py"라는 파일에 그 매칭을 추가해준다. 장고 프로젝트가 생성될 때, 생성된 파일이다.
config/urls.py 파일은 페이지 요청이 들어오면 가장 먼저 실행되는 파일이다. url과 뷰 함수 간의 매핑을 정의하는 곳이다. 뷰 함수는 views.py에 정의되어 있다.
해당 파일에서 "pybo/"를 매핑을 추가해주자.
이제는 "pybo/"라는 url이 요청되면, views.index를 호출하라는 매핑을 'urlpatterns'라는 리스트에 추가했다. 실제 url은 'http://localhost:8000/pybo"이지만 호스트와 포트 번호는 생략된다.(환경마다 다르기 때문에)
그리고 'pybo' 뒤에 슬래쉬를 붙이는 이유는 실제로 브라우저 주소창에 슬래쉬를 입력하지 않아도 장고가 url을 정규화해줘서 'pybo/'로 바꿔주기 때문이다. 웬만해서는 url 매핑 시, 슬래쉬를 붙여주자.
매핑을 추가한 채로 다시 요청을 해보자. 이제는 다른 에러가 나온다. 서버에서도 에러가 발생한다. 왜냐하면 이전에 url 매핑에 추가한 뷰 함수 views.index가 존재하지 않기 때문이다.
이 문제를 해결하기 위해선 views.index를 만들어주면 된다. 'pybo/views.py' 파일에 index 함수를 추가해준다.
index라는 함수를 만들었다. request를 입력값으로 받고 있다. request는 장고에 의해 자동으로 전달되는 http 요청 객체이다.
두번째 줄에서 import 한 'HttpResponse'는 요청 페이지에 대한 응답할 때 사용되는 클래스이다. 위 코드에서는 index 함수가 호출될 때, "안녕하세요..." 문자열이 출력될 것이다.
파일 수정한 후 다시 호출해보자.
방금까지 만든 것들을 정리해보자.
1. 브라우저에서 로컬 서버로 "localhost:8000/pybo"를 호출했다.
2. 그리고 로컬 서버에서 urls.py에서 url 매핑을 확인하여 views.index 함수를 호출했고
3. views.py의 index 함수를 호출해서 다시 브라우저에게 응답 값을 전달했다.
다시 초반으로 돌아가 디렉토리의 구조에 대해 다시 볼 필요가 있다. 나는 "mysite"라는 장고 프로젝트 디렉토리 하위에 "pybo"라는 앱 디렉토리를 생성했다. 만약 pybo 앱과 관련된 url을 추가하려면 또다시 pybo와 관련된 새로운 url 패턴을 추가시켜줘야 한다. 그러나 config/urls.py는 'pybo' 하위에 있는 파일이 아니다. 만약 pybo 외에 새로운 앱들이 생겨나고 그것들의 url 매핑을 계속 추가해준다면 굉장히 복잡할 것이고, 프로젝트 구조에도 좋지 않을 것이다. 다시 설명하면 urls.py는 프로젝트 성격을 갖고 있는데, 앱 성격의 pybo 관련 url이 들어가고 있는 것이다.
그럼 어떻게 수정할까? 앱 별로 url매핑을 관리하고, 실제 config/urls.py에서는 그 url 매핑들을 포함시키도록 하면 된다.
django.urls의 include 라이브러리를 import해서 pybo의 urls을 포함시킨다.
수정한 코드가 적용되면, 'pybo/'로 시작하는 페이지 요청을 받으면 'pybo/urls.py'에 있는 매핑 정보를 읽어 처리하게 된다. 이렇게 수정하면 앱 별로, urls.py를 사용해 깔끔하게 관리할 수 있다. 이제 pybo 하위에 urls.py를 작성한다.
기존의 config/urls.py의 내용은 비슷하다. 대신 이미지에 보이는 것처럼, path에 빈 값이 매핑되어 있다. 이미 config/urls.py에서 'pybo/'까지 매핑시키고 있기 때문이다. 다시 정리하면 config/urls.py의 url과 pybo/urls.py의 url이 합쳐져서 최종 url이 만들어지는 것이다. 수정한 것을 적용해서 다시 위 주소를 호출하면 똑같은 화면을 볼 수 있다.