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 |