Flask路由和视图

Flask路由和视图

一、 路由系统

1. 路由系统基础

  • 路由装饰器

    • Flask使用装饰器@app.route来将URL规则绑定到视图函数上。

    • 装饰器可以指定路径规则(rule)、请求方法(methods)、以及别名(endpoint)等。

  • 转换器

    • Flask默认支持多种路径转换器,如intfloatstring等,用于将URL中的变量部分转换为不同的数据类型。

    • 转换器使得URL可以动态匹配,并允许开发者定义复杂的URL规则。

    • DEFAULT_CONVERTERS = {'default':          UnicodeConverter,'string':           UnicodeConverter,'any':              AnyConverter,'path':             PathConverter,'int':              IntegerConverter,'float':            FloatConverter,'uuid':             UUIDConverter,
      }
      

2. 执行流程分析

  1. 路由装饰器

    • @app.route 是一个装饰器,使用它来将一个函数绑定到一个URL规则上。

    • 当装饰器被触发时,它实际上执行了 index = decorator(index),其中 decoratorroute 方法返回的内部函数。

    • decorator 函数是 route 方法的内部函数,它接收视图函数 f 作为参数,并使用 add_url_rule 方法将视图函数注册到路由上。

    • def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]:def decorator(f: T_route) -> T_route:endpoint = options.pop("endpoint", None)self.add_url_rule(rule, endpoint, f, **options)return freturn decorator
      
  2. add_url_rule参数

    • rule:定义URL规则。
    • view_func:视图函数。
    • defaults:默认值,用于URL中没有参数但视图函数需要参数的情况。
    • endpoint:用于反向生成URL的名称。
    • methods:允许的HTTP请求方法。
    • strict_slashes:是否严格要求URL末尾的斜杠。
    • redirect_to:重定向到指定地址。
    • subdomain:子域名访问。

3. Endpoint

  1. 默认Endpoint生成
    • 如果在装饰器中没有指定endpoint,Flask会默认使用视图函数的名称作为endpoint
    • 如果存在多个路由使用了相同的视图函数,但没有指定不同的endpoint,会导致endpoint冲突。
  2. 避免Endpoint冲突
    • 可以在装饰器中明确指定endpoint参数,以避免冲突。
    • 使用自定义装饰器,通过包装视图函数来确保每个路由都有唯一的endpoint

二、 视图函数

1. FBV + 装饰器

  • 示例

    • from functools import wraps
      from flask import Flaskapp = Flask(__name__)def outer(func):@wraps(func)def inner(*args, **kwargs):print('走了装饰器')return func(*args, **kwargs)return inner@app.route('/')
      @outer
      def index():return '根路径'@app.route('/home')
      @outer
      def home():return '主页'if __name__ == '__main__':app.run()
      
  • 说明:为什么在FBV中使用装饰器时,需要使用@wraps(func)或指定endpoint

    • 使用 @wraps(func)
      • 保持被装饰函数的__name____doc__属性,这样当查看inner函数时,它看起来就像是原始的func函数。
      • 这对于调试和文档来说非常重要,因为它们依赖于函数的名称和文档字符串。
    • 指定 endpoint
      • 通过指定endpoint,可以确保即使装饰器改变了函数的元信息,也可以通过端点名称来引用这个视图函数。

2. CBV + 装饰器

  • 示例

    • from functools import wraps
      from flask import Flask
      from flask.views import MethodViewapp = Flask(__name__)def outer1(func):@wraps(func)def inner(*args, **kwargs):print('走了装饰器1')return func(*args, **kwargs)return innerdef outer2(func):@wraps(func)def inner(*args, **kwargs):print('走了装饰器2')return func(*args, **kwargs)return innerclass Home(MethodView):decorators = [outer1, outer2]methods = ['GET', "POST"]def get(self):return "GET"def post(self):return "POST"app.add_url_rule('/home', endpoint='home', view_func=Home.as_view('home'))
      
  • 说明

    • decorators = [装饰器1,]
      • 如果有多个可以直接 逗号隔开
    • methods = [‘GET’, “POST”]
      • 可以控制整个视图函数的请求方式

3. CBV源码解析

as_view 方法关键步骤:

  1. 检查 init_every_request 属性
    • 如果init_every_requestTrue,则每次请求都会创建类的新实例。
    • 如果为False,则类在第一次调用as_view时被实例化,并且这个实例在后续请求中被重用。
  2. 定义视图函数 view
    • 视图函数内部调用self.dispatch_request来处理请求。
  3. 支持异步操作
    • 使用current_app.ensure_sync确保视图函数和dispatch_request是同步的,即使它们可能是异步的。
  4. 应用装饰器
    • 如果类定义了decorators属性,这些装饰器会被应用到视图函数上。
    • 每个装饰器通过接收视图函数作为参数并返回一个新的函数来包装视图函数。
  5. 设置视图函数的元信息
    • 视图函数的__name____module____doc__属性被设置为类的对应属性,以便于调试和文档。
  6. 返回视图函数
    • 最终,as_view返回一个完全配置好的视图函数,它可以直接注册到路由中。
def as_view(cls, name, *class_args, **class_kwargs):# 如果init_every_request为True,则每次请求都会创建类的新实例。# 如果为False,则类在第一次调用as_view时被实例化,并且这个实例在后续请求中被重用。if cls.init_every_request:def view(**kwargs):self = view.view_class(*class_args, **class_kwargs)# 支持异步操作return current_app.ensure_sync(self.dispatch_request)(**kwargs)else:self = cls(*class_args, **class_kwargs)def view(**kwargs):# 支持异步操作return current_app.ensure_sync(self.dispatch_request)(**kwargs)# 应用装饰器if cls.decorators:view.__name__ = nameview.__module__ = cls.__module__for decorator in cls.decorators:view = decorator(view)# 设置视图函数的元信息        view.__name__ = nameview.__doc__ = cls.__doc__view.__module__ = cls.__module__view.methods = cls.methodsview.provide_automatic_options = cls.provide_automatic_optionsreturn view

dispatch_request 方法

  1. 获取请求方法
    • 通过request.method.lower()获取请求方法的字符串表示,并将其转换为小写。
  2. 查找对应的方法
    • 尝试获取与请求方法同名的类方法(例如,如果请求是GET,则查找get方法)。
    • 如果请求是HEAD,但没有对应的处理方法,它会尝试使用GET方法。
  3. 执行方法
    • 如果找到了对应的方法,它会使用current_app.ensure_sync来确保该方法同步执行,并传入请求的参数。
  4. 抛出异常
    • 如果没有找到对应的方法,dispatch_request会抛出NotImplementedError
def dispatch_request(self, **kwargs):# 使用getattr函数获取请求方法meth = getattr(self, request.method.lower(), None)# 如果请求方法未找到,且请求方法为"HEAD",则使用getattr函数获取"get"方法if meth is None and request.method == "HEAD":meth = getattr(self, "get", None)# 断言请求方法不为空,若为空则抛出异常assert meth is not None, f"Unimplemented method {request.method!r}"return current_app.ensure_sync(meth)(**kwargs)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php反序列化漏洞简介

目录 php序列化和反序列化简介 序列化 反序列化 类中定义的属性 序列化实例 反序列化实例 反序列化漏洞 序列化返回的字符串格式 魔术方法和反序列化利用 绕过wakeup 靶场实战 修复方法 php序列化和反序列化简介 序列化 将对象状态转换为可保持或可传输的格式的…

Linux—系统安全及应用

目录 一、账号安全控制 1、系统账号清理 1.1、将用户账号设置为无法登录 1.2、锁定长期不使用的账号 1.3、删除无用的账号 1.4、锁定账号文件passwd、shadow 2、密码安全控制 2.1、设置密码有效期 2.1.1、适用于新建用户 2.1.2、适用于已有用户 2.2、强制用户下次登录…

①常用API----Math

public static int abs(int a) // 返回参数的绝对值 public static double ceil(double a) // 返回大于或等于参数的最小整数 public static double floor(double a) // 返回小于或等于参数的最大整数 public static int round(f…

ETAS工具导入DEXT生成Dcm及Dem模块(一)

文章目录 前言Cfggen之前的修改ECU关联DcmDslConnectionDiagnostic ProtocolDiagnostic Ecu Instance PropsCommonContributionSetEvent修改communication channel总结前言 诊断模块开发一般是先设计诊断数据库,OEM会释放对应的诊断数据库,如.odx文件或.cdd文件。如果OEM没有…

Linux-chown的使用简介

一、chown命令作用 更改文件或目录的所有者和所属群组 二、chown命令用法 Chown用法:chown [参数] 所有者:所属者 文件名 (参数非必要,可为空) 参数 参数说明 user 新的文件拥有者的使用者 ID group 新的文件拥有者的使用者组(group) -c 显示更改…

如何修复Power BI【View usage metrics report】指标报表数据源更新问题?

故事背景 有朋友留言询问:通过我之前写的 想知道Power BI用户访问报告的次数?快来学习! 这篇文章,了解了如何查看Power BI用户访问报告的详情。 但是最近由于创建【View usage metrics report】指标报表的小伙伴离职了&#x…

特种作业操作证(焊接与热切割作业)2024年理论考试题库。

1.关于隐弧排烟罩下列说法正确的是()。 A.这类排烟罩适用于焊接大而长的焊件时排除电焊烟尘和有毒气体 B.这类排烟罩对焊接区实行密闭,能最大限度地减少臭氧等有毒气体的弥散 C.利用压缩空气从主管中高速喷出时,在副管形成负压…

【干货】一文讲清楚社群裂变的主要模式和SOP流程

一、社群裂变的主要模式 社群裂变是一种依赖于现有成员的推广以吸引新成员的增长策略。以下是几种主要的社群裂变模式: 老带新裂变 定义:通过老用户带动新用户,同时给予某一方或双方奖励的一种裂变形式。 示例:任务宝活动&…

sensor multi-hal

multi-hal :多个 hal 层. 高通 sensor 一般是挂在 ADSP 那边,但是,有些时候 想把 sensor 驱动放入到 kernel 那边,这个时候 就要用到 multi-hal 功能呢, 高通平台这个功能默认是打开的。 在BoardConfig.mk中打开mutil-hal USE_S…

Linux使用g++编译常见问题

std::this_thread 编译不通过 在使用 std::thread 时,需要链接 pthread 库,因为 std::thread 使用了 POSIX 线程库来实现多线程功能。您可以通过在编译时加上 -pthread 选项来解决这个问题。这个选项会告诉编译器链接 pthread 库,确保 std::…

公交车载视频监控系统概述

引言 随着城市交通的不断发展,公交车作为城市公共交通的重要组成部分,其安全性和管理效率越来越受到关注。为了提升公交车运营的安全性和管理效率,基于索迪迈视频监控管理平台,结合3G/4G网络技术,我们构建了一套公交车…

三星DRAM、NAND,“又双叒叕”带头涨价了

据韩国媒体《每日经济新闻》报道,三星电子计划在第三季度上调服务器DRAM和企业级NAND闪存的价格,涨幅预计在15%-20%,主要受人工智能(AI)需求激增的推动。这一举措有望提振公司下半年业绩。 据《经济日报》报道援引业内消息,由于厂…

007 栈(lua)

文章目录 Lua本身支持动态数组,通过表(table)实现,它类似于Java中的ArrayList。Lua的表是灵活的数组和字典的混合体。对于栈的实现,我们可以简单地使用一个表来模拟。 这里是一个简单的Lua栈实现,它包含了p…

jupyter安装及使用

引言 之前安装了anaconda,然后conda的环境管理里面就有jupyter,但是我一直没用过。 但是我用过colab,从使用体验上来说,非常相似,这次给服务器装了一个jupyter,然后我本地连接远程的来用,还挺…

【教程】几种不同的RBF神经网络

本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…

一台TrinityCore服务器客户端连接网速慢(未解决)

在FreeBSD开bhyve安装Ubuntu,然后安装了TrinityCore服务器,在只是经过一层NAT,两边都是局域网的情况下,连接速度竟然很慢,慢到600ms。 服务器安装见:尝试在FreeBSD 的jail、bhyve里安装TrinityCore-CSDN博…

利用 MyBatis 动态 SQL 构建灵活的查询

利用 MyBatis 动态 SQL 构建灵活的查询 引言 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。其中,MyBatis 的动态 SQL 功能是其强大之处之一,它允许你在 XML 映射文件中根据条件动态地构建 SQL 语句&#xff0c…

知识图谱综述

什么是知识图谱 4月 24, 2024 119 这是一个基于这个优秀而全面的知识图谱教程的教程。 来源:Aidan et al., Knowledge Graphs, https://arxiv.org/pdf/2003.02320.pdf 一、说明 在我们周围的现实世界中,物体和它们之…

仿真CAN报文发送的CRC校验算法(附CAPL代码)

文章目录 前言一、为什么CAN报文有CRC?二、怎么确定是否需要做CRC校验?三、CAPL代码实现CRC算法 前言 关于CRC校验的基本理论、算法实现网上已经有很多介绍文章,本文不再赘述。只是记录在项目测试中真正开发CRC算法并进行测试的一些体会。 …

Flink 重启策略和故障恢复策略

前言 主要总结 Flink 重启策略 官方文档 https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/ops/state/task_failure_recovery/https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/deployment/config/#fault-tolerance版本 Flink 1.15.…