본문 바로가기

Programming/Python_Web

Flask강좌5 - Flask form입력

반응형

form을 이용해 입력을 받고, 처리하여, 다시 결과를 보여주는 로직을 구현하겠습니다. 

1. localhost:5000/all의 db.html 화면에서 입력 받고,

2. __init__.py에서 라우팅 처리하고,

3. db.html에 결과를 보여줍니다. 

 

1. __init__.py

form 으로부터 전달된 이름('nm')을 받아서 temp 변수에 저장하고, query.filter_by로 DB에서 조회한 후, 결과를 members로 저장합니다. 그리고 members의 갯수를 count에 저장합니다. render_template함수를 통해 db.html로 연결이 되는데, 이때 members와 count를 함께 넘겨줍니다.

from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
from helloflask.model import Members
from datetime import datetime

app = Flask(__name__)

# database 설정파일
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:1234@localhost:3306/testdb"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy(app)

@app.route("/")
def home():
	member = Members.query.first()
	return 'Hello {0}, {1}, {2}, {3}, {4}'\
		.format(member.name, member.email, member.phone, member.start.isoformat(), member.end.isoformat())
	#return render_template('home.html')


@app.route('/all')
def select_all():
	members = Members.query.all()
	return render_template('db.html', members=members)

@app.route('/search', methods=['POST','GET'])
def calculate():
	if request.method=='POST':
		#temp = request.args.get('nm')
		temp = request.form['nm']
		members = Members.query.filter_by(name=temp)
		count=members.count()
		return render_template('db.html', members=members, cnt=count)

 

2.db.html

form 입력은 "POST" 형태로 이루어지고, 처리를 한 action을 명시해줍니다. 이후 "/search"에서 처리한 결과는 members 변수에 담아 전달됩니다. members 변수의 각 attribute를 출력하는 부분을 작성합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Flask App</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>

<form method="POST" action="/search">
    <div>
        <label for="nm">검색이름</label>
        <input type="text" name="nm">

    </div>
    <div class="'button'">
        <button type="submit">검색</button>
    </div>
</form>
    <p>

        {% if members ==None %}
            <h5>결과가 없습니다.</h5>
        {% else %}
            <h5>{{ cnt }}개의 결과가 있습니다.</h5>
        {% endif %}
        <table>
        {% for member in members %}
            <tr>
                <td>{{ member.id }}</td>
                <td>{{ member.name }}</td>
                <td>{{ member.email }}</td>
                <td>{{ member.phone }}</td>
                <td>{{ member.start }}</td>
                <td>{{ member.end }}</td>
            </tr>
        {% endfor %}
        </table>
    </p>
</div>

</body>
</html>

<결과>

(1) localhost:5000/all 접속화면

(2) 검색이름에 '홍길동' 을 입력 후 검색한 화면

반응형