본문 바로가기
파이썬 웹 서비스 만들기

3. 사용자 등록 기능 - 3.2. 정보입력 페이지

by 영바이트 2020. 9. 24.

로그인을 위한 계정 생성 기능을 위한 첫 단계로 이전 포스팅 '3.1. 계정 정보 정의'에서 계정 정보를 정의하였다. 이제 정보를 입력 받을 페이지를 만들어보자. 페이지는 실제 보여지기 때문에 뷰(view)라는 이름으로 불린다.

 

페이지는 HTML 형태로 만들어진다. 아래와 같이 웹 서비스를 구현하는 패키지인 appmain 패키지의 template 디렉토리 아래에 register라는 이름으로 뷰를 구현하자.

 

<뷰 파일: register.html>

 

▶ appmain/templates/register.html

{% extends "layout.html" %}
{% block content %}
<div>
    <form method="POST" action="">
        {{ form.hidden_tag() }} {# Transferring CSRF token = secret key #}
        <div>
            {{ form.username.label }}
            {{ form.username }}
            {% if form.username.errors %}
                <div>
                    {% for error in form.username.errors%}
                        <span>{{ error }}</span>
                    {% endfor %}
                </div>
            {% endif %}
        </div>
        <div>
            {{ form.email.label }}
            {{ form.email }}
            {% if form.email.errors %}
            <div>
                {% for error in form.email.errors%}
                    <span>{{ error }}</span>
                {% endfor %}
            </div>
            {% endif %}
        </div>
        <div>
            {{ form.password.label }}
            {{ form.password }}
            {% if form.password.errors %}
            <div>
                {% for error in form.password.errors%}
                    <span>{{ error }}</span>
                {% endfor %}
            </div>
            {% endif %}
        </div>
        <div>
            {{ form.confirm_password.label }}
            {{ form.confirm_password }}
            {% if form.confirm_password.errors %}
            <div>
                {% for error in form.confirm_password.errors%}
                    <span>{{ error }}</span>
                {% endfor %}
            </div>
            {% endif %}
        </div>
        <div>
            {{ form.submit }}
        </div>
    </form>
</div>
{% endblock content %}

 

register.html 파일을 보면 '{{ form.변수이름.속성이름 }}' 패턴이 반복된다. 이 부분들이 플라스크 템플릿 엔진에 의해 user 패키지에 지정했었던 forms.py의 변수들로 치환된다. 그리고 웹 페이지에 정보를 입력하면 forms.py에 정의했었던 변수들을 통해 웹 서버는 입력된 정보를 받을 수 있다.

 

그 외에 POST 방식(HTTP 메시지의 body에 데이터를 포함시켜 가져오는 방법)으로 데이터 전달 방식을 지정한 것과 웹 서비스를 구성하는 정상적인 웹 페이지에서 보낸 데이터인지 확인하는 비밀 키 form.hidden_tag()를 지정한 것을 눈여겨보면 된다.

비밀 키와 CSRF 보안 위험에 관한 내용은 「파이썬 웹 프로그래밍 기본」 편의 포스팅 '5. 입력 처리 - 5.1. 비밀 토큰(secret token)'에 내용을 자세히 기술하였다.

 

이제 웹 페이지들이 공통적으로 사용하는 메뉴 등이 구현되어 있는 layout.html에 '계정 생성' 페이지(register.html)로 이동할 수 있는 링크를 추가하면 뷰 구성이 마무리된다.

 

▶ appmain/templates/layout.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" type="text/css" href="{{url_for('static', filename='css/main.css')}}">
        {%if title%}
            <title>{{title}}</title>
        {%else%}
            <title>Flask Exercise</title>
        {%endif%}
    </head>
    <body>
        <a href="{{url_for('main.home')}}">Home</a>
        <a href="{{url_for('main.about')}}">About</a>
        
        <!-- 이 부분이 추가된 계정생성 페이지 링크다 -->
        <div>
            <a href="{{url_for('user.register')}}">Register</a>
        </div>
        <!-- -->
        
        <div>
            {%block content%}{%endblock content%}
        </div>
    </body>
</html>

이제 남은 작업은 폼으로 부터 받은 데이터를 어떻게 처리하는지 정의하는 '로직(logic) 또는 컨트롤(control)' 구현이 남았다. 로직의 기능을 먼저 간단히 살펴보면 입력된 데이터를 데이터베이스(DB)에 저장하는 것으로 요약하여 이야기 할 수 있다.

 

이어지는 포스팅에서 로직을 구현하고 사용자로부터 정보를 입력받아 계정을 생성하는 기능을 가지는 웹 서비스를 완성해보자.

 

댓글