2010년 6월 7일 월요일

06. Request 처리 - 02

앞서 사용자의 요청(Request)을 django가 어떻게 처리하는지 알아봤습니다.(Request 처리)

그럼 사용자가 URL 요청을 하는 것 외에 서버측에 사용자 정보를 전달하는 방법에 대해 예제를 통해 알아보도록 하겠습니다.

 

 

django.shortcuts package에는 django의 M-T-V를 운영하는데 도움이되는 몇가지를 제공하고 있습니다.

그중에서 render_to_response에 대해 잠깐 알아보도록 하겠습니다.

django의 문서에 의하면 (http://docs.djangoproject.com/en/dev/topics/http/shortcuts/#render-to-response) prototype은 다음과 같습니다.

 

render_to_response(template[, dictionary][, context_instance][, mimetype])

 

이 render_to_response는 template과 HTML redndering에 필요한 정보를 context를 통해 전달받아 HTML로 만들어 HttpResponse객체로 반환합니다.

즉, Template과 나타낼 정보를 적절히 연결시켜주는 역할을 하고 앞서 설명한 Template 을 통한 사용자 요청에 대한 응답을 보다 수월하게 해 줍니다.

여기서 설명드린 render_to_response를 view에서 사용하기 위해서는 views.py의 앞 부분에 사용하기 위해 import를 다음과 같이 합니다.

 

from django.shortcuts import render_to_response

 

 

다음 의 HTML Code를 template 디렉토리에 search_form.html 로 저장합니다.

 

  1. search_form.html
  2. <html>
    <head><title>GET을 통한 정보의 전달</title></head>
    <body>
    <form action='/search/' method='get'>
  3. <label for='searchWord'>검색어</label>
  4. <input type='text' name='searchWord' />
  5. <input type="submit" value="검색" />
  6. </form>
    </body>
    </html>
  7.  

 

그럼 이제 이 template을 view와 연결하여 보도록 하겠습니다.

위에서 설명한 render_to_response를 사용해 보도록 하겠습니다. views.py를 열어 다음을 추가합니다.

redner_to_response는 request 처리에서 사용한 예에서 처럼 Context()와 Template의 render()를 분리해서 사용하지 않고 한번에 디자인과 전달할 데이터를 묶어줍니다. (본 예에서는 전달할 데이터가 없어서 그냥 Template만 전달합니다.)

 

  1. views.py
  2. def search_form(request) :
        return render_to_response('search_form.html')

 

template 과 view 가 준비가 되었으니 urls.py를 열어 URL과 view를 다음과 같이 연결해 줍니다.

 

  1. urls.py
  2. urlpatterns = patterns('',
       ...
       (r'^search_form/$', search_form),
  3.    ...
    )

 

테스트 서버를 구동시킨후 http://127.0.0.1:8000/search_form 을 입력해 보면 아래와 같이 나옵니다.

 

get_post_cap01.jpg

 

이제 이 Form을 통해 사용자가 자료를 서버로 보내면 이를 서버가 어떻게 처리할 지 알아보도록 하겠습니다.

기본적으로 처리 과정은 GET에 의한 전송이나 POST에 의한 전송이나 차이가 없습니다. 단지 전송방법에 따른 차이가 존재하는데 이는 추후에 설명드리도록 하겠습니다.

앞선 예제의 Template으로 사용한 HTML문서를 보시면 action이 'search'로 되어 있는 것을 확인하실 수 있습니다.

즉, 해당 Form의 값이 서버의 search로 전달됨을 의미하는데 서버 입장에서는 하나의 사용자 요청이 들어온 것이 됩니다.

따 라서 사용자 요청에 따른 처리 루틴과의 연결을 담당하는 urls.py와 해당 어떻게 처리할 것인지를 나타내는 views.py를 수정하여야 합니다.

먼저 urls.py를 수정하도록 하겠습니다.

서버는 사용자의 요청으로 /search/ 가 들어온것으로 인식하므로

 

  1. urls.py
  2. urlpatterns = patterns('',
       ...
       (r'^search_form/$', search_form),
  3.    (r'^search/$', search),
  4.    ...
    )

 

와 같이 작성하여 views.py의 search 함수와 연결합니다.

이제 처리를 담당하는 views.py 의 search 함수를 다음과 같이 작성해 보도록 하겠습니다.

 

  1. views.py
  2. def search(request) :
        if 'searchWord' in request.GET :
            return HttpResponse ('사용자 입력 검색어 : %r' % request.GET['searchWord'])
        else :
            return HttpResponse('검색어를 입력하지 않으셨습니다.')

 

views.py 에 사용된 코드를 잠시 살펴보겠습니다.

if문장을 보시면 GET방식을 통해 전달되는 정보는 request객체의 GET이라는 속성을 통해 전달됨을 알수 있습니다.

그리고 이 속성은 Dictionary 형 자료로 구성되어 있는데 앞선 HTML에서 검색어 입력을 위한 코드가 <input type='text' name='searchWord' />로 되어 있었습니다. 여기서 name 속성에 해당하는 것이 django가 값을 받아 처리할 때 request.GET 의 키가 되고 이 Form을 통해 전달된 값이 즉, request.GET['searchWord']의 값이 사용자가 입력한 값이 됩니다.

만 일 사용자가 검색어로 test를 입력하게 되면 django는 다음과 같은 화면을 보여줄 것입니다.

 

get_post_cap02.jpg

 

물론 views.py를 보시면 아시겠지만 아무 검색어도 입력하지 않으면 '검색어를 입력하지 않으셨습니다'라는 메세지를 보여줄 것입니다.

 

일단 아주 간단하게 form을 통해서 값을 서버에 전달하고 이 전달된 값을 서버가 어떻게 가져오는지 알아보았습니다.

차츰 복잡한 부분이 나오겠지만 이상의 동작 방식을 잘 이해하시면 나머지는 그저 기술적인 부분으로만 생각하시면 될 것 같습니다.

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기