类视图

Posted sellsa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类视图相关的知识,希望对你有一定的参考价值。

Flask中默认使用的视图是函数,所以一般简称为视图函数。其实视图也可以基于类来实现,类视图的好处是支持继承写完类视图需要通过app.add_url_rule(url_role, view_func)来与url映射

 

标准类视图

1、标准类视图必须继承flask.views.View

2、必须实现dispatch_request方法,请求过来后都会执行这个方法,这个方法的返回值相当于视图函数一样。也必须返回Response或者子类的对象,字符,元祖

3、必须通过add.add_url_rule(rule,endpoint,view_func)来做url与视图的映射,view_func这个参数需要使用as_view类方法转换

4、如果指定了endpoint,那么在使用url_for反转的时候就必须使用endpoint指定的值;如果没有指定endpoint,就可以使用as_view(视图名字)中指定的视图名字来作为反转

from flask import Flask, views
...
class ListView(views.View):
    def dispatch_request(self):
        return ‘my list‘

app.add_url_rule(rule=‘/list/‘, endpoint=‘list‘, view_func=ListView.as_view(‘list‘))

 

view_func=ListView.as_view(‘list‘)为什么要这样用呢?

这是因为view_func是接收函数的,而ListView是一个类,通过as_view方法转换出来的就是一个函数,而这个函数实际上就是dispatch_request,里面的‘list‘是给这个视图函数取的一个名字。我们可以按住ctrl点击as_view查看源码,就知道返回的是dispatch_request

技术分享图片

 

对比类视图和函数视图,似乎类视图用起来比较麻。其实在很多场景是很有用处的,因为累可以继承,我们这里举个例子:

比如在登录页面和注册页面,我们都放一个同样的广告,如果我们是函数视图,就需要这样写:

###login.index###
<p>这是登录页面</p>
{{  ads }}

## register.html###
<p>设置注册页面</p>
{{ ads }}

########
@app.route(‘/login/‘)
def login():
    context = {
        ‘ads‘: ‘python入门到精通‘
    }
    return render_template(‘login.html‘, **context)

@app.route(‘/register/‘)
def register():
    context = {
        ‘ads‘: ‘Python入门到精通‘
    }
    return render_template(‘register.html‘, **context)

 

使用这种方法明显存在一个缺:就是当广告需要更换的时候,两个视图函数都需要更改,如果我们使用类视图,就可以利用继承来解决

class AdsView(views.View):
    def __init__(self):
        super().__init__()
        self.context = {
            ‘ads‘: ‘Python高级进阶‘
        }


class LoginView(AdsView):
    def dispatch_request(self):
        return render_template(‘login.html‘, **self.context)


class RegisterView(AdsView):
    def dispatch_request(self):
        return render_template(‘login.html‘, **self.context)


app.add_url_rule(rule=‘/login/‘, endpoint=‘login‘, view_func=LoginView.as_view(‘login‘))
app.add_url_rule(rule=‘/register/‘, endpoint=‘register‘, view_func=RegisterView.as_view(‘register‘))

  

 

以上是关于类视图的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

如何让片段中的多个视图调用片段类中声明的相同 onClick 函数?

片段上的 Mapbox 膨胀视图

片段内带有基本适配器的列表视图

如何在片段类的列表视图中显示 SQLite 数据库?

片段 - 全局视图变量与本地和内部类侦听器和内存泄漏