H-UP

ERD

일단 다음과 같이 ERD 를 구성해보았다. 다대다 구조의 데이터베이스를 처음 설계해보기에, 데이터베이스의 다대다 구조에 대해 먼저 학습했다.

현재 ERD 에서는 이용자 - 그룹 관계가 N:M 구조의 예시가 될 수 있다. 한 이용자는 여러 개의 그룹에 가입할 수 있으며, 그룹 또한, 여러 명의 사용자로 이루어져 있다. 이러한 관계를 다대다 구조라고 한다.

생활코딩 영상을 참고하여, 다대다 구조의 데이터베이스 설계에는, 이를 매핑하는 매핑테이블이 존재해야한다는 것을 알 수 있었다. 현재 ERD 에서의 mapping table(user_group) 이 이 역할을 해주는데, 그룹과 이용자 테이블 양측에서 키를 참조하여 그 중간을 잇는 역할을 한다.

1:N 구조의 데이터베이스는 기존에도 설계해본 바 있기에, 어렵지 않게 설계할 수 있었다. (계획 카테고리, 개인 계획, 그룹 계획, 그룹 공지)

Model

model 은 데이터베이스 연결부만 작성된 파일이기에 지난 포스트와 동일하다. 그러나, 타 서버에서 열었을 때에도 같은 화면이 보일 수 있도록 AWS RDS 에 배포를 진행하였기에, 관련하여 host와 user 이름만 변경해주었다.

지난 포스트 모델 코드

View

드디어 view 를 구현했다. 지난 포스팅에서 구현을 하지 못했던 이유는 blueprint에 대한 이해가 부족했기 때문이었고, 이를 구현하기 위해 이전에 대충 짚고 넘어갔던 blueprint에 대한 학습을 우선시하여 진행하였다.

blueprint

Bluprint는 Flask에서 모듈화를 도와주는 기능이다. 다음과 같이 app.py에서 view/user.py 를 참조하고, register_blueprint를 통해 blueprint 객체에 접근하는데, 이 때 user.user은 user.py 내에 있는 user 이름의 blueprint 객체와 연결한다는 뜻이며, 이에 접근하는 기본 주소는 /user임을 의미한다.

app.py

from view import user

# blueprint
app.register_blueprint(user.user, url_prefix='/user')

view/user.py

view인 user.py에는 user blueprint 객체를 생성하였다. 이 파일 내에서는 app.route 가 아닌 user.route 를 사용해야함에 주의해야한다

또한, app.py에서 user 객체로의 접근 url을 /user로 설정해두었기에, user.route(‘/’) 는 실제로 /user를, user.route(‘/login’) 은 user/login 을 뜻한다.

from flask import Flask, Blueprint, request, render_template, make_response, redirect, url_for, abort
from control.user import User
from urllib.parse import urlparse, urljoin
from flask_login import login_user, logout_user, current_user

# user blueprint 생성
user = Blueprint('user', __name__)

# next 파라미터 유효성 검사 - open redirect 취약 방지하기 위함
def is_safe_url(target):
    print('secure on')
    ref_url = urlparse(request.host_url)
    test_url = urlparse(urljoin(request.host_url, target))
    return test_url.scheme in ('http', 'https') and \
           ref_url.netloc == test_url.netloc

@user.route('/')
def user_page():
    return render_template('login.html')

@user.route('/login', methods = ['get','post'])
def login():
    id = request.form.get('id')
    pw = request.form.get('pw')

    user = User.get(id)
    next = request.args.get('next')
    print(next)
    if not is_safe_url(next):
        return abort(400)

    if not user:
        return '<script>alert("존재하지 않는 아이디입니다");history.go(-1);</script>'
    elif pw != user.pw:
        return '<script>alert("잘못된 비밀번호입니다");history.go(-1);</script>'
    else:
        login_user(user)
        return redirect(url_for('user.user_page'))

@user.route('/logout')
def logout():
    logout_user()
    return redirect(url_for('main'))

Controller

지난 포스트 cotroller 코드

태그:

카테고리:

업데이트: