• 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在其中添加数据时,自动触发
    
    
    
    
  • 相关阅读:
    junit所需要的jar包
    【SSH学习笔记】用Struts2实现简单的用户登录
    HIbernate 一对多 多对多
    Hibernate 干货2
    Hibernate 干货
    hibernate学习笔记
    Hibernate 框架学习
    Class的isAssignableFrom方法
    dubbo源码分析1——SPI机制的概要介绍
    Dubbo简介
  • 原文地址:https://www.cnblogs.com/saoqiang/p/12527588.html
Copyright © 2020-2023  润新知