์ ์ฌ์๊ฐ์ด ๋๋ฉด ์ด๋ค ๋ฉ๋ด๋ฅผ ๋จน์์ง ๊ณ ๋ฏผ์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ Python๊ณผ Flask๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ ์ฌ๋ฉ๋ด ์ถ์ฒ ์น์ฌ์ดํธ(์น์ฑ)์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
Flask ์ค์น ๋ฐ ๊ตฌ์กฐ
์๋์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ Flask๋ฅผ ์ค์นํฉ๋๋ค.
pip install Flask
Flask๋ ์น ํ๋ ์์ํฌ๋ก, ๊ฐ๋จํ ์ฑ๋ถํฐ ๋ณต์กํ ์ฑ๊น์ง ๋ค์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. HTML, CSS, Javascript ๋ฑ์ ๋ํ ์ดํด๋ ์ด๋ ์ ๋ ์์ด์ผ ๊ด์ฐฎ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค ์ ์์ง๋ง, ๋ณดํต ๋ฌด๋ฃ๋ก ์ ๊ณตํ๋ ํ ํ๋ฆฟ์ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฉํ๋ฉด ๋๋ฑ ๋ง๋ค ์ ์์ต๋๋ค. Flask ์ฑ์ ์ต์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
app/
ใด static/ # css, js, ์ด๋ฏธ์ง ๋ฑ์ ์ ์ฅํ๋ ๋๋ ํ ๋ฆฌ์ ๋๋ค.
ใด style.css
ใด templates/ # HTML ํ์ผ์ ์ ์ฅํ๋ ๋๋ ํฐ๋ฆฌ์ ๋๋ค.
ใด index.html
ใด __init__.py # Flask ์ฑ์ ์์ฑํ๊ณ ์คํํ ๋ ์ฌ์ฉํ๋ ํ์ผ์ ๋๋ค
์ฝ๋์ ๊ด๋ฆฌ์ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌ๋ฅผ ์ํด __init__.py ์์ ์๋ ์ฝ๋๋ค์ views.py, app.py, model.py ๋ฑ์ผ๋ก ๋๋ ์ ์ ์ฅ์ ํ๊ธฐ๋ ํ์ง๋ง, ์ด๋ฒ ํ๋ก์ ํธ๋ ์ต์ํ์ ๋ ธ๋ ฅ์ผ๋ก ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค ใ ใ
๊ฐ๋จํ Flask App ๋ง๋ค๊ธฐ - ์ ์ฌ๋ฉ๋ด ์ถ์ฒ ์ฑ
__init__.py
from flask import Flask, render_template, request
import random
app = Flask(__name__) # Flask App ์์ฑํ๊ธฐ
# ์ ์ฌ ๋ฉ๋ด ์ถ์ฒ ํจ์
def select_menu():
menu_list = [
'์ง์ฅ๋ฉด', '์งฌ๋ฝ', 'ํ์์ก', '๋ณถ์๋ฐฅ', '์์ฅ๋ฐฅ', '์ผ๊ฒน์ด', '์นํจ', 'ํผ์', '์ด๋ฐฅ'
, '๊ฐ์ธ ๋', '์ ์ก๋ณถ์', '์์ ๊ตฌ์ด', '์๊ตญ์', '์๋๊ตญ', '๊น์น์ฐ๊ฐ', '๋๊น์ค', '์๋๋ถ์ฐ๊ฐ'
, '๋ถ๋์ฐ๊ฐ', 'ํ๋ฒ๊ฑฐ', '์นผ๊ตญ์', '๋ถ์', 'ํ
๋', '๊ณฐํ', '๊ฐ๋นํ', '์ฐ๋ญ', '๋ผ๋ฉ', '์๋ฌ๋', '์๋์์น']
return random.choice(menu_list) # ๋ฉ๋ด ๋ฆฌ์คํธ์์ ๋๋ค์ผ๋ก ํ๋ ๋ฝ๊ธฐ
# ์น ํ์ด์ง์ ๋ผ์ฐํ
์ค์
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
menu = select_menu()
return render_template('index.html', menu=menu) # menu๋ผ๋ ๋ณ์์ ์ ์ฅ๋ ๋ด์ฉ์ index.html์ ๋ฐ์
return render_template('index.html')
# ์ฑ ์คํ
if __name__ == '__main__':
app.run()
templates/index.html (์ธ์ฝ๋ฉ utf-8๋ก ์ ์ฅ ํ์)
<!DOCTYPE html>
<html>
<head>
<title>์ ์ฌ๋ฉ๋ด ์ถ์ฒ ์ฑ</title>
</head>
<body>
<h1>์ ์ฌ๋ฉ๋ด ์ถ์ฒ ์ฑ</h1>
{% if menu %}
<p>์ค๋์ ์ถ์ฒ ๋ฉ๋ด๋ {{ menu }}์
๋๋ค.</p>
{% endif %}
<form method="POST" action="/">
<button type="submit">๋ฉ๋ด ์ถ์ฒ๋ฐ๊ธฐ</button>
</form>
</body>
</html>
- {% if menu %}์ {% endif %} ํ๊ทธ๋ menu ๋ณ์๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ์๋ง ํด๋น HTML๋ด์ฉ์ ๋ ๋๋ง ํฉ๋๋ค.
- form ํ๊ทธ์์ method ์์ฑ์ HTTP ์์ฒญ ๋ฐฉ๋ฒ์ ์ง์ ํ๊ณ , action ์์ฑ์ ์์ฒญ์ ๋ณด๋ผ URL ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค.
- button ํ๊ทธ๋ฅผ ํด๋ฆญํ๋ฉด POST ์์ฒญ์ด ์ ์ก๋์ด __init__. py์ ์๋ `if request.method == 'POST'`์ ์ฝ๋๋ธ๋ก์ ์คํ์ํต๋๋ค
static/style.css
body {
font-family: Arial, sans-serif;
text-align: center;
}
h1 {
font-size: 2em;
}
button {
background-color: #4CAF50;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 20px 0;
cursor: pointer;
}
Flask App ์คํ
์์ ๋ด์ฉ๋๋ก ํ์ผ์ ์ ๋ถ ๋ง๋ค์๋ค๋ฉด, Flask ์ฑ์ ์คํ๋ง ํ๋ฉด ๋ฉ๋๋ค. __init__. py ํ์ผ์ด ์์นํ ๊ฒฝ๋ก์์ ํฐ๋ฏธ๋์ ์ด๊ณ ๋ค์ ์ปค๋งจ๋๋ฅผ ์ ๋ ฅํ๋ฉด ์๋์ด ๋ฉ๋๋ค:
export FLASK_APP=__init__.py
flask run
์๋์ด ์ ๋๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด python์ผ๋ก ์ง์ ์คํํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค:
python __init__.py
์คํ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค:
'Running on http://127.0.0.1:5000'
๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํด์ ํด๋น ์ฃผ์๋ก ์ด๋์ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์์ต๋๋ค:
๊ทธ๋ฆฌ๊ณ ๋ฉ๋ด ์ถ์ฒ๋ฐ๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด...
ํ๋ฒ๊ฑฐ๊ฐ ์ถ์ฒ์ด ๋๋ค์!
์ ๋ฆฌํ๊ธฐ
์ด๋ ๊ฒ Python์ผ๋ก๋ ๊ฐ๋จํ ์น์ฌ์ดํธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. HTML, CSS, JavaScript๋ฅผ ์ด๋ ์ ๋ ๋ค๋ฃจ์ค ์ ์๋ค๋ฉด ๋ ๋ฉ์ง ์น์ฌ์ดํธ๋ฅผ ์ ์ํ ์ ์์ ๊ฒ๋๋ค.
์ ๋ Flask App์ ์ฌ์ฉํด์ ํ์ฌ ๋ด๋ถ๋ง ์๋ฒ์ ๊ธฐ์ ์ฒดํ๊ด ์นํ์ด์ง๋ฅผ ์ ์ํ์ต๋๋ค. ์ฌ๋ด ์ง์๋ค์ด ์์ฐ์ด์ฒ๋ฆฌ ๊ธฐ์ ์ ์ฒดํํด ๋ณผ ์ ์๋๋ก ๋ฌธ์ ์์ฝ, ํค์๋ ์ถ์ถ, ํ์ฌ ํ๊น , ์๋ํด๋ผ์ฐ๋ ์์ฑ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ Flask ์ฑ์ผ๋ก ๊ตฌํ์ ํ์ต๋๋ค. ๋ํ๊ต ๊ณผ์ , ๊ฐ์ธ ํฌํธํด๋ฆฌ์ค, ์น์ฌ์ดํธ ๋ฑ ์ ์์ด ํ์ํ๋ค๋ฉด Flask๋ก ๊ตฌํ์ ํ๊ณ ๋ค๋ฅธ ์น ํธ์คํ ์ฌ์ดํธ๋ฅผ ํตํด ๋ฐฐํฌ (deploy)๋ฅผ ํ๋ฉด ๋ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ์ ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
'๐ป ITยท๊ธฐ์ ยทํต๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Tips] Python ๋ชจ๋ ์์น, ๋ฒ์ , ์์ ํด๋์์ ๋ถ๋ฌ์ค๊ธฐ (0) | 2023.03.26 |
---|---|
ChatGPT๋ก ์ธ๋ค์ผ ๋ง๋ค๊ธฐ (์ด๋ฏธ์ง ์์ฑ) (0) | 2023.03.21 |
Python์ผ๋ก ๊ฐ์ธ์ ๋ณด ๊ฐ๋ช ์ฒ๋ฆฌํ๊ธฐ (SHA-256) (0) | 2023.03.16 |
[Tips] Python์ค๋ฝ๊ฒ ์ฝ๋ ์์ฑํ๊ธฐ (0) | 2023.03.12 |
[Snippet] ์ํฉ๋ณ Tuple, List ๋ณํ ๋ฐฉ๋ฒ (0) | 2023.03.10 |
๋๊ธ