Python Flask中可插入视图和蓝图的区别

时间:2016-12-03 03:21:57

标签: python flask

Python Flask中PluggableViews和Blueprint之间的区别是什么?

2 个答案:

答案 0 :(得分:1)

我不知道比较它们是否正确,但

根据Flask Documentation

  

Flask 0.7引入了可插入视图,其灵感来自Django的通用视图,它们基于类而不是函数。主要目的是您可以替换部分实现,这种方式具有可自定义的可插入视图。

在该示例中,它在视图中定义 get_template_name 方法,并在其他视图中重新使用它。这是可插拔视图的用途。

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()

Flask蓝图只是组织大型项目的一种更简单的方法。他们没有为您提供Pluggable Views优惠功能。

from flask import Blueprint, render_template, abort
from jinja2 import TemplateNotFound

simple_page = Blueprint('simple_page', __name__,
                    template_folder='templates')

@simple_page.route('/', defaults={'page': 'index'})
@simple_page.route('/<page>')
def show(page):
    try:
        return render_template('pages/%s.html' % page)
    except TemplateNotFound:
        abort(404)

然后将这些蓝图注册到您的应用程序对象。

答案 1 :(得分:0)

就路由而言,可插入视图(又称基于类的视图)比蓝图要好得多,蓝图只是带有路由装饰器的一堆功能。

在可插入视图范例中,它通过在类中组织视图逻辑并将其子类化,从而促进代码重用代码。 URL路由是通过app.add_url_rule()调用注册的,这很不错,因为它遵循SOLID原则中的S(关注点分开)。在Blueprints方法中,每个前端视图逻辑都封装在视图函数中,因此不太适合代码重用。