-
CGV 영화 상영정보 제공기능 완성web/Django 2019. 12. 10. 16:27
그동안 상영정보를 장고로 보여주는 기능을 구현하기 위해서 삽질하면서 알게 된 몇 가지 정보들과
그렇게 해서 구현한 기능들이 어떠한 원리로 동작하는지 정리해야 겠다
1. URL 매핑
장고의 URL 매핑시 가장먼저 확인하는 URL 매핑 파일의 디폴트 위치는
빨간 박스의 해당 프로잭트의 settings.py 파일이 있는 곳이다.
그렇기 때문에 include 함수를 사용하여 URL의 기본 형태인 " " 과 같이 빈 요청이 오면
파란 박스의 cgv_cr 이라는 app의 urls.py 파일로 찾아가라고 설정해 두었다.
위의 사진은 cgv_cr app에 위치한 urls.py 의 모습이다.
가장 먼저 장고의 urls 패키지를 불러와 path 라는 함수를 import 해주었다
그 뒤 views.py 을 import 해주어서
내가 어떠한 URL 요청에 따라 어떠한 행동을 하는 특정 함수로 가라고 정의해 주었다
초록색 박스는 " " -> 기본 URL구조로 요청이 올 시 views.py 에 있는 index라는 함수를 실행시키겠다고 정의
그렇다면 views.py index 함수를 보자
다음과 같이 정의 되어있다
가장먼저 빨간색 박스처럼
render라는 함수를 불러온 것을 볼 수 있다
render 함수의 역할은 요청을 한 사용자에게 필요한 정보가 담긴 탬플릿을 제공해 주는 것 이다.
기본적으로 3가지의 인자를 받는다.
1. request -> 요청한 정보 ( 사용자가 필요하다고 하는 정보 )
2. 해당 탬플릿의 위치
3. dict 형태의 정보 -> 요청한 정보 ( 사용자가 필요하다고 해서 DB에서 가져온 정보 )
위와 같이 render 이라는 함수를 사용해서 사용자가 원하는 정보를 탬플릿을 통해서 뿌려줄 수 있다.
물론 이와는 다르게 탬플릿을 반환해주는 것이 아닌 URL 을 반환 해주는 것을 해주는 함수도 존재 한다
redirect 함수가 해당 역할을 해준다.
이때 URL로 이동을 한다는 행위는 즉 다시 urls.py 파일에서 해당 URL에 따라 정의 되어있는
새로운 함수를 실행시킨다는 의미 라는 것을 명심하자
또한 render는 다르게 내가 원하는 정보를 담아서 넘겨주는 것을 불가는 하다
새로운 url의 요청만 가능함
위에서 views.py에 index 하는 함수를 정의 했으며 해당 함수의 반환 값을
index.html 이라는 탬플릿을 보여주는 것으로 정의 하였다. 그렇다면 이제부터 index.html을 만들고
어떠한 화면을 보여줄지 정의 해보도록 하자
파란 박스 : 위치
templates 라는 디렉터리를 생성 -> cgv_movie 디렉터리 생성 -> index.html 생성
빨간 박스 : html 태크
input 태크로 사용자에게 입력 값을 받음
form 태그로 받은 입력 값을 get_cgv 라는 이름의 URL로 넘겨 준다 이때 방식은 POST 임
여기서 csrf_token 이라는 신기한 개념이 등장한다.
CSRF 에 대해서 간단하게 알아보자
CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격이라고 정의하고 있다.
이는 즉 CSRF를 통해 해커는 희생자의 권한을 도용하여 중요 기능을 실행하는 것이 가능하다
예를들어, 해당 희생자의 권한으로 희생자가 사용중인 웹 사이트의 광고성 글을 등록하는 행위
장고에서는 기본적으로 이러한 CSRF 공격을 방지하기 위해서 CSRF TOKEN 이라는 기능을 제공한다.
자세한 설명은 아래 페이지에 참조
위의 그림은 index.html 파일의 실행 화면이다
위와 같이 입력값을 받으며 제출이라는 것을 누를 시 form 태그를 통해form 태그에 정의한 url (get_cgv) 로 사용자가 입력한 값이 보내지는 구조이다.
그렇다면 get_cgv URL은 어떠한 함수로 매핑 되어 있으며 해당 함수가 하는 기능을 살펴보자
다음과 같이 get_cgv/의 URL 요청이 오면 get_cgv 라는 함수를 실행시킨다고 정의 되어 있다.
그렇다면 get_cgv 라는 함수는 어떠한 기능을 하는지 살펴보자
박스별로 하는 해당 함수의 기능을 나누었다 한번 알아 보도록 하자
빨간색 박스 :
사용자에게 받은 지역정보를 가지고 DB의 데이터와 매칭하는 값들을 가져옴 -> 가지고온 정보를 딕셔너리 형태로
담아서 mv_list 라는 배열에 추가
초록색 박스 :
빨간 박스에 담은 정보를 이제 그룹 별로 묶어주는 작업
구조는 다음과 같다
mv_gr_ls =
[
{ ( 영화 제목 1 ) : [ {area : 위치, seat : 좌석, start_time : 시간, date : 날짜 .....},
{ ( 영화 제목 2 ) : [ {area : 위치, seat : 좌석, start_time : 시간, date : 날짜 .....},
{ ( 영화 제목 3 ) : [ {area : 위치, seat : 좌석, start_time : 시간, date : 날짜 .....},
{............}
]
노란 박스는
위와 같은 배열 형태로 묶은 mv_gr_ls 리스트를 movie_list 딕셔너리의 밸류값으로 추가해서
render 함수의 파라미터 값으로 넘겨준다
이제 사용자가 필요로 하는 정보를 딕셔너리 형태로 반환 하였다 탬플릿을 통해
어떻게 보여지는지 살펴보자
위와 같은 구조로 내가 전달한 dict 형태의 데이터가 탬플릿에 나타나게 된다.
빨간 박스 :
사용자 지정 탬플릿 필터
딕셔너리의 key 값만 가져오는 탬플릿 필터를 새로 만든 후 선언
초록 박스 :
가장먼저 list 형태의 정보 안에있는 딕셔너리를 하나씩 불러 오기위해
장고 탬플릿 태그중 하나인 for 태그를 사용해서 불러온 뒤
빨간 박스에서 선언한 필터를 통해 key값만 출력
주황 박스 :
딕셔너리의 밸류 값을 가져 옴
그루핑 해서 묶어둔 list 형태
노란 박스 :
list 형태의 상영 정보를 for 태그를 통해 딕셔너리로 하나씩 받아오면서
해당하는 key값을 불러와 velue 값을 화면서 출력
영화 좌석의 경우 a 태그의 href 속성에 link를 달아 주어서 바로 영화 예매 페이지로 넘어가게 정의
위와 같이 성공적으로 크롤링한 데이터들이 화면에 뿌려지는 것을 알 수 있다.
링크 클릭시
'web > Django' 카테고리의 다른 글
장고 View ( step.2 ) (0) 2019.12.05 장고 URLConf ( step.1 ) (0) 2019.12.05 CGV 좌석 정보 제공 WEB 서비스 만들기 (0) 2019.12.05 장고 DB에 파싱한 내용 담기 (0) 2019.12.04 장고 APP 생성 후 DB에 담을 준비 (0) 2019.11.28