这篇教程关于Flask&nbsp;视图介绍写得很实用,希望能帮到您。 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 Viewclass 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 MethodViewclass 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 视图内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! pandas如何删除没有列名的列浅析 Flask-蓝图 |