欢迎访问宙启技术站
智能推送

MethodViewType()与普通函数视图的区别是什么

发布时间:2023-12-17 09:23:47

MethodViewType() 是 Flask 框架提供的类,用于创建基于类的视图。与普通函数视图不同,基于类的视图可以将请求的处理逻辑封装在类的方法中,更加直观和灵活。下面将详细介绍 MethodViewType() 与普通函数视图的区别,并给出使用例子。

1. 封装请求处理逻辑

在普通函数视图中,处理请求的逻辑通常写在函数体内,包括请求的方法、参数的获取、业务逻辑的处理等。而在基于类的视图中,可以将请求的处理逻辑封装在类的方法中,提高代码的可读性和可维护性。

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

app = Flask(__name__)

# class-based view
class UserView(MethodView):
    def get(self, user_id):
        user = query_user_from_database(user_id)
        return render_template('user.html', user=user)

    def post(self):
        user_data = request.form
        save_user_to_database(user_data)
        return redirect(url_for('user_list'))

app.add_url_rule('/user/<int:user_id>', view_func=UserView.as_view('user'))
app.add_url_rule('/user', view_func=UserView.as_view('user_list'))

# function-based view
@app.route('/user/<int:user_id>', methods=['GET'])
def user(user_id):
    user = query_user_from_database(user_id)
    return render_template('user.html', user=user)

@app.route('/user', methods=['POST'])
def create_user():
    user_data = request.form
    save_user_to_database(user_data)
    return redirect(url_for('user_list'))

2. 支持多个 HTTP 方法

MethodViewType() 支持基于类的视图处理多个 HTTP 方法。通过在类方法上添加装饰器,指定该方法处理的请求方法,可以实现不同的请求分发逻辑。而普通函数视图则需要通过路由函数的装饰器实现不同的请求分发。

# class-based view
class UserView(MethodView):
    def get(self, user_id):
        user = query_user_from_database(user_id)
        return render_template('user.html', user=user)

    def post(self):
        user_data = request.form
        save_user_to_database(user_data)
        return redirect(url_for('user_list'))

app.add_url_rule('/user/<int:user_id>', view_func=UserView.as_view('user'))
app.add_url_rule('/user', view_func=UserView.as_view('user_list'))

# function-based view
@app.route('/user/<int:user_id>', methods=['GET'])
def user(user_id):
    user = query_user_from_database(user_id)
    return render_template('user.html', user=user)

@app.route('/user', methods=['POST'])
def create_user():
    user_data = request.form
    save_user_to_database(user_data)
    return redirect(url_for('user_list'))

3. 类视图可以复用

由于类视图的请求处理逻辑封装在类的方法中,不同的类方法可以处理不同的请求,实现了逻辑的复用。而函数视图则需要通过 if-else 或者 switch-case 来处理不同的请求。

# class-based view
class UserListView(MethodView):
    def get(self):
        # retrieve all users from database
        users = query_all_users_from_database()
        return render_template('user_list.html', users=users)

    def post(self):
        user_data = request.form
        save_user_to_database(user_data)
        return redirect(url_for('user_list'))

app.add_url_rule('/user', view_func=UserListView.as_view('user_list'))

# function-based view
@app.route('/user', methods=['GET', 'POST'])
def user_list():
    if request.method == 'GET':
        users = query_all_users_from_database()
        return render_template('user_list.html', users=users)
    elif request.method == 'POST':
        user_data = request.form
        save_user_to_database(user_data)
        return redirect(url_for('user_list'))

总结来说,MethodViewType() 是 Flask 框架提供的用于创建基于类的视图的类。相较于普通函数视图,基于类的视图可以将请求的处理逻辑封装在类的方法中,支持多个 HTTP 方法,以及逻辑的复用,提高代码的可读性和可维护性。