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 함수에서 사용 가능하다.
예제로 처음 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 |
댓글