<aside> 🌈 목차
</aside>
플러거블 뷰는 클래스를 기반으로 한 장고 프레임워크의 제너릭 뷰에 영향을 받았다. 이 뷰의 목적은 구현체를 바꿀 수 있고 수정, 삽입이 가능한 뷰를 갖는 것이다.
데이터베이스에서 어떤 객체의 목록을 읽어 템플릿에 보여주는 함수는 아래와 같다.
@app.route('/users/')
def show_users(page):
users = User.query.all()
return render_template('users.html', users=users)
함수로 작성한 코드는 간단하고 유연하지만, 다른 모델이나 템플릿에 적용하고 싶다면 더 유연한 구조인 클래스 기반이 적합하다.
from flask.views import View
class ShowUsers(View):
def dispatch_request(self):
users = User.query.all()
return render_template('users.html', objects=users)
app.add_url_rule('/users/', view_func=ShowUsers.as_view('show_users'))
flask.views.View
의 서브클래스를 만들고 dispatch_request()
를 구현한 후
그 클래스를 as_view()
메소드를 사용해 실제 뷰 함수로 변환해야 한다.
클래스 기반의 뷰에서 self는 요청이 들어올 때마다 클래스의 새 인스턴스가 생성되고
클래스 기반의 뷰에서 요청이 들어올 때마다 클래스의 새 인스턴스가 생성되고 dispatch_request()
메소드가 호출된다. 클래스 자체로는 as_view()
에 넘겨지는 인자들을 가지고 인스턴스화된다.
app.add_url_rule('/users/', view_func=ShowUsers.as_view('show_users'))
삽입 뷰는 route()
나 methods()
속성 정보를 제공할 수 있다.
class MyView(View):
methods = ['GET', 'POST']
def dispatch_request(self):
if request.method == 'POST':
...
...
app.add_url_rule('/myview', view_func=MyView.as_view('myview'))
RESTful API에서 각 HTTP 메소드별로 다른 함수를 수행하는 것은 도움이 된다.
flask.views.MethodView
을 import하면 각 HTTP 메소드는 같은 이름의 함수로 연결되고,
methods 속성도 클래스에 정의된 메소드 기반으로 설정된다.
뷰 클래스는 자체로 데코레이팅할 수 없고 as_view()
의 리턴값을 데코레이팅해야 한다.
(*데코레이팅: 클래스나 함수 위에 선언하여 사용하는 것)