您当前的位置: 首页 >  flask

IT之一小佬

暂无认证

  • 3浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Flask框架中类视图使用方法详解

IT之一小佬 发布时间:2022-08-14 22:07:52 ,浏览量:3

        以往使用的视图都是函数,一般称为视图函数。在Flask框架中视图还可以使用类来实现,使用类视图还是和函数视图有区别的,需要写完类视图后再通过app.add_url_rule(url_rule,view_func)来进行注册。

一、标准类视图

        标准类视图是继承自flask.views.View,并且在子类中必须实现dispatch_request方法,这个方法类似于视图函数,也要返回一个基于Response或者其子类的对象。

示例代码:

from flask import Flask, render_template
from flask.views import View

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


class PersonView(View):
    def dispatch_request(self):
        return '我是标准类视图'


# 类视图通过add_url_rule方法和url做映射, 注意:user后面的斜杠不能去掉
app.add_url_rule('/user/', view_func=PersonView.as_view('personalview'))

if __name__ == '__main__':
    app.run()

运行效果:

二、基于调度方法的视图

        Flask框架还提供了另外一种类视图flask.views.MethodView,对每个HTTP方法执行不同的函数(映射到对应方法的小写的同名方法上)。

示例代码:

from flask import Flask, render_template, request
from flask.views import MethodView

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


class LoginView(MethodView):
    # 当客户端页面请求访问时执行get函数
    def get(self):
        return render_template('login.html')

    # 当客户端向页面发送数据post请求时执行post函数
    def post(self):
        name = request.form.get('name')
        password = request.form.get('password')
        if name == 'dgw' and password == '666':
            return '登录成功!'
        else:
            return '用户名或密码错误!'


# 类视图通过add_url_rule方法和url做映射, 并且在as_view方法中指定url的名称,方便url_for函数的调用
app.add_url_rule('/login/', view_func=LoginView.as_view('loginview'))

if __name__ == '__main__':
    app.run()

当方式get请求时,运行效果:

 当方式post请求时,运行效果:  【使用postman工具发起post请求】

当使用类视图时,也可以使用装饰器。如在做权限验证的时候。

        装饰器功能写完后,在类视图中定义一个属性叫做decorators,然后存储装饰器。以后每次调用这个类视图的时候,就会执行这个装饰器。

check_auth.py

from flask import session


def login_required(func):
    def wrapper(*args, **kwargs):
        if not session.get("user_id"):
            return 'auth failure'
        return func(*args, **kwargs)
    return wrapper

main.py

from flask import Flask, render_template, request
from flask.views import MethodView
from check_auth import login_required

app = Flask(__name__)


@app.route('/')
def index():
    return render_template('index.html')


class LoginView(MethodView):
    decorators = [login_required]

    # 当客户端页面请求访问时执行get函数
    def get(self):
        return render_template('login.html')

    # 当客户端向页面发送数据post请求时执行post函数
    def post(self):
        name = request.form.get('name')
        password = request.form.get('password')
        if name == 'dgw' and password == '666':
            return '登录成功!'
        else:
            return '用户名或密码错误!'


# 类视图通过add_url_rule方法和url做映射, 并且在as_view方法中指定url的名称,方便url_for函数的调用
app.add_url_rule('/login/', view_func=LoginView.as_view('loginview'))

if __name__ == '__main__':
    app.run()

运行效果:

关注
打赏
1665675218
查看更多评论
立即登录/注册

微信扫码登录

0.0779s