본문 바로가기
카테고리 없음

플러거블 뷰(Pluggable Views)

by sophia02 2022. 9. 2.

함수 대신 클래스를 기반으로 하는 장고의 제네릭 뷰에 영감을 받아 플라스크에서 도입한 것이 '플러거블 뷰' 라고 합니다

=> 말 그대로 끼워넣는 뷰로 사용자가 정의 가능한 뷰를 가질 수 있습니다.

 

class View

플러거블 뷰를 사용하기 위해서는 먼저 view를 상속받은 클래스를 만들고 dispatch_request()를 구현해야 합니다.

플러거블 뷰를 사용하기 전 먼저 view를 상속받은 클래스를 만들고 dispatch_request()를 구현해야 합니다

 

@app.route('/users/')
def show_users(page):
    users = User.query.all()
    return render_template('users.html', users=users)

이를 view로 바꾸기 위해서는

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()클래스 메소드를 사용해 실제 뷰 함수로 변환해야 합니다

 

그 함수로 전달하는 문자열은 뷰가 가질 end-point의 이름입니다.

위의 코드를 조금 바꿔보자면

from flask.views import View

class ListView(View):

    def get_template_name(self):
        raise NotImplementedError()

    def render_template(self, context):
        return render_template(self.get_template_name(), **context)

    def dispatch_request(self):
        context = {'objects': self.get_objects()}
        return self.render_template(context)

class UserView(ListView):

    def get_template_name(self):
        return 'users.html'

    def get_objects(self):
        return User.query.all()

이렇게완성됩니다.