[엘리스 AI 3기] Flask

홍의·2021년 11월 1일

Flask

목록 보기
1/1

Flask의 기본적인 문법 용어

name

# nmae.py
print(__name__) # __main__ 출력

# name2.py
def test():
	return __name__

# name3.py
import name2

print(name2.test()) # name2
  • __name__ 의 역할은 호출한 파일이름을 출력한다. 다만, 자기자신에서 호출하면 main을 반환.

__name__ 은 일반적으로 다른 모듈을 만들 때 디버깅이나 테스트용으로 쓰인다.

Decorator @

def nodeco1():
	return [10, 20, 30]

def nodeco2():
	return [20, 30, 40]

def add_nodeco():
	def wrapper(nodeco):
		print("이 배열의 합은", sum(nodeco1())) # sum에 nodeco2를 넣는 함수 작성 필요
	return wrapper

# 함수 자체를 넘겨준다. add의 반환값이 함수가 된다.
add_nodeco()(nodeco1) # 이 배열의 합은 60
add_nodeco()(nodeco2) # 이 배열의 합은 60 << 정확하게 나오게 하려면 add_nodeco 작성필요.

# Decorator를 사용하면?
def special(func) :
	def wrapper():
		x = func()
		print("이 함수의 결과는 :, sum(x))
	return wrapper

@special
def deco1():
	return [10, 20, 30]

@special
def deco2():
	return [20, 30, 40]

deco1() # 이 함수의 결과는 : 60
deco2() # 이 함수의 결과는 : 90
  • @를 쓰고 이름을 적어주면 역할을 넘겨준다.
  • 재사용이 가능하게끔 해준다!!

Flask에서의 Decorator

from flask import Flask # Flask라는 핵심 객체를 import

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

@app.route('/chicken')
def chicken():
    return '치킨...'

@app.route('/first')
def first():
    return 'first_page'

if __name__ == '__main__':
        app.run(debug=True)
  • 사용자가 네트워크 관련 구현을 할 필요 없이, 반환할 것만 명시하면 네트워크 관련 작업은 Flask가 알아서 처리해준다!!

💡 return에 html 태그들을 안써주는 이유는 웹은 서버에게 정보를 받으면 HTML/CSS/JS 코드를 웹에 그려낸다.


Flask 템플릿

Jinja란?

  • Flask에서 Html 문서를 렌더링하는 템플릿 엔진
  • templates/sample.html 생성 ( main.py와 templates는 동등한 위치에 있음)
<!-- templates/sample.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    {% for data in datas %} <!-- 주의: {% %} 중괄호와 %는 꼭 붙여 쓴다!! -->
        <p> {{ data }}</p>
    {% endfor %}
</body>
</html>
# main.py
from flask import Flask, render_template # render_template import
app = Flask(__name__)

@app.route('/')
def home():
		return render_template("sample.html", datas=arr) # dtaas=arr로 html 연결.

if __name__ == '__main__':
        app.run(debug=True)
  • html에서 {% %} 중괄호와 %는 꼭 붙여 쓴다!!
  • main.py에서 html로 연결해줄 때는 꼭 변수명을 잘 확인한다.
  • main.py에서 sample.html로 데이터가 넘어간다.
  • 결과물

Flask Input

Input

<!-- calculator.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p>{{method}} : {{value}}</p>
</body>
</html>
# main.py
from flask import Flask, render_template # Flask라는 핵심 객체를 import

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

@app.route('/add/<int:a>/<int:b>')
def add(a, b):
        return render_template("calculator.html", method="더하기", value=a+b)

app.route('/sub/<int:a>/<int:b>')
def sub(a, b):
        return render_template("calculator.html", method="빼기", value=a+b)

if __name__ == '__main__':
        app.run(debug=True)
  • URL로 값을 전해줄 수 있다. ex) http://127.0.0.1:5000/add/5/8
  • calculator.html을 재활용 할 수 있는 템플릿의 장점이 있다.
  • 결과

Flask SQL

SQL 읽기

# main.py
from flask import Flask, render_template
import sqlite3 as sql 

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

@app.route('/read')
def read():
    with sql.connect('rabbit.db') as con: # con은 연결 정보(성공적으로 연결되었다.)
        cur = con.cursor() # 쿼리 처리는 cur이 해준다.
        cur.execute('SELECT * FROM rabbitUser')
        result = cur.fetchall() # 결과물(검색연산)을 한번에 보낸다.
        print(result) # console로 출력된다.
    return "SQL읽기" # return을 안하면 에러나기때문에 아무값이나 넣어준다.

if __name__ == '__main__':
        app.run(debug=True)
  • with는 파일을 열때 open을 써주고 닫을때 close를 써주는 번거로움을 없애준다.
  • 데이터의 흐름
    1. User가 페이지(서버)에 접속한다.
    2. 페이지(서버)가 쿼리문을 DB에 날린다.
    3. DB가 결과를 서버에게 반환한다.
    4. 서버가 템플릿에 담아서 User에게 반환한다.
  • 결과 (비주얼 코드 Console)

SQL 쓰기

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- action의 url_for는 flask의 함수를 받아서 도메인을 자동으로 생성해준다. -->
    <form action="{{ url_for('adduser') }}" method="form"> 
        <h2>회원가입</h2>
        <p>ID<br />
            <input type="text" name="id"/>
        </p>
        <p>Password<br/>
            <input type="password" name="password"
        </p>
        <p>Name<br/>
            <input type="text" name="name"/>
        </p>
        <p>Telephone<br/>
            <input type="tel" name="telephone"/>
        </p>
        <p>
            <input type="submit" />
        </p>
    </form>
</body>
</html>
from flask import Flask, render_template, request # Flask라는 핵심 객체를 import
import sqlite3 as sql

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello, World!'

@app.route('/register')
def register_form():
    return render_template("register.html")

@app.route('/join', methods=['POST'])
def adduser():
    name = request.form["name"] # register.html에서 name을 통해 받아온다.
    id = request.form["id"]
    password = request.form["password"]
    telephone = request.form["telephone"]

    with sql.connect('rabbit.db') as con: # con은 연결 정보(성공적으로 연결되었다.)
        cur = con.cursor() # 쿼리 처리는 cur이 해준다.
        cur.execute('INSERT INTO rabbitUser(id, paswwrod, nickname, telephone) VALUES (?, ?, ?, ?)', (id, psssword, name, telephone))
        cur.commit() # 실제 결과를 반영한다.
    
    return "SQL쓰기"

if __name__ == '__main__':
        app.run(debug=True)
  • 결과 HTML
  • 결과 DB

profile
천천히 가더라도 멈추지 말자!!

0개의 댓글