“微” (micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以),也不意味着 Flask 在功能上有所欠缺。...Pipenv 会自动帮我们管理虚拟环境,所以在执行 pipenv install 安装 Python 包时,无论是否激活虚拟环境,包都会安装到虚拟环境中。...还可以设置默认值,这样即使不输入 name 的值访问也不会 404 启动开发服务器 Flask 内置了一个简单的开发服务器(由依赖包 Werkzeug 提供), 足够在开发和测试阶段使用。...当我们安装 Flask 后,会自动添加一个 flask 命令脚本,我们可以通过 flask 命令执行内置命令、扩展提供的命令或是我们自己定义的命令。...Flask 命令 除了 Flask 内置的 flask run 等命令,我们也可以自定义命令。在虚拟环境安装 Flask 后,包含许多内置命令的 flask 脚本就可以使用了。
比如挂载会执行挂载的生命周期函数,更新则不会。...只要新节点是数组就不算单节点,即使数组长度只为 1。此外旧节点可能是有兄弟节点的(sibling 不为 null)。...新旧节点的 key 都没有设置的话,会设置为 null,如果新旧节点的 key 都为 null,会认为相等。 此外还要判断新旧类型是否相同(比如都是 div),因为类型都不同了,是无法复用的。...之后的 commit 阶段会再进行正式的删除,再执行一些调用生命周期函数等逻辑。...是的话,就将旧节点中剩余的所有节点编辑为 “删除”,然后直接结束整个函数。
会在每个请求结束后运行 teardown_request 注册一个函数,即使有未处理的异常抛出,会在每个请求介绍后执行。...如果发生异常,会传入异常对象作为参数注册到函数中 after_this_request 在视图函数内注册一个函数,在这个请求结束后运行 假如我们创建了三个视图函数A、B、C,其中视图C使用了after_this_request...因为Flask会在每个请求产生后后自动激活当前请求的上下文,激活请求上下文后,request被临时设置为全局可访问。在每个请求结束后,Flask就会销毁对应的请求上下文。...对象都表示和视图函数对应的请求,也就是当前请求 程序存在多个程序实例的情况,使用current_app可获取对应的实例 上下文的激活 请求进入时,Flask会自动激活请求上下文,此时程序上下文也被自动激活...请求处理完毕后,请求上下文和程序上下文也会自动销毁。两者具有相同的生命周期。
如果你想要为还没有的功能创建你自己的 Flask 扩展,这份扩展开发指南会帮助你 在很短的时间内让你的应用跑起来并且感到像用户一样期待你的扩展运转。...Flask 扩展必须以 BSD 或 MIT 或更自由的许可证来许可,才能被征募到 Flask Extension Registry 。...它 可以附加在处理器前/后等位置。... 在 with 块的最后,销毁处理器会自动执行。...( PackageName==dev ) 安装脚本中的 zip_safe 标志必须被设置为 False ,即使扩展对于 压缩是安全的 现行扩展必须支持 Python 2.5 , 2.6 以及 2.7 扩展导入的过渡
什么是 patch Vue 在通过 VNode 节点渲染 DOM 时,并不是通过当前的 VNode 节点去暴力的更新 DOM 节点,而是对新旧两个 VNode 节点通过 patch 算法进行比较,然后通过对比结果找出差异的属性或节点进行按需更细...这是我们第一次在源码中遇到 patchFlag,不过不用太细究这里,我们接着往下看。 接下来 patch 函数会通过 switch case 来判断节点类型,并分别对不同节点类型执行不同的操作。...Vue2 的子节点优化策略 在我阅读《深入浅出 Vue.js 》这本书时,作者刘博文将 Vue2 的子节点优化策略总结为四类: 新前与旧前 新后与旧后 新后与旧前 新前与旧后 需要注意的是新前指代新子节点索引在最前面的节点...当时我阅读此书后,觉得这样的总结非常贴切好记,也很好的帮助了我更浅显易懂的阅读 Vue2 的源码,所以在 Vue3 的子节点更新策略中我依旧打算沿用这样的叫法来描述更新策略。...在新前与旧前的比较完成后,与 Vue2 中的优化策略一致,会开始新后与旧后的比较。
路由匹配 程序实例中存储了一个路由表(app.url_map),当请求发来后,Flask会根据请求报文中的URL来尝试与该表中所有的URL规则匹配,调用匹配成功的视图函数。...注册一个函数,即使有未处理的异常抛出,会在每个请求结束后运行。...如果发送异常,会传入异常对象作为参数到注册的函数中 after_this_request 在注册函数内注册一个函数,会在这个请求结束后运行 @app.before_request def do_something...错误响应 使用Flask提供的abort()函数,手动返回错误响应 abort()函数前不需要执行使用return语句,一旦abort函数被调用,其之后的代码不被执行 from flask import...的json模块具有dumps()和load()等方法,并且Flask提供了包装好的更方便的jsonify()函数 from falsk import Flask,make_response,json
我们也知道了组件是由模板、组件描述对象和数据构成的,数据的变化会影响组件的变化。组件的渲染过程中创建了一个带副作用的渲染函数,当数据变化的时候就会执行这个渲染函数来触发组件的更新。...和渲染过程类似,更新过程也是一个树的深度优先遍历过程,更新完当前节点后,就会遍历更新它的子节点,因此在遍历的过程中会遇到 hello 这个组件 vnode 节点,就会执行到 processComponent...updateComponent 函数来更新子组件,updateComponent 函数在更新子组件的时候,会先执行 shouldUpdateComponent 函数,根据新旧子组件 vnode 来判断是否需要更新子组件...再拿我们前面举的例子说,当 App 组件重新渲染的时候,在执行 renderComponentRoot 生成子树 vnode 的过程中,也生成了 hello 组件对应的新的组件 vnode。..."World" : "Vue"; }, }, }; 当我们点击 App 组件中的按钮会执行 toggle 函数,然后修改 data 中的 msg,这就触发了
在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用 after_request 如果没有抛出错误,在每次请求后执行接受一个参数:视图函数作出的响应,在此函数中可以对响应值在返回之前做最后一步修改处理...,需要将参数中的响应在此参数中进行返回 teardown_request:每一个请求之后绑定一个函数,即使遇到了异常。。...先注册的后执行。...after_request 被触发的前提是没有异常抛出; 或者异常被 errorhandler 接住并处理 比如abort(400)异常被errorhandler 接住并处理,那么after_request也会执行...只有在请求上下文被 pop 出请求栈的时候才会触发 teardown_request, 所以即使之前有抛出错误的时候也会都会被执行, 执行完后返回 response.
2、路由和视图函数 客户端把请求发送给Web服务器,Web服务器再把请求发送给Flask程序实例。程序实例需要知道对每个URL请求运行哪些代码,所以保存了一个URL到Python函数的映射关系。...' 像index()这样的函数称为视图函数。视图函数返回的响应可以包含HTML的简单字符串,也可以是复杂的表单。...路由中的动态部分默认使用字符串,不过也可以使用类型定义。例如,/usr/只会匹配动态片段为整数的URL。Flask支持在路由中使用int、float和path类型。...= app.app_context() app_ctx.push() current_app.name ②请求调度 from hello import app app.url_map ③请求钩子 有时在处理请求之前或之后执行代码会很有用...,即使有未处理的异常抛出,也在每次请求之后运行。
然而,即使在最前沿的算法中,该算法的复杂程度为 O(n 3 ),其中 n 是树中元素的数量。如果在 React 中使用了该算法,那么展示 1000 个元素所需要执行的计算量将在十亿的量级范围。...REMOVE_NODE:旧集合的某个组件或节点类型,在新集合里也有,但对应的 element 不同则不能直接复用和更新,需要执行删除操作,或者旧组件或节点不在新集合里的,也需要执行删除操作。...react diff算法通过新旧节点比较后,如果发现了key值相同的新旧节点,就会执行移动操作(然后依然按原策略深入节点内部的差异对比更新),而不会执行原策略的删除旧节点,创建新节点的操作。...E,在 lastIndex处创建E,lastIndex++在旧集合中取到C,C不移动,lastIndex=2在旧集合中取到A,A移动到新集合中的位置,lastIndex=2完成新集合中所有节点diff后...这在一些场景中会比较有用(比如重置某个组件的状态)key值在比较之前都会被执行toString()操作,所以尽量不要使用object类型的值作为key,会导致同一层级出现key值相同的节点。
然而,即使在最前沿的算法中,该算法的复杂程度为 O(n 3 ),其中 n 是树中元素的数量。 如果在 React 中使用了该算法,那么展示 1000 个元素所需要执行的计算量将在十亿的量级范围。...REMOVE_NODE:旧集合的某个组件或节点类型,在新集合里也有,但对应的 element 不同则不能直接复用和更新,需要执行删除操作,或者旧组件或节点不在新集合里的,也需要执行删除操作。...图片 如图 所示,旧集合中包含节点A、B、C 和 D,更新后的新集合中包含节点 B、A、D 和C(只是发生了位置变化,各自节点以及内部数据没有变化),此时新旧集合按顺序进行逐一的diff 差异化对比,发现...react diff算法通过新旧节点比较后,如果发现了key值相同的新旧节点,就会执行移动操作(然后依然按原策略深入节点内部的差异对比更新),而不会执行原策略的删除旧节点,创建新节点的操作。...这在一些场景中会比较有用(比如重置某个组件的状态) key值在比较之前都会被执行toString()操作,所以尽量不要使用object类型的值作为key,会导致同一层级出现key值相同的节点。
watcher可以监听函数执行的过程,监测函数执行期间用到了哪些响应式数据并且进行依赖收集,关于watcher可以瞅瞅我上一篇文章:一文带你了解vue2之响应式原理 _update函数在干什么?..._update函数会接收到一个vonde参数,这就是新生成的虚拟dom树,同时,_update函数通过当前组件的_vnode属性,拿到旧的虚拟dom树。...,所以除了更新变化的地方之外还要进行位置移动,移动到旧树尾指针的后面,最后旧树头指针往后移动,新树尾指针往前移动,如下图: 继续比对,新旧头指针不同,尾指针不同,两个头尾也不同,然后它会以新树头指针为基准...随后新树头指针往后移动,与新树尾指针重合,旧树尾指针向前移动到圆1位置,如下图: 继续比对,新旧两树头指针不同,尾指针不同,两个头尾也不同,然后它以新树头指针为基准,循环旧虚拟子节点,找圆8在旧树中存不存在...,所对应的真实dom也会被移除 最终真实dom生成完毕,整个过程我们只新建了一个元素,如下图: 在面试的时候也会被问到关于diff算法的问题,以下是参考回答: 当组件创建和更新时,vue会执行内部的
面对复杂的情况,即使最前沿的算法,复杂度也极高。...该函数中对以上三种场景都做了覆盖。但实际上面的情况对于React来说只是两种,oldFiber链是否为空。因此,在实现上也只处理了这两种情况。...:旧: A - B - C - D - E新: A - B - D - C在本轮遍历中,会遍历A - B - D - C。...原因是旧位置在lastPlacedIndex的右边,而新节点的位置也在它的右边,所以它的位置没变化。因为位置不变,所以它成了固定节点,把lastPlacedIndex更新成新位置。...源码了解了上边的多节点diff原理后,将上边的关键点匹配到源码上更方便能进一步理解。下面放出带有详细注释的源码。
MapAdapter 类:执行 url 匹配的过程,其中有一个 match 方法, Rule.match(path, method) 自定义路由管理器 from flask import Flask...__init__(url_map) self.regex = regex # 在对应的试图函数之前调用 # 从url中提取出参数之后,会先调用to_python # 会把提取出的值作为参数传递给...abort(状态码) 是一个默认的抛出异常的方法 调用abort函数可以抛出一个指定状态码对应的异常信息 abort函数会立即终止当前视图函数的运行** 模型对象的序列化 场景:我们有时候可能需要返回模型对象中的某些字段...before_request:在每次请求前运行。 after_request:如果没有未处理的异常抛出,在每次请求后运行。...teardown_request:在每次请求后运行,即使有未处理的异常抛出。
你可以动态地构造 URL 的特定部分(正则表达式),也可以在一个函数上绑定多个不同的规则。...test_request_context()告诉Flask,即使我们使用Python shell,它也会像处理请求一样行事。...Python循环结构也可以在模板中使用。...开始运行后,在浏览器中打开http://localhost:5000/result即可获得以下输出: 在模板中你也可以使用request,session和g对象,也能使用函数get_flashed_messages...底层函数uploader()执行保存操作。 Flask 将表单数据发送到模板 可以在URL规则中指定http方法。
然而,即使在最前沿的算法中,该算法的复杂程度为 O(n 3 ),其中 n 是树中元素的数量。 如果在 React 中使用了该算法,那么展示 1000 个元素所需要执行的计算量将在十亿的量级范围。...REMOVE_NODE:旧集合的某个组件或节点类型,在新集合里也有,但对应的 element 不同则不能直接复用和更新,需要执行删除操作,或者旧组件或节点不在新集合里的,也需要执行删除操作。...react diff算法通过新旧节点比较后,如果发现了key值相同的新旧节点,就会执行移动操作(然后依然按原策略深入节点内部的差异对比更新),而不会执行原策略的删除旧节点,创建新节点的操作。...(4)key机制的缺点 图片 B、C,与旧集合相比只有 D 节点移动,而 A、B、C 仍然保持原有的顺序,理论上 diff 应该只需对 D 执行移动操作,然而由于 D 在旧集合中的位置是最大的,导致其他节点的...这在一些场景中会比较有用(比如重置某个组件的状态) key值在比较之前都会被执行toString()操作,所以尽量不要使用object类型的值作为key,会导致同一层级出现key值相同的节点。
即使只有几条路线的简单Django应用程序也需要相当多的配置才能运行。如果你的工作只是设置几个简单的REST端点,Django几乎肯定是矫枉过正的。 Django也有它的怪癖。...这些系统使用Python类来定义模型,在Web2py中,使用构造函数(如define_table)来实例化模型。...模板可以是两种类型之一:新的和更灵活的Zope页面模板(ZPT)系统,或旧的和更基本的DTML标记系统。...Bottle中的路由系统将URL映射到函数,其语法与Flask几乎完全相同。也不仅限于硬连线路径;可以动态创建它们。...还存在记录和单元测试,即使从这个轻量级的框架中排除两个看起来也很愚蠢的项目。 Pyramid的文档很棒。
Virtual DOM有什么不足 上面我们也说到了在复杂视图情况下提升渲染性能。...最后,在根目录下创建一个index.html文件。 package.json文件可以编辑如下,更利于操作。...在使用 Vue2.x 的时候见过 h 函数,它的参数就是h函数,但是Vue加强了h函数,使其支持组件机制。.../* 对比两个新旧节点,然后找到差异并更新DOM 第一部分 1.触发prepatch钩子函数 2.触发update钩子函数 第二部分 1.新节点有text属性,且不等于旧节点的text属性 -》如果旧节点有...} } } removeVnodes方法 主要逻辑如下: 循环触发 destroy 钩子,递归触发子节点的钩子 触发 remove 钩子,利用 createRmCb , 在所有监听器执行后
,我们可能在其他使用该路径的地方一个一个手动修改,这种硬编码的方式降低了代码的易用性,这种情况可以使用url_for()函数来获取url url_for()函数的参数为视图函数名,也可以在路由的装饰器中指定...请求钩子 请求钩子是在视图函数处理请求的前或者后的阶段进行的处理函数 Flask默认实现的五种请求钩子: before_first_request 处理第一个请求之前 before_request...处理请求之前 after_request 处理请求之后 after_this_request 在视图函数内注册一个函数,会在这个请求结束后运行 teardown_request 在请求结束后,如果有异常也会执行的钩子...这个页面对于我们调试错误非常有用,同时还允许我们在页面上执行Python代码,我们只需要点击错误最右边的命令行图标 这时会弹出一个窗口让我们输入PIN码,这个可以在程序刚允许时控制台输出找到 ?...输入后就可在页面执行代码了 ?
领取专属 10元无门槛券
手把手带您无忧上云