기초 설명
RESTful API
- REST: Representational State Transfer의 약자
- HTTP 프로토콜을 따르는 웹 서비스의 아키텍처 스타일 중 하나
- RESTful API: 자원(resource)을 이름으로 구분하여, 해당 자원의 상태(Representation)를 주고 받는 것을 의미
- 이러한 방식은 웹 브라우저, 모바일 애플리케이션 등 다양한 클라이언트와 통신하는 웹 어플리케이션에서 표준
- RESTful API는 단순하면서도 확장성이 뛰어나며, 다양한 클라이언트에서 호환되기 때문에 인기 있는 아키텍처 스타일 중 하나
사용법
루트 경로('/')로 요청이 들어오면 'Hello, World!'라는 문자열을 반환하는 간단한 Flask 앱
from flask import Flask
app = Flask(__name__, static_folder=~~~, )
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
Flask(__name__)
을 통해 Flask 애플리케이션을 생성합니다. 이때 인자로 전달한 name은 애플리케이션의 모듈명을 의미합니다.
@app.route('/')
를 통해 "/" 경로로 들어오는 요청에 대해 어떤 함수를 실행할지 설정합니다.
- hello_world() 함수에서는 "Hello, World!" 문자열을 반환하여 요청에 대한 응답을 반환합니다.
- app.run()을 통해 애플리케이션을 실행합니다.
- static_folder
- 정적 파일을 저장하는 폴더를 지정합니다.
- 여기에는 이미지, 스타일 시트, 자바스크립트 파일 등이 포함됩니다. 기본값은 static입니다.
- template_folder
- HTML 템플릿 파일을 저장하는 폴더를 지정합니다.
- 여기에는 Flask에서 렌더링할 HTML 파일이 포함됩니다.
- 기본값은 templates입니다.
HTTP 메소드 지정
- /login' 경로로 GET 요청이 들어오면 로그인 폼을 보여주고, POST 요청이 들어오면 로그인을 처리
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
else:
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=password name=password>
<p><input type=submit value=Login>
</form>
'''
템플릿 렌더링
'/hello/<name>'
경로로 요청이 들어오면 'hello.html' 템플릿을 렌더링하여 반환합니다. 템플릿에서는 name 변수를 사용할 수 있습니다.
from flask import render_template
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
- JSON 데이터 return
- 위 코드는 '/api/users' 경로로 요청이 들어오면 JSON 형식으로 사용자 목록을 반환합니다.
from flask import jsonify
@app.route('/api/users')
def get_users():
users = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 30}]
return jsonify(users)
구체적 함수
Flask
- Flask 클래스는 웹 애플리케이션을 만드는 데 사용되는 핵심 클래스로, Flask 애플리케이션 객체를 생성하는 역할을 합니다.
- Flask 클래스를 사용하면 라우트 처리, 요청 및 응답 처리, 템플릿 렌더링 등을 처리할 수 있습니다.
jsonify
- JSON 응답을 생성하기 위한 Flask 내장 함수 중 하나입니다.
- 딕셔너리나 리스트 등의 객체를 JSON 형태로 변환하여 HTTP 응답 객체를 생성합니다.
from flask import jsonify
@app.route('/json')
def return_json():
data = {'name': 'Alice', 'age': 20}
return jsonify(data)
make_response
- HTTP 응답 객체를 생성하는 함수입니다.
- make_response 함수는 응답 헤더와 본문을 구성하는 파라미터를 받아서 HTTP 응답 객체를 반환합니다.
from flask import make_response
@app.route('/response')
def return_response():
data = 'This is response data'
response = make_response(data)
response.headers['Content-Type'] = 'text/plain'
return response
render_template
- Flask 내장 함수 중 하나로, 템플릿 엔진을 이용하여 HTML 페이지를 렌더링하는 함수입니다.
- render_template 함수는 HTML 템플릿 파일 이름과 함께 HTML 페이지를 반환합니다.
from flask import render_template
@app.route('/template')
def return_template():
name = 'Alice'
return render_template('template.html', name=name)
request
- 현재 요청에 대한 정보를 담고 있는 객체입니다.
- Flask 애플리케이션에서 요청 객체는 flask.request를 통해 사용할 수 있습니다.
- request 객체는 HTTP 메소드, URL, 쿠키, 세션, 데이터 등을 포함합니다.
- 예를 들어, HTTP GET 메소드로 /search URL에 접근하는 경우, request 객체는 다음과 같은 정보를 담고 있습니다.
from flask import request
@app.route('/search')
def search():
keyword = request.args.get('q', '')
return f'Searching for: {keyword}'
- args는 URL의 쿼리 파라미터를 딕셔너리 형태로 담고 있습니다.
- 위 코드에서는 q라는 이름의 쿼리 파라미터 값을 가져와 keyword 변수에 저장하고 있습니다.
- 이렇게 request 객체를 사용하여 클라이언트가 보낸 데이터를 가져올 수 있습니다.
url_for
- 라우트 함수명을 사용하여 해당 라우트의 URL을 생성하는 함수입니다.
- 라우트 함수명 대신, URL 패턴 이름을 사용하여 URL을 생성하는 것도 가능합니다.
- 다음과 같이 url_for 함수를 사용하여 index 뷰 함수의 URL을 생성할 수 있습니다.
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
pass
with app.test_request_context():
print(url_for('index'))
- url_for 함수는 첫 번째 인자로 생성할 URL의 뷰 함수명을 받습니다.
- 뷰 함수명은 문자열로 전달됩니다.
- 이 함수를 호출할 때, Flask는 URL을 생성하기 위해 현재 요청 컨텍스트에서 URL 빌드를 시작합니다.
- 요청 컨텍스트가 없는 경우 test_request_context 메서드를 사용하여 가상 요청 컨텍스트를 만들 수 있습니다.
- 이렇게 생성된 URL은 print 함수로 출력됩니다.