9Flask实战第9天:类视图

Posted sellsa

tags:

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

之前我们接触的视图都是函数,所以一般简称为视图函数。其实视图函数也可以基于类来实现,类视图的好处是支持继承,写完类视图需要通过app.add_url_rule(url_rule, view_func)来进行注册

标准类视图

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

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

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

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

...
from flask import 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

技术分享图片

对比类视图和函数视图,似乎类视图用起来的比麻烦。其实在很多场景是有用处的,因为类可以继承,这里我们来举个例子:
比如在登录页面和注册页面,我们都放一个同样的广告,如果我们是视图函数,就需要这样写:

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

 

基于调度方法的类视图

。。。

 

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

2018年最新大数据24期实战项目 9天 附课件源码

100天精通Oracle-实战系列(第9天)SQLPlus 基础使用和进阶玩法

Flask实战第6天:视图函数Response返回值

1Django实战第1天:建立项目mxonline

Flask企业级论坛实战目录导航

Flask企业级论坛实战目录导航