ํ๋ผ์คํฌ์ ๊ฒฝ์ฐ, HTML ๋ฌธ์๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ฃผ์ด์ผ ํด๋น ํ์ผ๋ค์ ์ธ์ํ ์ ์๋๋ฐ, ํด๋น ํด๋์ ์์น๋ ๋ฐ๋์ ํ๋ผ์คํฌ๋ฅผ ์คํ์ํค๋ ์ฝ๋์ ๊ฐ์ ๊ฒฝ๋ก์ด๋ฉฐ, templates๋ผ๋ ์ด๋ฆ์ด์ฌ์ผ ํ๋ค. ๋จผ์ template ํด๋ ๋ด์ hello.html ํ์ผ์ ๋ง๋ค๊ณ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ.
# hello.html
<!doctype html>
<html>
<body>
<h1>Hello {{ name }}!</h1>
</body>
</html>
์ด์ , app.py๋ฅผ ์์ ์ ์ชผ๊ธ ํด์ฃผ๋ฉด!
# app.py
from flask import Flask, render_template
# render_template import ํด์ฃผ๊ณ
app = Flask(__name__)
@app.route('/hello/<user>')
def hello_name(user):
return render_template('hello.html', name = user)
# importํด์ค render_template๋ฅผ return ๊ฐ์ผ๋ก ๋ฐํํด์ฅฌ๊ธฐ
if __name__ == '__main__':
app.run(debug = True)
# ์์ ๋ธ๋ก๊น
์์ ์ธ๊ธํ๋๋ฐ, debug ์ต์
์ True๋ก ๋ณด๋ด์ฃผ๋ฉด, ์น ์๋ฒ๊ฐ ์คํ ์ค์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์ด๋ ํด๋น ์์
์ ๊ทธ๋๋ก ๋ฐ์์ํจ๋ค.
# ์ค์ ๋ก ๊ฐ๋ฐ ์ค์ ๊ตฌํ ํํฉ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ด ์์ฒญ ํธ๋ฆฌํ๋ค. ์๋ฌด ์ธ์๋ ์ฃผ์ง ์์ ๊ฒฝ์ฐ, False ์ธ์๋ก ๋ณด๋ด์ง๋ค.
render_template('hello.html', name = user)
ํ๋ผ์คํฌ์์ ์ธ๋ถ์ html ํ์ผ์ ๋ถ๋ฌ์ค๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ ๋ฐ๋ก ์ด๊ฒ์ด๋ค. templates ํด๋์์ ์ธ์๋ก ๋ฐ์ hello.html ํ์ผ์ ํ์ํ ํ, name ์ธ์๋ฅผ ๊ฑด๋ค์ฃผ๋ฉฐ ํ์ด์ง๋ฅผ ์คํ์ํจ๋ค.
Hello {{ name }}!
์ธ์๋ก ๋ฐ์ name ๋ณ์๋ ์ด๋ฐ ํํ๋ก html ๋ฌธ์์์ ์ถ๋ ฅํ ์ ์๋ค. ์ด๋ ๊ฒ { } ๋ฑ์ ์ฌ์ฉํ์ฌ html ๋ฌธ์ ๋ด์์ ์ง์ ์ฝ๋๋ฅผ ์คํ์ํค๋ ๋ฌธ๋ฒ์ Template Engine์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด ํ
ํ๋ฆฟ ์์ง์ ์ด๋ฆ์ Jinja2๋ผ๊ณ ํ๋ค.
Jinja2
์ด ํ
ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ์ฌ HTML ๋ฌธ์์์ ๋ช ๊ฐ์ง ํ์ด์ฌ ๊ตฌ๋ฌธ์ ์์ฑํ๊ณ ์คํ์ํฌ ์ ์๋ค. (if ๋ฌธ, for ๋ฌธ ๋ฐ ์ผ๋ถ ๋ฉ์๋๋ค ์ฌ์ฉ๊ฐ๋ฅ) ์ฝ๋ ์ฉ๋์ ๋ฐ๋ผ ์ ์ ํ ๊ดํธ๋ฅผ ๊ฐ์ธ์ฃผ์ด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
>> ์๋ ๊ฒ!
{% ... %} for Statements
{{ ... }} for Expressions to print to the template output
{# ... #} for Comments not included in the template output
# ... ## for Line Statements
์น ํ์ด์ง์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ HTML ๋ฌธ์์์ ๋ณด์ฌ์ฃผ์ด์ผ ํ ๋ณ์๋ ์๋ฃํ์ด ๋งค์ฐ ๋ง์ ์๋ ์๋ค. ๊ทธ๋์ ํด๋น ํจ์ ๋ด์ ์ง์ญ ๋ณ์ ์ ์ฒด๋ฅผ ์ธ์๋ก ๋ณด๋ด์ฃผ๋ locals() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ํธ๋ฆฌํ๋ค.
# app.py
from flask import Flask, flash, redirect, render_template, request
app = Flask(__name__)
@app.route("/")
def index():
return "Flask App!"
@app.route("/user/")
def hello():
users = [ "Frank", "Steve", "Alice", "Bruce" ]
var = 1
return render_template('user.html', **locals())
if __name__ == "__main__":
app.run(host='0.0.0.0',debug = True)
์ ๊ธฐํด... ํ...!
๐ Flask๋ฅผ ํตํด ์น ๊ตฌ๋ํ ๋, ๊ฐ URL ๊ฐ์ ์ด๋(Redirect) ๋ฐ HTTP ๋ฉ์๋ ์ฌ์ฉ๋ฒ์ ๋ํด ๊ณต๋ถ! ๐
์ฅ๊ณ ์์๋ urls.py๋ผ๊ณ ํด์ ๋ถ๋ชจ urls.py ์์ urls.py๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค๋ฉด, Flask์์๋ URL ๊ฐ์ ์ฝ๊ณ ํธํ ์ด๋์ ์ํด redirect ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค!
# app3.py
from flask import Flask, redirect, url_for
app = Flask(__name__)
@app.route('/admin')
def hello_admin():
return 'Hello Admin'
@app.route('/guest/<guest>')
def hello_guest(guest):
return 'Hello %s as Guest' % guest
@app.route('/user/<name>')
def hello_user(nmae):
if name == 'admin':
return redirect('/admin')
else:
return redirect(url_for('hello_guest', guest=name))
if __name__ == '__main__':
app.run(debug=True)
์ ์ฝ๋๋ /user/ URL์ ์ ๋ ฅ๋ name ๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ URL๋ก ํฅํ๊ฒ ๋์ด ์์! name ๊ฐ์ด admin์ผ ๊ฒฝ์ฐ, /admin URL(hello_admin())๋ฅผ ์คํ์ํค๊ณ , ๋๋จธ์ง๋ guest/ URL(hello_guest)๋ฅผ ์คํ์ํค๋ ๊ตฌ์กฐ์ด๋ค.
return redirect('/admin') == return redirect(url_for("hello_admin"))
ํด๋น URL๋ก ๋ฆฌ๋ค์ด๋ ํธ์ํค๋ ํจ์์ด๋ค. URL์ ์ค๋ ๋๊ณ , url_for() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํจ์ ์ด๋ฆ์ ์ธ์๋ก ์ฃผ์ด๋ ๋จ!! ๐ ๋๋ ์ ์๊ฐ ๋ ํธํ ๊ฒ ๊ฐ๋ค!
return redirect(url_for('hello_guest', guest = name))
url_for์ ๊ฒฝ์ฐ, ๋๋จธ์ง ์ธ์๋ฅผ ๋๊ฒจ ์ค๋, ์ ์ฝ๋์ฒ๋ผ ๋ณ์๋ก ๋๋ ์ ๋๊ฒจ์ค ์ ์๋ค. ํ์ด์ฌ์ ๋ฌธ์์ด ์ ๊ทผ์ด ์๋ ํธํ๋๊น ์ค์ URL๋ก ์ค๋ ๋น์ทํ๋, ํธํ๊ฑธ ์ฐ๊ธฐ~~ ๐
from flask import Flask, redirect, url_for, request
app = Flask(__name__)
@app.route('/success/<name>')
def success(name):
return 'welcome %s' % name
@app.route('/login', methods = ['POST', 'GET'])
def login():
if request.method == 'POST':
user = request.form['nm']
return redirect(url_for('success', name=user))
else:
user = request.args.get('nm')
return redirect(url_for('success', name=user))
if __name__ == '__main__':
app.run(debug = True)
@app.route('/login',methods = ['POST', 'GET'])
๊ธฐ๋ณธ์ ์ผ๋ก Flask์ ๋ผ์ฐํ
์ GET Method๋ก ์๋ตํ์ง๋ง, ํ์ํ ๊ฒฝ์ฐ ํน์ ๋ฉ์๋์๋ง ์๋ตํ๋๋ก ์ ์ธํ ์ ์๋ค. ์์ ์ฝ๋์ ๊ฒฝ์ฐ POST ๋ฐ GET 2๊ฐ์ ๋ฉ์๋์ ๋ํ ์๋ต์ด ๊ฐ๋ฅํ๋๋ก ํ์๋ค.
๋๋ ์ ๋ฃ์ด์ค๋ ๋จ!
if request.method == 'POST':
POST ๋ฉ์๋๋ก ์์ฒญ์ด ์์ ๋.
user = request.form['nm']
์ด ์ฝ๋๋ ํด๋น ์์ฒญ์์ ์
๋ ฅ๋ form ์ ๋ณด์ 'nm' ํ๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ฒ ๋ค๋ ๋ป. ํด๋น ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ ์ง์ form์ ๋ง๋ค์ด์ ์คํ์์ผ์ผ ํ๋ค. ์๋์ ๊ฐ์ html ํ์ผ์ ์์ฑํ์ฌ ๊ทธ๋๋ก ์ด์ด๋ณด์.
# asd.html
<html>
<body>
<form action = "http://localhost:5000/login" method = "post">
<p>Enter Name:</p>
<p><input type = "text" name = "nm" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>
์น ์๋ฒ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์๋, ์ง์ ํ์ผ์ ์ด์ด์ผ ํ๋ค. ํด๋น ํผ์ด ๋ด๊ธด html ๋ฌธ์๋ ๋ฑํ flask์ ์ฐ๊ฒฐ๋ ๊ฒ ์๋๊ธฐ ๋๋ฌธ. ๊ทธ๋ฌ๋ form์ action ํ๋์ ํด๋น URL๋ก ํด๋๋ฉด POST ์์ฒญ์ ์น ์๋ฒ๋ก ๋ณด๋ด์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๊ฒ ๋๋ค.
else: user = request.args.get('nm')
else ๋ฌธ์๋ ๋น์ฐํ ๋จ์ GET ๋ฉ์๋ ์์ฒญ์ด ์ค๊ฒ ๋๋ค. get('nm')๋ฅผ ํตํด URL์ ํตํด ์ ๋ฌ๋ฐ์ nm ํ๋์ ์ธ์๋ฅผ Flask๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ํ ์ ์๋ค. ์ด๋ฒ์ ๋ฐ๋ก form์ ๋ง๋ค ํ์ ์์ด ๋ฐ๋ก URL๋ก ์ธ์๋ฅผ ์ฃผ๋ฉด ๋๋ค.
http://127.0.0.1:5000/login?nm=eunhye
์ถ์ฒ: https://blog.naver.com/shino1025/221348321746
์ถ์ฒ: https://blog.naver.com/shino1025/221348289584