美文网首页自学Python入门与进阶程序员
Python Flask学习知识点(六)

Python Flask学习知识点(六)

作者: kakarotto | 来源:发表于2018-09-20 15:01 被阅读3423次
    timg (10).jpg image.png

    Flask多线程机制

    发送请求和服务器处理请求的线程之间的关系?
    客户端发送十个请求,Flask开启多少个线程处理请求?其实是由web服务器开启的多线程。
    如果要上生产线,一般不会用Flask自带的web server。
    对于一个web网站而言,必须有承受并发的能力。

    单线程:

    如果是单线程,只有当一个请求处理完成之后,才会处理下一个请求,所以这时候看起来就像是要排队一样
    单线程下,当一个请求进来之后,Flask会实例化一个Request对象,用这个对象来装载请求信息,这时候只有一个实例化的request,当第一个请求结束后,Flask会再实例化一个Request对象来装载第二个请求,然后request变量又指向当前请求,那么这样众多用户就不会混乱。

    多线程:

    werkzeug库下local模块下的Local对象,Flask就是用Local来做线程隔离的。
    Local对象的本质就是用线程的id号作为字典的键这种基本原理实现的。

    Flask中线程隔离栈LocalStack

    LocalStack 是实现线程隔离的栈结构,把Local封装了。
    LocalStack需要使用push方法

    LocalStack:

    • Local特性

    • Stack特性:栈结构,只能取栈顶元素,先进后出

    使用线程隔离的意义在于:使当前线程能够正确引用到他自己做创建的对象,而不是引用到其他线程做创建的对象

    线程隔离对象 LocalStack
    问:Flask使用LocalStack为了隔离哪个对象?
    答:被线程隔离对象 RequestContext AppContext
    Flask核心对象全局只有一个。

    看一段测试代码,测试下LocalStack线程隔离:

    import threading
    from werkzeug.local import LocalStack
    
    stack = LocalStack()
    stack.push('a')
    print('主线程top:', stack.top)
    
    
    def child():
        print("子线程:", stack.top)
        stack.push('b')
        print('子线程:', stack.top)
    
    
    t = threading.Thread(target=child, name='demo')
    t.start()
    
    print('主线程top:', stack.top)
    

    打印结果:

    主线程top: a
    子线程: None
    子线程: b
    主线程top: a
    

    还有哪些是被线程隔离的对象?


    image.png

    以上都是被线程隔离的对象。

    ViewModel的基本概念

    很多时候,我们的数据在提交给页面的时候需要做一些处理或者裁剪,这时就需要ViewModel层来做这件事,如图:


    image.png
    viewModel作用
    1. 裁剪
    2. 修饰
    3. 合并

    app文件夹下新建文件夹view_models,这里就可以处理数据的裁剪、修饰、合并。

    单页面与网站的区别

    一个网站页面由哪几部分构成?

    • JS CSS(静态文件)
    • HTML模板
    • 数据
    网站

    一般来讲,服务器端把数据返回到HTML模板中,称之为服务器渲染,然后返回到浏览器给用户,此时,客户端浏览器网页中的JS CSS起作用再一次发起请求渲染页面,这是一个完整的页面就处理完了。


    image.png
    单页面

    浏览器去请求一个静态的html,html返回到客户端浏览器后,html里边的js css 发起请求,来填充数据。


    image.png
    单页面和普通网站有什么区别:

    区别的第一种说法:
    对于多页面普通网站而言,大多数情况下它的数据渲染或者说模板填充都是在服务器端进行的,
    而对于单页面来说,他数据的渲染是在客户端进行的。

    区别的第二种说法:
    单页面业务逻辑也就是说数据运算主要集中在客户端用js去操作,而普通网站而言,绝大多数业务逻辑是在服务器,也就是视图函数中去进行的。

    相关文章

      网友评论

        本文标题:Python Flask学习知识点(六)

        本文链接:https://www.haomeiwen.com/subject/mgnlnftx.html