Flask(10)- 标准类视图(上)

简介: Flask(10)- 标准类视图(上)

前言


  • 前面文章讲解 Flask 路由的时候,都是将 URL 路径和一个视图函数关联
  • 当 Flask 框架接收到请求后,会根据请求 URL,调用响应的视图函数进行处理
  • Flask 不仅提供了视图函数来处理请求,还提供了视图类;可以将 URL 路径和一个视图类关联

 

标准视图函数


  • 将 URL 路径和一个函数关联,这个函数又被称为视图函数,Flask 框架会根据请求的 URL 调用相应的视图函数进行处理
  • 当访问 127.0.0.1:5000/ 时,index() 函数就会处理该请求,并返回 hello world 字符串


from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'hello world'
app.run(debug = True)

标准视图类


Flask.views.View  是 Flask 的标准视图类,用户定义的视图类需要继承于  Flask.views.View 。使用视图类的步骤如下:

  1. 用户定义一个视图类,继承于 Flask.views.View;
  2. 在视图类中定义方法 dispatch_request ,处理请求、返回 HTML 文本给客户端;
  3. 使用 app.add_url_rule (rule, view_func) 将 URL 路径和视图类绑定

 

最简单的栗子

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/13 8:42 下午
# file: 8_view_class.py
"""
from flask import Flask, views
from flask.typing import ResponseReturnValue
app = Flask(__name__)
# 自定义视图类,继承 views.View
class view_test(views.View):
    # 返回一个字符串给客户端
    def dispatch_request(self) -> ResponseReturnValue:
        return "hello world"
# 将路由规则 / 和视图类 view_test 进行绑定
app.add_url_rule(rule="/", view_func=view_test.as_view("view"))
if __name__ == '__main__':
    app.run()


重点 as_view

  • view_test.as_view("view")  代表创建了一个名称为 view 的视图函数
  • app.add_url_rule 实际上是将路由规则和视图函数(由视图类的 as_view 方法转换而来)绑定

 

浏览器访问的效果

image.png

as_view 函数

视图类的本质是视图函数,函数 View.as_view () 会返回一个视图函数

 

简化版

为了更清晰理解 as_view 函数的功能,自行实现一个简化版本的 as_view 函数

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/13 8:42 下午
# file: 8_view_class.py
"""
from flask import Flask, views
from flask.typing import ResponseReturnValue
app = Flask(__name__)
class view_test2(views.View):
    def dispatch_request(self) -> ResponseReturnValue:
        return {"msg": "success", "code": 0}
    @staticmethod
    def as_view(name, **kwargs):
        view = view_test2()
        return view.dispatch_request
# 将路由规则 / 和视图类 view_test 进行绑定
app.add_url_rule(rule="/", view_func=view_test2.as_view("view"))
if __name__ == '__main__':
    app.run()


  1. 定义了一个静态方法 as_view,它首先创建一个实例 view
  2. 然后返回实例 view 的 dispatch_request 方法
  3. 即 view_func 指向了实例 view 的方法 dispatch_request
  4. 当访问页面路径 / 时,最终会调用 index.dispatch_request ()

 

继承


使用类视图的好处是支持继承,可以把一些共性的东西放在父类中,其他子类可以继承

 

父类 baseview

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/13 10:15 下午
# file: s8_baseview.py
"""
from flask import Flask, views, render_template
app = Flask(__name__)
class BaseView(views.View):
   # 如果子类忘记定义 get_template 就会报错
    def get_template(self):
        raise NotImplementedError()
   # 如果子类忘记定义 get_data 就会报错
    def get_data(self):
        raise NotImplementedError()
    def dispatch_request(self):
        # 获取模板需要的数据
        data = self.get_data()
        # 获取模板文件路径
        template = self.get_template()
        # 渲染模板文件
        return render_template(template, **data)


子类 userview

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
# author: 小菠萝测试笔记
# blog:  https://www.cnblogs.com/poloyy/
# time: 2021/7/13 10:15 下午
# file: 8_userview.py
"""
from s8_baseview import BaseView
class UserView(BaseView):
    def get_template(self):
        return "user.html"
    def get_data(self):
        return {
            'name': 'zhangsan',
            'gender': 'male',
        }



相关文章
|
2月前
|
缓存 JSON 关系型数据库
四、Flask 视图使用方法详细概述
四、Flask 视图使用方法详细概述
24 0
|
7月前
|
JSON 数据处理 数据库
Flask视图函数与响应处理的艺术
【4月更文挑战第15天】本文探讨了Flask框架中视图函数和响应处理的原理与实践。视图函数通过`@app.route()`装饰器与URL关联,处理用户请求并返回响应。示例展示了如何从URL或请求对象获取参数,以及执行不同操作后返回响应。Flask支持字符串、元组和响应对象等多种响应类型。最佳实践包括保持视图函数简洁、使用模板引擎、处理异常和设置正确状态码。掌握这些技能能提升Web应用的用户体验和开发效率。
|
7月前
|
网络架构 Python
Flask路由与视图:构建你的第一个Web应用
【4月更文挑战第15天】Flask是Python的Web框架,其核心是路由和视图。路由通过`@app.route()`装饰器定义,将URL映射到视图函数。视图函数处理请求并返回响应。动态路由允许URL包含可变部分,如`<username>`,将参数传递给函数。本文通过示例展示了如何创建显示待办事项列表的Web应用,包括定义路由、视图、使用模板以及运行应用。这为基础的Flask应用开发提供了基础。
|
7月前
|
网络协议 测试技术 Python
PythonWeb开发基础(三)类Flask框架请求封装
类Flask框架请求封装 Web服务器 本质是个TCP服务器,监听在特定端口上 支持HTTP协议,能够将HTTP请求报文进行解析,能够把响应数据进行HTTP协议的报文封装并返回浏览器端。
88 0
|
Python
【flask】URL和视图映射
【flask】URL和视图映射
64 0
|
搜索推荐 Apache Python
Flask | Flask基础 - URL与视图
Flask | Flask基础 - URL与视图
109 0
|
Linux 定位技术 调度
Flask之视图高级(二)
Flask之视图高级(二)
|
Python
Flask之视图高级(一)
Flask之视图高级(一)
|
Python
一分钟快速实现Flask框架的蓝图和视图
一分钟快速实现Flask框架的蓝图和视图
125 0
|
调度 Python
Flask学习与项目实战4:视图高级之蓝图和子域名、类视图
对于大项目,代码都不放在app.py里面,需要分类。 即类似javaspringboot中的分层?每个功能分为一个更小规格的层次。 url_prefix 就是 蓝图的前缀。 和book相关的都在book中,和用户有关的都在user中。
Flask学习与项目实战4:视图高级之蓝图和子域名、类视图