본문 바로가기
FrameWork/Flask

Flask 기본

by mansoorrr 2024. 3. 25.

Flask

  • Python을 이용해 개발할 수 있는 프레임워크

 

[실행]

#test.py만들어서 실행되는지 확인
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
	return "hello flask"
    
if __name__ == "__main__":
	app.run(host="127.0.0.1", port="8080")

 

[라우팅]

  • @app("경로", methods=["GET", "POST", "PUT", "DELETE"])형식으로 작성 가능 
    • method가 GET, PUT, DELETE일 경우 인자를 받아올때 request.args.get(parameter)
    • method가 POST일 경우 request.get_json()으로 인자 값을 받아옴
from flask import Flask

app = Flask(__name__)

@app.route("/first")
def hello():
	return "hello flask"

# userId가 문자열일 경우
@app.route("/smile/userId")
def smile(): #함수 인자로 아무것도 안받아도 됨
	return "sjgflsiej"

# userId가 특정 타입으로 주어질 경우
@app.route("/smile/<int:userId>")
def smilenumber(userId): # 인자로 userId를 받아야 함
	return "11111111111"

if __name__ == "__main__":
	app.run(host="127.0.0.1", port="8080", debug=True) #debug=True로 설정해 주면 바로 반영

 

 

[REST API]

  • 흔히 알려진 CRUD
  • 서버와 통신하는 방법
  • pip install httpie를 통해 httpie를 사용할 수 있다.
  • httpie: default는 GET
    • http GET <URI>: 되는지 안되는지 여부
    • http -v GET <URI>: 어떤 데이터들이 전송되는지(head, body) 정보
  • flask.jsonify(<var>)
    • var를 json포맷으로 response
    • from flask import jsonify

[import]

  • from flask import <....>
    • jsonify(): json형태로 변환시킴
    • request(): URI의 파라미터값을 얻기위해 필요
    • render_template("파일명"): html을 띄우기 위해 필요
    • make_response({"success":True}, 200): 요청 받으면 {"success":True}와 status 200코드를 보내라
  • css를 설정하는 경우 static폴더를 만들어 그 안에 정리한다.
    • app = Flask(__name__, static_url_path = "/static") 으로 명시해 준다.
  • 보안(cors)
    • from flask_cors import CORS
    • CORS(app): 보안을 위해 app객체를 cors안에 넣는다
    • 이렇게 선언해 주면 모든 요청과 응답 헤더에 cors정보를 넣어 지원해

[html과 연결]

  •  반드시 templates폴더 안에 html파일들이 들어있어야 함

 

[Jinja2]

  • html에 반복문, 변수 등을 사용할 수 있게 하는 엔진
  • {{ 변수명 }}
  • { % 파이썬 코드 % }
  • .py의 render_template()안에 html에서 사용할 name=<변수값>을 넣어서 보내줘야 함
#--------------- variable.py
from flask import Flask, render_template


app = Flask(__name__, static_url_path="/static")

@app.route("/hello")
def var_hello():
	username = "minsoo"
	return render_template("variable.html", tomato=username, potato="fjsli", egg="egg") //html에 넣을 변수명

if __name__ == "__main__":
	app.run(host="localhost", port="8080", debug=True)


#----------------- variable.html
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>variable</title>
</head>
<body>
	variable html {{ tomato }} # variable.py에서 명시한 변수명 작성
	{{potato}}
	{{egg}}
</body>
</html>

 

  • 반복문
    •  html에 파이썬과 같은 for문을 작성할 수 있다.
    • endfor를 통해 끝내야 한다.
    • python처럼  length, enumerate가 동작하지 않는다.(다른 문법 필요)
#------------------- 기본 문법
{% for value in values %}
	<li>{{ value }}<li>
{% endfor %}

#------------------- variable.py
from flask import Flask, render_template


app = Flask(__name__, static_url_path="/static")

@app.route("/hello")
def var_hello():
	users = ["apple", "banana", "melon", "peach", "pear"] #리스트 생성
	return render_template("variable.html", users=users) #리스트 넘기기

if __name__ == "__main__":
	app.run(host="localhost", port="8080", debug=True)


#-------------------- variable.html
......생략
<body>
	# jinja 엔진 적용
	<ul>
	{% for user in users %}
		<li>{{ user }}</li>
	{% endfor %}
	</ul>
</body>
</html>

#-------------------- variable.html for문(range, length, enumerate)
.....생략

<body>
	<ul>
		{% for idx in range(users | length) %} #파이썬에서 for idx in range(len(users))와 같음
        	# 슬라이싱 가능
            # idx=0부터 시작
            # loop.index(루프횟수)를 직접 선언하면 1부터 시작됨
			<li>{{idx}} {{users[idx]}} {{loop.index}}</li>
		{% endfor %}
	</ul>
</body>
</html>

 

  • 조건문
    • {% if <condition> %} {% else %} {% elif %} {% endif %}

[Decorator]

  • 여러군데 동일하게 쓰이는것을 줄이기 위해 사용
  • 하나의 함수이다
  • @를 앞에 붙여서 씀
  • @app.errorhandler(에러코드): 오류 코드가 나오는 페이지 정보
  • before_first_request: 웹 실행시 가장 처음에만 실행 한번만!
  • before_request: HTTP요청 request들어올때마다 실행
  • after_request: request 요청에 대해 response하기 직전에 실행 > return response 해줘야 함

[logging]

  • 에러 로그를 남기기 위해 사용
  • import logging 라이브러리 사용
  • logging.basicConfig(filename=저장경로, level=logging.ERROR)형식으로 에러 수준을 정하여 로그 저장 가능
    • 에러수준: DEBUG > INFO > WARNING > ERROR > Critical
  • logging 자체 함수와 flask logging함께 사용
  • logging 자체 핸들러
    • FileHandler: 파일로 저장
    • RotatingFileHandler: 파일로 저장하되 파일 한개의 사이즈와 백업 갯수 지정(보통 이거 씀)
    • NTEventLogHandler: 윈도우 시스템에 남김
    • SysLogHandler: syslog로 남김
  • 보통 app.run(debug=False)시에 에러 기록하도록 코드 작성
from flask import Flask

app = Flask(__name__, static_url_path="/static")


if not app.debug:
	import logging
	from logging.handlers import RotatingFileHandler
	file_handler = RotatingFileHandler("day_server.log", maxBytes=2000, backupCount=10)
	file_handler.setLevel(logging.WARNING) #어느 에러레벨까지 로그로 저장할 것인지
	app.logger.addHandler(file_handler) #app의 로그를 file_handler수준으로 저장한다고 명시

@app.errorhandler(404)
def error_404(error):
	app.logger.error(error) #에러 로그화
	return "404 not found~~~"


if __name__ == "__main__":
	app.run(host="localhost", port="8080", debug=False) #로깅을 위해 debug=False

'FrameWork > Flask' 카테고리의 다른 글

초기 세팅  (0) 2024.04.17
Application Factory  (0) 2024.04.17