<aside> 🌈 목차

</aside>

📕 플러거블 뷰 (Pluggable Views)

플러거블 뷰는 클래스를 기반으로 한 장고 프레임워크의 제너릭 뷰에 영향을 받았다. 이 뷰의 목적은 구현체를 바꿀 수 있고 수정, 삽입이 가능한 뷰를 갖는 것이다.

기본원칙

데이터베이스에서 어떤 객체의 목록을 읽어 템플릿에 보여주는 함수는 아래와 같다.

@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()의 리턴값을 데코레이팅해야 한다. (*데코레이팅: 클래스나 함수 위에 선언하여 사용하는 것)

메소드 뷰 API