Flask 기초 (Feat.VSC)
플라스크는 Python의 마이크로 웹 프레임워크이다. 다양한 웹 엔진과 붙여서 쓸 수 있고 또 가볍다.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
if __name__ == "__main__":
app.run()
route() 데코레이터를 사용하여 지정한 URL을 Flask 에게 알린다.
이 함수는 사용자의 브라우저에 표시하려는 메시지를 반환한다.
app = Flask(__name__) 으로 Flask 클래스를 가져와 app.run() 으로 실행
해당 서버를 다른 컴퓨터도 접속할 수 있도록 공개하는 방법은 $ flask run --host=0.0.0.0
웹 애플리케이션에서 클라이언트가 서버에 보내는 데이터에 대해 반응하는 것이 중요한데 Flask는 request 객체를 제공한다.
from flask import request
with app.test_request_context('/hello', method='POST'):
assert request.path == '/hello'
assert request.method == 'POST'
이와 같이 요청 객체에 접근할 수 있다.
request 객체
@app.route('/login', methods=['POST', 'GET'])
def login():
error = None
if request.method == 'POST':
if valid_login(request.form['username'],
request.form['password']):
return log_the_user_in(request.form['username'])
else:
error = 'Invalid username/password'
return render_template('login.html', error=error)
form 속성에 키가 없으면 Keyerror 가 발생한다. 이 에러를 캐치할 수 있지만 그렇게 하지 않으면 HTTP 400 오류 페이지를 대신 표시
URL(?key=value)에 제출된 매개변수에 액세스 하려면 args 속성을 사용할 수 있다. searchword = request.args.get('key', '')
파일 업로드
enctype="multipart/form-data 양식으로 전송받아 처리
from flask import request
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/uploaded_file.txt')
...
파일의 정보를 알고 싶다면 file.filename 과 같은 속성에 액세스 할 수도 있다. 하지만 이 값은 위조될 수 있으니 절대로 신뢰하는건 x
쿠키
쿠키에 액세스하려면 cookies 속성을 사용할 수 있다.
쿠키를 설정하려면 set_cookie 메소드를 사용할 수 있다.
from flask import request
@app.route('/')
def index():
username = request.cookies.get('username')
# 쿠키가 없다면 KeyError
아래는 쿠키 저장이다.
from flask import make_response
@app.route('/')
def index():
resp = make_response(render_template(...))
resp.set_cookie('username', 'the username')
return resp
JSON을 포함된 API
API를 작성할 때 일반적으로는 JSON 이 응답 형식이다.
Flask로 이런 API 작성이 쉬우며 딕셔너리로 반환하면 JSON 응답으로 변환된다.
@app.route("/me")
def me_api():
user = get_current_user()
return {
"username": user.username,
"theme": user.theme,
"image": url_for("user_image", filename=user.image),
}