flask 框架 练习

摘要:
Flask的第三方组件?烧瓶上下文管理过程?弗拉斯克蓝图的作用是什么?你从烧瓶源代码中学到了什么?Flask框架的默认会话处理机制是什么?Django是一个大型而全面的框架,而flask是一个轻量级框架。我在哪里可以用烧瓶装饰?烧瓶是无用的。Flask自定义本地对象Flask,它存储在某个地方,稍后可以检索。Django很好。如果初学者对django的机制有很好的理解,那么烧瓶学习成本很高。因为在Flask中可以启用多线程模式,所以当多线程模式被启用来处理用户请求时,需要隔离线程之间的数据以防止数据混淆。

目录

flask和django的区别?

django是个大而全的框架,flask是一个轻量级的框架。

django内部为我们提供了非常多的组件:orm/session/cookie/admin/form /modelform/路由/视图/模板/中间件/分页/auth/contenttype/缓存/信号/多数据库连接 

flask框架本身没有太多的功能:路由/视图/模板(jinja2)/session/中间件 ,第三方组件非常齐全。 

注意:django的请求处理是逐一封装和传递; flask的请求是利用上下文管理来实现的。 

flask哪里有用到装饰器?

before_request/afterequest
route
functools

蓝图和django app区别?

相同点:都是用于做业务拆分 / 需要注册才能使用 / 都可以在自己内部定义模板和静态文件。

不同点:注册位置不同 、flask before/after_request比django中间件的应用粒度更细 、 django的app内置了很多,flask蓝图没有内置。 

flask中的g有什么作用?

相当于是设置了一个全局变量

flask的第三方组件?

DBUtils是数据库链接池
wtforms相当于django的form、modelform、SQLAlchemy相当于django的orm

什么是threading.local对象?

threading.local对象就是为每个线程开辟一块独立的空间来存放数据。
flask没有用,flask自定义Local对象。

flask中的LocalStack的作用?

将Local对象中的数据维护成一个栈。
	{
        123:{stack:[]}
    }
并暴露:push/pop/top三方法。

为什么flask要用LocalStack维护成一个栈?

- web运行时:栈没用。
- 离线脚本:只有离线脚本时候才可以用。 
	with app.Context() as ctx:
		pass
		with app.Context() as ctx:
			pass

什么是偏函数?

偏函数就是当函数的参数太多的时候,需要简化,使用(functools.partial)可以创建一个新的函数,这个函数可以固定住原来的参数的部分参数,从而在调用的时候更加的简单

LocalProxy类的作用?

LocalProxy类是一个代理的类,帮助我们去上下文 ctx 和 app_ctx 中去操作数据。 
from flask import requset,session,g,current_app

flask上下文管理流程?

1.创建ctx = RequestContext对象,其内部封装了 Request对象和session数据。 
2.创建app_ctx = AppContext对象,其内部封装了App和g。 
3.然后ctx.push触发将 ctx 和 app_ctx 分别通过自己的LocalStack对象将其放入到Local中,Local的本质是以线程ID为key,以{“stack”:[]}为value的字典。
4.执行所有的before_request函数
5.执行视图函数
6.执行所有after_request函数(session加密放到cookie中)
7.通过ctx.auto_pop()销毁ctx和app_ctx

flask的请求生命周期?

1.请求来了
2.生成ctx=里面放了request,和session
3.生成app_ctx=里面放了g,current_app
4.把他俩都放到全局变量中
5.放进session
6.执行before_request
7.执行视图函数
8.执行after_request
9.执行save_session
10.最终,不管是否报异常,都执行auto_pop(从全局变量中把ctx和app_ctx剔除)

flask的蓝图的作用?

默认flask通过一个脚本就可以实现,但由于项目业务可能会比较多,为了方便业务的拆分,我们会创建多个文件(蓝图)进行管理。

为flask的视图设置装饰器时,需要注意什么问题?

放在路由装饰器的下面

从看flask源码你学到了什么?

1.新的编程思路:
	- django、drf数据是通过传递。
	- flask,存储在某个地方,以后用的时候去拿。 
	哪种好?两个不同的实现机制,没有好坏之分。
	django好,如果是一个初学者对于django的机制比较好理解,flask学习代价比较大(了解上下文管理机制之后才能更好的理解)。
    
2.技术点:
	- 单例模式的应用场景
	- LocalProxy代理类
	- 装饰器注意加functools

在flask的Local对象中为什么要通过线程ID进行区分?

因为在flask中可以开启多线程的模式,当开启多线程模式进行处理用户请求时,需要将线程之间的数据进行隔离,以防止数据混乱。

Flask框架的优势?

Flask自由、灵活,可扩展性强,透明可控,第三方库的选择面广,
开发时可以结合最流行最强大的Python库,

Flask框架依赖组件

# 依赖jinja2模板引擎
# 依赖werkzurg协议

Flask蓝图的作用

# blueprint把实现不同功能的module分开.也就是把一个大的App分割成各自实现不同功能的module.
# 在一个blueprint中可以调用另一个blueprint的视图函数, 但要加相应的blueprint名.

列举使用的Flask第三方组件?

# Flask组件
    flask-session  session放在redis
    flask-SQLAlchemy 如django里的ORM操作
    flask-migrate  数据库迁移
    flask-script  自定义命令
    blinker  信号-触发信号
# 第三方组件
    Wtforms 快速创建前端标签、文本校验
    dbutile     创建数据库连接池
    gevnet-websocket 实现websocket
# 自定义Flask组件
    自定义auth认证 
    参考flask-login组件

简述Flask上下文管理流程?

# a、简单来说,falsk上下文管理可以分为三个阶段:
  1、'请求进来时':将请求相关的数据放入上下问管理中
  2、'在视图函数中':要去上下文管理中取值
  3、'请求响应':要将上下文管理中的数据清除
# b、详细点来说:
  1、'请求刚进来':
        将request,session封装在RequestContext类中
        app,g封装在AppContext类中
        并通过LocalStack将requestcontext和appcontext放入Local类中
  2、'视图函数中':
        通过localproxy--->偏函数--->localstack--->local取值
  3、'请求响应时':
        先执行save.session()再各自执行pop(),将local中的数据清除

Flask中的g的作用?

# g是贯穿于一次请求的全局变量,当请求进来将g和current_app封装为一个APPContext类,
# 再通过LocalStack将Appcontext放入Local中,取值时通过偏函数在LocalStack、local中取值;
# 响应时将local中的g数据删除:

Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?

RequestContext  #封装进来的请求(赋值给ctx)
AppContext      #封装app_ctx
LocalStack      #将local对象中的数据维护成一个栈(先进后出)
Local           #保存请求上下文对象和app上下文对象

为什么要Flask把Local对象中的的值stack 维护成一个列表?

# 因为通过维护成列表,可以实现一个栈的数据结构,进栈出栈时只取一个数据,巧妙的简化了问题。
# 还有,在多app应用时,可以实现数据隔离;列表里不会加数据,而是会生成一个新的列表
# local是一个字典,字典里key(stack)是唯一标识,value是一个列表

Flask中多app应用是怎么完成?

请求进来时,可以根据URL的不同,交给不同的APP处理。蓝图也可以实现。
    #app1 = Flask('app01')
    #app2 = Flask('app02')
    #@app1.route('/index')
    #@app2.route('/index2')
源码中在DispatcherMiddleware类里调用app2.__call__,
  原理其实就是URL分割,然后将请求分发给指定的app。
之后app也按单app的流程走。就是从app.__call__走。

在Flask中实现WebSocket需要什么组件?

gevent-websocket

wtforms组件的作用?

#快速创建前端标签、文本校验;如django的ModelForm

Flask框架默认session处理机制?

解释Flask框架中的Local对象和threading.local对象的区别?

Flask中 blinker 是什么?

# flask中的信号blinker
信号主要是让开发者可是在flask请求过程中定制一些行为。
或者说flask在列表里面预留了几个空列表,在里面存东西。
简言之,信号允许某个'发送者'通知'接收者'有事情发生了
@ before_request有返回值,blinker没有返回值

# 10个信号

request_started = _signals.signal('request-started') #请求到来前执行

request_finished = _signals.signal('request-finished') #请求结束后执行

before_render_template = _signals.signal('before-render-template')#模板渲染前执行

template_rendered = _signals.signal('template-rendered')#模板渲染后执行

got_request_exception = _signals.signal('got-request-exception') #请求执行出现异常时执行

request_tearing_down = _signals.signal('request-tearing-down')#请求执行完毕后自动执行(无论成功与否)

appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 请求上下文执行完毕后自动执行(无论成功与否)

appcontext_pushed = _signals.signal('appcontext-pushed') #请求app上下文push时执行

appcontext_popped = _signals.signal('appcontext-popped') #请求上下文pop时执行

message_flashed = _signals.signal('message-flashed')#调用flask在其中添加数据时,自动触发



免责声明:文章转载自《flask 框架 练习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用windbg检测内存泄漏修改计算机名下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Django Rest_Framework(drf)介绍,以及安装和配置

1、Django Rest_Framework核心思想: 缩减编写api接口的代码 Django REST framework是一个建立在Django基础之上的Web 应用开发框架,本质上就是一个内置在django里面的子应用,可以快速的开发REST API接口应用。 在REST framework中,提供了序列化器对象Serializer的定义,可以帮助...

SSH框架总结

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。 集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层(实体层)。 Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模...

Flask结合ECharts实现在线可视化效果,超级详细!

点击上方 蓝字 关注我,带你学习Python 大家好,我是阿辰,今天教大家如何利用Flask框架结合ECharts,将采集的数据实现在线可视化效果(可以将可视化效果放到网页上,分享给其他小伙伴) 一、Flask框架基本使用 在开始可视化之前,先让大家对Flask有一个大概了解和基本使用 Flask和Django都是Python最常用的两个网站框架,...

让.net程序运行在没有framework的机器上

Remote Soft's Salamander .NET Native Compiler (www.remotesoft.com) .Net 框架目前逐步在普及了,仍然有很多人在寻找如何让.NET程序脱离.NET框架的方法。 现成的工具有 Xenocode 的postbuidle或者vas,还有 Salamander .NET Linker . 另外...

10个顶级的CSS和Javascript动画框架推荐

在网站中嵌入动画已成为近年来的一个设计趋势,许多公司都已开始转向并拥抱HTML5、CSS3和JavaScript这个技术“三人组”。尽管这些技术还不能制作一些非常复杂的动画(像flash所实现的),但是如果拥有好的想法及创造性思维,使用它们制作的即便是一些简单的动画也足以打动我们。 而且,随着CSS3技术的发展,CSS3动画日益流行。目前,WebKit浏览...

Django中获取URL路径参数(路径,查询,请求头,请求体)

通常HTTP协议向服务器传参有几种途径 :   提取URL的特定部分,如/weather/shanghai/2018,可以在服务器端的路由中用正则表达式截取;   查询字符串(query string),形如key1=value1&key2=value2;   请求体(body)中发送的数据,比如表单数据、json、xml;   在http报文的头...