본문 바로가기
Web developer/Flask

[Flask] SQLAlchemy #2

by doongjun 2020. 10. 14.

HTML파일 (ex0612.html)

{% extends "mybase.html" %} 
{% block title %}
	flask Form 
{% endblock %} 
{% blockbody %} 
	{% if name %} 
    안녕하세요, {{name}} 
    {% else %} 
    안녕하세요, 처음 방문이시군요! 
    {% endif %}
    
    {% if not known %}
    <p>만나서 반가워요</p>
    {% else %}
    <p>다시 만나서 반가워요</p>
    {% endif %}
    
    <form method="post">
      {{form.hidden_tag()}} {{form.name.label}}:{{form.name}}<br />
      {{form.submit()}}
    </form>
{% endblock %}
    

Python 파일 (ex0612.py)

from flask_sqlalchemy import SQLAlchemy
from flask import session, redirect, url_for
import os
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired


class NameForm(FlaskForm):
    name = StringField('Your Name?', validators=[DataRequired()])
    submit = SubmitField('Submit')


app = Flask(__name__)
app.config['SECRET_KEY'] = "hard to guess string"


basedir = os.path.abspath(os.path.dirname(__file__))  # 파일의 절대경로 저장
db_url = 'sqlite:///' + os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = db_url
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)  # SQLAlchemy를 인스턴스화


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    loginname = db.Column(db.String(64), unique=True, index=True)
    # relationship
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))

    def __repr__(self):
        return "<User {}>".format(self.loginname)


class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    rolename = db.Column(db.String(64), unique=True)
    # relationship
    users = db.relationship('User', backref='role')

    def __repr__(self):
        return "<Role {}>".format(self.rolename)


@app.route("/ex0612", methods=['GET', 'POST'])
def hello():
    form = NameForm()
    if form.validate_on_submit():
        user = User.query.filter_by(loginname=form.name.data).first()
        if user is None:
            user = User(loginname=form.name.data)
            db.session.add(user)
            db.session.commit()
            session['known'] = False
        else:
            session['known'] = True
        session['name'] = form.name.data
        form.name.data = ""
        return redirect(url_for("hello"))
    return render_template("ex0612.html", form=form, name=session.get('name'), known=session.get("known", False))

 

뷰 함수에서 데이터베이스의 사용

DB에 관련된 연산을 View 함수에서 사용 가능하다.

클라이언트-서버 모델(3-계층 C/S모델)

예제로 처음 submit한 이름은 '만나서 반갑습니다.', 다시 submit한 이름은 '다시 만나서 반갑습니다.' 라고 출력하는 웹 페이지를 Flask를 통해 만들어보고자 한다.

 

Flask 서버 실행

첫번째 submit

그 이후 submit

input에 제출한 내 이름이 데이터베이스에 잘 저장되었는지 확인해보고 싶다면

Flask-SQLAlchemy (1) 에서 있는 내용 중 행의 쿼리문를 이용하여 아래처럼 확인해볼 수 있다.

>>> query=User.query.filter_by(role=None)
>>> n_user = query.all()
>>> n_user
[<User 김동준>]

'Web developer > Flask' 카테고리의 다른 글

[Flask] Jinja2 Template #1  (0) 2020.10.30
[Flask] Bootstrap  (0) 2020.10.30
[Flask] Blueprint  (0) 2020.10.24
[Flask] 대규모 Application 구조  (0) 2020.10.24
[Flask] SQLAlchemy #1  (0) 2020.10.13

댓글