5 Fri
[HEAD FIRST PYTHON] 5๊ฐ ์น์ฑ ๋ง๋ค๊ธฐ
Flask ์ค์น
pip install flask
๊ฐ์ํ๊ฒฝ์์ ์ค์น
์ด ๋ flask๊ฐ ์์กด์ฑ์ ๊ฐ๋ ๋ค ๊ฐ์ ๋ชจ๋์ด ํจ๊ป ์ค์น๋๋ค.
Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.2 flask-1.1.2 itsdangerous-1.1.0
Flask
๋ง์ดํฌ๋ก ์น ํ๋ ์์ํฌ
ํ์คํฌ์ ํ์ํ ์ต์ํ์ ๊ธฐ์ ์งํฉ์ ์ ๊ณต
๊ฒฝ์์์ธ ์ฅ๊ณ ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ํฌํจํ๋ค
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello() -> str:
return "Hello world from Flask!"
app.run()
1 : f๊ฐ ์๋ฌธ์์ธ flask๋ ๋ชจ๋๋ช ์ด๋ฉฐ F๊ฐ ๋๋ฌธ์์ธ Flask๋ ํด๋์ค๋ช ์ด๋ค.
import flask.Flask๋ ๊ฐ๋ฅํ์ง๋ง ๊ฐ๋ ์ฑ์ ์ํด from - import ๋ฅผ ์ฌ์ฉํ๋ค.
2 : Flask ํด๋์ค์ ์ธ์คํดํธ๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ app์ด๋ผ๊ณ ์ ์ํ๋ค. Flask ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ํ์ฌ ๋ฒ์ ์ __name__์ ์ธ์๋ก ๋ฐ์์ผ ํ๋ค.
__name__์ ํ์ฌ ํ์ฑ ๋ชจ๋์ ์ด๋ฆ
__name__๊ณผ ๊ฐ์ ๋ณ์๋ ๋ ๊ฐ์ ์ธ๋์ค์ฝ์ด๊ฐ ์์์ ์กด์ฌํ์ฌ ๋๋ธ ์ธ๋์ค์ฝ์ด๋ผ๊ณ ํ๋ค. ์ด๋ ์ค์ฌ์ ๋๋ ๋ค์, dunder name ์ด๋ผ๊ณ ๋ ํ๋ค.
4 : ์ฅ์์๋ฅผ ์ฌ์ฉํ๋ค.
์ฅ์์, decorator๋ ๊ธฐ์กด ์ฝ๋์ ์๋ก์ด ๋์์ ์ถ๊ฐํ๋ค. ์ด ๋ ํจ์์ ์ฝ๋๋ฅผ ๋ฐ๊พธ์ง ์๊ณ ๋ ๋์์ ์กฐ์ ํ ์ ์๋ค. ํจ์๋ฟ ์๋๋ผ ํด๋์ค์๋ ์ฅ์์๋ฅผ ์ ์ฉํ ์ ์๋ค. ์ฃผ๋ก ํจ์์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ํจ์ ์ฅ์์๋ผ๊ณ ๋ง์ด ํ๋ค.
@ ๊ธฐํธ๋ก ์์ํ๋ค.
์ด ๋ URL '/' ๋ ๋ค์ ํ์ ์๋ ํจ์์ ์ด์ด์ง๋ค. URL ์์ฒญ์ด ๋ค์ด์์ ๋ ์ด๋ค ํจ์๋ฅผ ํธ์ถํ ๊ฒ์ธ์ง ์กฐ์ ํ๋ค. ์ด ๋ ์ฅ์์๋ ํจ์์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๋ ๊น์ง ๋๊ธฐํ๋ค๊ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ฉด ๋๊ธฐ ์ค์ธ ์น ๋ธ๋ผ์ฐ์ ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
'/' URL๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์๋ฒ ์์ฒญ์๋ ํจ์๋ฅผ ๋ฐํํ๋ฉฐ ๊ทธ ์ธ์ URL๋ก ๋ค์ด์ค๋ ์์ฒญ์๋ 404
Resource not found
์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค.
8 : ์น์ฑ ์คํ ์์ฒญ

ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ฉด ํ๋ผ์คํฌ ์น ์๋ฒ๊ฐ ์คํ๋๋ฉฐ ํ๋ผ์คํฌ์ ํ ์คํธ ์น ์ฃผ์(127.0.0.1)์ ํ๋กํ ์ฝ ํฌํธ ๋ฒํธ(5000)๋ก ์๋น์ค ์น ์์ฒญ์ ๊ธฐ๋ค๋ฆฐ๋ค๋ ๋ฉ์์ง๊ฐ ๋ํ๋๋ค.

์น์ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
4์ฅ์์ ๋ง๋ค์๋ vsearch ๋ชจ๋์ ์ด์ฉํด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.
from flask import Flask
from vsearch import search4letters
app = Flask(__name__)
@app.route('/')
def hello() -> str:
return "Hello world from Flask!"
@app.route('/search4')
def do_search() -> str:
return str(search4letters('lif, the universe, and everything', 'eiru'))
app.run()
์ด ๋
app.run(debug=True)
๋ก ์ค์ ํ๊ฒ ๋๋ฉด, ์ฝ๋๋ฅผ ๊ณ ์น ๋๋ง๋ค ์ฌ์คํ ํ์ง ์์๋ ์น ์๋ฒ๊ฐ ์์์ ๋ฆฌ๋ก๋ ๋๋ค.

127.0.0.1
์ localhost๋ผ ์๋ ค์ง ์ธํฐ๋ท์ ๋ฃจํ๋ฐฑ ์ฃผ์๋ฅผ ์๋ฏธํ๋ค. ์ด ์ฃผ์๋ IP์ ๊ด๊ณ์์ด ๋ด ์ปดํจํฐ๋ฅผ ์ง๋ชฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.5000
์ ์น ์๋ฒ๊ฐ ์คํ ์ค์ธ ํ๋กํ ์ฝ ํฌํธ ๋ฒํธ๋ฅผ ์๋ฏธํ๋ค. ๋ณดํต ์น์๋ฒ๋80
์ด๋ผ๋ ํฌํธ ๋ฒํธ์์ ์คํ๋๋ฉฐ, ์น์ฑ์ ๊ฐ๋ฐํ๋ ๋์์๋80
๋ฒ์ ์ฐ์ง ์๋ ๊ฒ์ด ๊ด๋ก์ด๋ค.8080
๋ฒ ํฌํธ๊ฐ ๊ฐ๋ฐ ์ ์์ฃผ ์ฌ์ฉํ๋ ํฌํธ ์ค ํ๋์ด๋ค. ํ๋ผ์คํฌ๋ ํ ์คํธ ํ๋กํ ์ฝ ํฌํธ๋ก5000
๋ฒ์ ์ฌ์ฉํ๋ค.
ํ ํ๋ฆฟ ์์ง
HTML์ ์ฝ๋์ ์์ฑํ๋ ๊ฒ์ ์๋ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ง๋ง ํ์ฅ์ฑ์ ๋จ์ด์ง๋ค. ์น์ฑ์ด ๋ ์ปค์ง์๋ก ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ฉฐ ์ด๋ฅผ ์น ๋์์ด๋์๊ฒ ๋๊ฒจ์ ๊ฐ์ ํ๊ธฐ๋ ์ด๋ ต๋ค
๋ฐ๋ผ์ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ค
ํ๋ก๊ทธ๋๋จธ๊ฐ ์น ํ์ด์ง ๊ฐ์ ํ ์คํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ์ฒด ์งํฅ ๊ฐ๋ ์ ์ ์ฉํ ์ ์๋๋ก ํ๋ค.
๋ค์๊ณผ ๊ฐ์ ์ต์์ ํ ํ๋ฆฟ์ ์์ฑํ๋ค. ์ดํ ์ฌ๋ฌ ํ์ ํ ํ๋ฆฟ์ด ์ถ๊ฐ๋๋ค.
<!doctype html>
<html>
<head>
<title>{{ the_title }}</title>
<link rel="stylesheet" href="static/hf.css" />
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
5 : css๋ html์ ์คํ์ผ์ ๊ฒฐ์ ํ๋ ํ ์คํธ๋ก ์ฌ๊ธฐ์๋ hf.css๋ฅผ ์ฌ์ฉํ ๊ฒ์ผ๋ก ๋ช ์ํ๊ณ ์๋ค.
8, 10 : block body ๊ณผ endblock ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํ ํ๋ฆฟ์ ํ์ฅํ ๊ฒ์ ๋ช ์ํ๊ณ ์๋ค.
๋ค์์ ๊ธฐ๋ณธ ๋ฒ ์ด์ค ํ ํ๋ฆฟ
bast.html
์ block body์ endblock ์ฌ์ด์ ๋ค์ด๊ฐ ์ ์๋entry.html
๊ณผresults.html
์ด๋ค.
{% extends 'base.html' %}
{% block body %}
<h2>{{ the_title }}</h2>
<p>You submitted the following data:</p>
<table>
<tr><td>Phrase:</td><td>{{ the_phrase }}</td></tr>
<tr><td>Letters:</td><td>{{ the_letters }}</td></tr>
</table>
<p>When "{{the_phrase }}" is search for "{{ the_letters }}", the following
results are returned:</p>
<h3>{{ the_results }}</h3>
{% endblock %}
{% extends 'base.html' %}
{% block body %}
<h2>{{ the_title }}</h2>
<form method='POST' action='/search4'>
<table>
<p>Use this form to submit a search request:</p>
<tr><td>Phrase:</td><td><input name='phrase' type='TEXT' width='60'></td></tr>
<tr><td>Letters:</td><td><input name='letters' type='TEXT' value='aeiou'></td></tr>
</table>
<p>When you're ready, click this button:</p>
<p><input value='Do it!' type='SUBMIT'></p>
</form>
{% endblock %}

HTTP ์ํ ์ฝ๋
GET ๋ฉ์๋
๋ธ๋ผ์ฐ์ ๊ฐ ์น ์๋ฒ๋ก ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ ๋ฉ์๋
POST ๋ฉ์๋
๋ธ๋ผ์ฐ์ ๊ฐ HTTP๋ฅผ ํตํด ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ฉ์๋
Render_Template
๋ค๋ฅธ ํ ํ๋ฆฟ์ผ๋ก ๋์ ๋ณ์๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉํ ์ ์๋ค
๋ง์ง๋ง์
,
๋ฅผ ๋ช ์ํด์ค์ผํ๋ค.
return render_template('results.html', the_phrase = phrase, the_letters =letters, the_title=title, the_results=results,)
Redirect
redirect๋ฅผ ์ด์ฉํด์ URL('/') ์ URL('/entry')๋ก redirectํ ๋ชจ์ต
@app.route('/')
def hello() -> '302':
return redirect('/entry')
์ด๋ ์๋์ ๊ฐ์ด ๋ฐ๊ฟ์ ์ธ ์ ์๋ค.
@app.route('/')
@app.route('/search4', methods=['POST'])
์ต์ข ์ฝ๋
vsearch4web.py
from flask import Flask, render_template, request, redirect
from vsearch import search4letters
app = Flask(__name__)
@app.route('/')
@app.route('/search4', methods=['POST'])
def do_search() -> str:
phrase = request.form['phrase']
letters = request.form['letters']
title = 'Here are your results'
results = str(search4letters(phrase, letters))
return render_template('results.html', the_phrase = phrase, the_letters =letters, the_title=title, the_results=results,)
@app.route('/entry')
def entry_page() -> 'html':
return render_template('entry.html', the_title='Welcome to search4letters on the web!')
app.run(debug=True)
app.run()
๋ฐฐํฌ์์๋
app.run()
์ ์คํํ ๊ฒฝ์ฐ ์น์ฑ ์คํ์ด ๊ฑฐ์ ๋๋ค. ์ด๋ ํ์ด์ฌ์ ๋์จ์ด์์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ.๊ทธ๋ฌ๋ ๋๋ฒ๊น ๋ฐ ๊ฐ๋ฐ์์๋
app.run()
์ ์ฌ์ฉํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๊ฐ๋ฐ์์๋ง ์คํํ๊ฒ ๋๋ค.
if __name__ = '__main__':
app.run(debug=True)
Last updated
Was this helpful?