关于Flask 视图介绍

作者:tigeriaf 时间:2022-10-21 15:07:34 

1、视图函数

之前的文章说过,在 Flask 中路由是请求的 url 与处理函数之间的映射,使用app.route装饰器将处理函数和 url 绑定,路由绑定的处理函数就被成为视图函数。


@app.route('/user/<name>')

def hello_user(name):

return 'Hello {}!'.format(name)

上面的hello_user()函数就是一个简单的视图函数。

当然我们也可以不使用app.route装饰器,使用app.add_url_rule()方法也可将视图函数和 url 进行绑定,实际上装饰器app.route也是调用的app.add_url_rule()方法。


def hello():

return 'hello Flask!'

app.add_url_rule('/hello', view_func=hello)

通过app.add_url_rule()方法,可以将路由同视图分开,方便将路由进行统一管理。

2、类视图

我们之前包括上面使用的,都是基于函数的视图,这虽然是最简单便捷的用法,但是不容易扩展,其实视图函数也可以基于类来实现,好处就是类支持继承,可以把一些共性的代码放在父类中,其他子类可以继承,在某些情况下,使用类更合理,更易于扩展。

类视图分为标准类视图和基于调度方法的类视图,下面分别介绍一下。

2.1 标准类视图

标准类视图的写法:

  • 父类必须继承 flask.views.View

  • 子类实现dispatch_request()方法,完成自身的业务逻辑并返回结果

  • 子类使用app.add_url_rule()进行注册,其中view_func参数使用as_view()方法做类方法转换

  • 如果注册时指定了endpoint参数,endpoint的值会覆盖指定的视图名称,使用url_for时就必须使用endpoint指定的值

具体使用方式如下:


from flask.views import View

class ParentView(View):

def __init__(self):

super().__init__()

# 公共部分信息

self.public_data = 'Flask Web App'

class Index(ParentView):

methods = ['GET']

def dispatch_request(self):

return self.public_data + " index"

class User(ParentView):

methods = ['POST']

def dispatch_request(self):

return self.public_data + " user"

app.add_url_rule('/index', endpoint='index', view_func=Index.as_view('index'))

app.add_url_rule('/user', endpoint='user', view_func=User.as_view('user'))

上述代码中创建了一个 ParentView 类,继承自 flask.views.View 类,然后创建了 Index User 两个类继承自 ParentView 类,并分别重写实现了dispatch_request()函数,使用了父类 ParentView 的属性public_data, 实现自己的业务逻辑。然后我们通过as_view()方法把类转换为实际的视图函数,as_view()必须传入一个唯一不重复的视图名。此后,这个视图由app.add_url_rule()方法和指定路由绑定。

类视图支持的 HTTP 请求方法由视图类变量methods指定,默认只支持 GET 请求。

2.1.1 基于方法的视图

如果视图支持多种 HTTP 请求方法的话,之前我们都是在视图函数中进行判断,根据不同的请求方法执行不同的业务逻辑,那有没有更简单的方法呢?是有的,Flask 中的方法类视图 flask.views.MethodView 就可以做到,它是 flask.views.View 的子类,通过定义和请求方式同名的小写方法来完成了逻辑处理,不必提供methods属性,每个 HTTP 方法都映射到一个具有相同名称(小写)的函数。

下面看下详细使用方法。


from flask.views import MethodView

class UserView(MethodView):

def get(self):

user_id = request.args.get("user_id")

return "Hello user:{}".format(user_id)

def post(self):

name = request.form.get("name")

password = request.form.get("password")

if name == "admin" and password == "123456":

return "hello admin!"

else:

return "not allow!"

app.add_url_rule('/user/get_info', view_func=UserView.as_view('get'))

app.add_url_rule('/user/login', view_func=UserView.as_view('post'))

代码中定义的get()函数用于处理 GET 请求,post()函数用于处理 POST 请求,代码中省去了 HTTP 请求方法的判断语句,而且是不是更加RESTFul一些了。

请求测试:

关于Flask 视图介绍

来源:https://juejin.cn/post/7032867176088338445

标签:Flask,视图
0
投稿

猜你喜欢

  • Oracle如何设置表空间数据文件大小

    2024-01-13 01:00:03
  • Python采集二手车数据的超详细讲解

    2022-09-23 00:58:22
  • adox 的vbs类,提取表名,列名等

    2008-07-02 12:37:00
  • js中更短的 Array 类型转换

    2024-04-28 09:47:22
  • python通过伪装头部数据抵抗反爬虫的实例

    2022-03-11 09:56:04
  • 数据库复制性能测试 推送模式性能测试

    2012-07-11 16:13:52
  • Django使用mysqlclient服务连接并写入数据库的操作过程

    2024-01-27 14:55:39
  • Python使用django获取用户IP地址的方法

    2021-07-22 04:01:05
  • MySQL查询性能优化索引下推

    2024-01-24 15:43:01
  • python进度条库tqdm的基本操作方法

    2021-03-02 08:31:22
  • MySQL单表查询进阶教程(最全面!)

    2024-01-22 21:06:42
  • python条件变量之生产者与消费者操作实例分析

    2023-05-06 02:06:42
  • 一种特别简单的MySQL数据库安装方法

    2008-12-17 15:30:00
  • 3种适用于Python的疯狂秘密武器及原因解析

    2023-02-08 09:10:30
  • Python做屏幕录制工具的实现示例

    2021-06-17 09:29:23
  • 网页中空格的烦恼

    2011-04-28 09:26:00
  • Linux PHP连接MSSQL

    2011-06-02 12:01:00
  • Python如何快速上手? 快速掌握一门新语言的方法

    2023-05-07 12:00:48
  • 听歌识曲--用python实现一个音乐检索器的功能

    2021-11-01 00:46:03
  • MySQL数据库表中的约束详解

    2024-01-28 16:39:17
  • asp之家 网络编程 m.aspxhome.com