xshell 7/xftp 7必须更新最新版本
300 2023-04-03 04:00:20
1、视图函数
之前的文章说过,在 Flask 中路由是请求的 url 与处理函数之间的映射,使用app.route装饰器将处理函数和 url 绑定,路由绑定的处理函数就被成为视图函数。
?12345@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()
方法,可以将路由同视图分开,方便将路由进行统一管理。
我们之前包括上面使用的,都是基于函数的视图,这虽然是最简单便捷的用法,但是不容易扩展,其实视图函数也可以基于类来实现,好处就是类支持继承,可以把一些共性的代码放在父类中,其他子类可以继承,在某些情况下,使用类更合理,更易于扩展。
类视图分为标准类视图和基于调度方法的类视图,下面分别介绍一下。
标准类视图的写法:
flask.views.View
类dispatch_request()
方法,完成自身的业务逻辑并返回结果app.add_url_rule()
进行注册,其中view_func
参数使用as_view()
方法做类方法转换endpoint
参数,endpoint
的值会覆盖指定的视图名称,使用url_for
时就必须使用endpoint
指定的值具体使用方式如下:
?12345678910111213141516171819202122232425262728293031from
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 请求。
如果视图支持多种 HTTP 请求方法的话,之前我们都是在视图函数中进行判断,根据不同的请求方法执行不同的业务逻辑,那有没有更简单的方法呢?是有的,Flask
中的方法类视图 flask.views.MethodView
就可以做到,它是 flask.views.View
的子类,通过定义和请求方式同名的小写方法来完成了逻辑处理,不必提供methods属性,每个 HTTP 方法都映射到一个具有相同名称(小写)的函数。
下面看下详细使用方法。
?1234567891011121314151617181920212223242526272829from
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 视图介绍的文章就介绍到这了,更多相关Flask 视图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章: