๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป IT·๊ธฐ์ˆ ·ํ†ต๊ณ„

[Python] ์ ์‹ฌ ๋ฉ”๋‰ด ์ถ”์ฒœํ•ด์ฃผ๋Š” ์›น์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ (ft. Flask)

by nowgeun 2023. 3. 20.
728x90

์ ์‹ฌ์‹œ๊ฐ„์ด ๋˜๋ฉด ์–ด๋–ค ๋ฉ”๋‰ด๋ฅผ ๋จน์„์ง€ ๊ณ ๋ฏผ์ด ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Python๊ณผ Flask๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์ ์‹ฌ๋ฉ”๋‰ด ์ถ”์ฒœ ์›น์‚ฌ์ดํŠธ(์›น์•ฑ)์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

Flask Python ๋ชจ๋“ˆ
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'

 

๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์ฃผ์†Œ๋กœ ์ด๋™์„ ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

 

Flask App์œผ๋กœ ๋งŒ๋“  ์ ์‹ฌ๋ฉ”๋‰ด ์ถ”์ฒœ ์•ฑ

 

 

๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋‰ด ์ถ”์ฒœ๋ฐ›๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด...

๋ฉ”๋‰ด ์ถ”์ฒœ๋ฐ›๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ ํ›„

ํ–„๋ฒ„๊ฑฐ๊ฐ€ ์ถ”์ฒœ์ด ๋๋„ค์š”!

 

์ •๋ฆฌํ•˜๊ธฐ

 

์ด๋ ‡๊ฒŒ Python์œผ๋กœ๋„ ๊ฐ„๋‹จํ•œ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTML, CSS, JavaScript๋ฅผ ์–ด๋Š ์ •๋„ ๋‹ค๋ฃจ์‹ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ๋ฉ‹์ง„ ์›น์‚ฌ์ดํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. 

 

์ €๋Š” Flask App์„ ์‚ฌ์šฉํ•ด์„œ ํšŒ์‚ฌ ๋‚ด๋ถ€๋ง ์„œ๋ฒ„์— ๊ธฐ์ˆ ์ฒดํ—˜๊ด€ ์›นํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋‚ด ์ง์›๋“ค์ด ์ž์—ฐ์–ด์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์„ ์ฒดํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์„œ ์š”์•ฝ, ํ‚ค์›Œ๋“œ ์ถ”์ถœ, ํ’ˆ์‚ฌ ํƒœ๊น…, ์›Œ๋“œํด๋ผ์šฐ๋“œ ์ƒ์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ Flask ์•ฑ์œผ๋กœ ๊ตฌํ˜„์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ•™๊ต ๊ณผ์ œ, ๊ฐœ์ธ ํฌํŠธํด๋ฆฌ์˜ค, ์›น์‚ฌ์ดํŠธ ๋“ฑ ์ œ์ž‘์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Flask๋กœ ๊ตฌํ˜„์„ ํ•˜๊ณ  ๋‹ค๋ฅธ ์›น ํ˜ธ์ŠคํŒ… ์‚ฌ์ดํŠธ๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ (deploy)๋ฅผ ํ•˜๋ฉด ๋” ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€