양식의 사용자 입력 처리


이 Python 방명록 코드 둘러보기는 사용자 입력을 처리하는 방법을 보여줍니다.

이 페이지는 여러 페이지로 구성된 가이드의 일부입니다. 처음부터 시작하고 설정 안내를 확인하려면 방명록 만들기로 이동하세요.

webapp2를 사용하도록 앱 구성

방명록 샘플은 App Engine 환경 및 App Engine Python SDK에 포함되어 있는 webapp2 프레임워크를 사용합니다. webapp2를 사용하기 위해서 애플리케이션 코드와 하나로 묶을 필요는 없습니다.

app.yaml 파일은 앱이 webapp2 프레임워크를 사용하도록 지정합니다.

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest

webapp2 애플리케이션에는 다음 두 가지 부분이 있습니다.

  • 요청을 처리하고 응답을 빌드하는 하나 이상 RequestHandler 클래스입니다.
  • URL을 기준으로 수신 요청을 핸들러로 라우팅하는 WSGIApplication 인스턴스입니다.

app.yaml 파일은 guestbook.pyapp 객체를 모든 URL의 핸들러로 지정합니다.

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /bootstrap
  static_dir: bootstrap

- url: /.*
  script: guestbook.app

양식 제출용 핸들러 정의

guestbook.pyapp 객체는 제공된 URL에 대한 요청을 처리하는 스크립트를 정의하는 WSGIApplication입니다.

app = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/sign', Guestbook),
], debug=True)

핸들러에서 오류가 발생하거나 포착되지 않은 예외가 발생하는 경우 debug=True 매개변수는 스택 추적을 브라우저 출력에 표시하도록 webapp2에 지시합니다. 이 옵션은 애플리케이션 최종 버전을 배포하기 전에 제거해야 합니다. 제거하지 않으면 애플리케이션 내부가 실수로 노출됩니다.

Guestbook 핸들러에는 get() 메서드 대신 post() 메서드가 있습니다. MainPage가 표시하는 양식이 HTTP POST 메서드를 사용하여 양식 데이터를 제출하기 때문입니다.

class Guestbook(webapp2.RequestHandler):

    def post(self):
        # We set the same parent key on the 'Greeting' to ensure each
        # Greeting is in the same entity group. Queries across the
        # single entity group will be consistent. However, the write
        # rate to a single entity group should be limited to
        # ~1/second.
        guestbook_name = self.request.get('guestbook_name',
                                          DEFAULT_GUESTBOOK_NAME)
        greeting = Greeting(parent=guestbook_key(guestbook_name))

        if users.get_current_user():
            greeting.author = Author(
                    identity=users.get_current_user().user_id(),
                    email=users.get_current_user().email())

        greeting.content = self.request.get('content')
        greeting.put()

        query_params = {'guestbook_name': guestbook_name}
        self.redirect('/?' + urllib.urlencode(query_params))

post() 메서드는 self.request에서 양식 데이터를 가져옵니다.