flask 第四章 偏函数 Local空间转时间 myLocalStack RunFlask+request 请求上下文
1 . 偏函数 (partial)
from functools import partial def func(*args,**kwargs):
a=args
b=kwargs
return a,b new_func=partial(func,1,2,3,4,a=3,b=5)
ret=new_func()
print(ret)
最终得到的结果为: ( (1, 2, 3, 4) , {'a': 3, 'b': 5} )
我理解的意思为: 将1,2,3,4,a=3,b=5传入func中去执行函数.
其实就是 :往函数里传一个值不执行,返回一个新函数
2.ThreadingLocal线程安全 空间转时间
我们之前学的线程并发是这样的
from threading import Thread
import threading
class foo(object):
pass f=foo() def func(a):
f.num=a
time.sleep(1)
print(f.num,threading.current_thread().ident) for i in range(10):
t=Thread(target=func,args=(i,))
t.start()
但是这样我们打印的结果为

原因是线程的创建速度是很快的(一瞬间),在第一个a进入函数执行时,睡眠了1秒,io切换到下一个时,又睡眠,直到最后一个进入函数,第一个a还在睡眠.当第一个结束睡眠的时候,num已经变成了最后一个值,所以每一个num都变成了最后一个数字9.
解决方法:(只要在类中继承一个local即可)
from threading import local
import threading class Foo(local):
pass f=Foo() def func(i):
f.num=i
time.sleep(1)
print(f.num,threading.current_thread().ident) for i in range(10):
t=Thread(target=func,args=(i,))
t.start()
3.myLocalStack
import time
from threading import Thread,local
import threading class MyLocalStack(local):
stack={}
pass mls=MyLocalStack() def func(i):
a=threading.current_thread().ident
mls.stack[a]=[f'r{i+1}',f's{i+1}']
time.sleep(1)
print(mls.stack[a].pop(),mls.stack[a].pop(),a) mls.stack.pop(a)
print(mls.stack,a) if __name__ == '__main__':
for i in range(10):
t=Thread(target=func,args=(i,))
t.start()
4.RunFlask + request
视图函数 : 根据一个路由地址指向一个函数,这个函数就叫视图函数
app.run()的原理:
app.run()实际上执行的是app里面的run_simple方法,
而run_simple方法调用的是里面的__call__()方法,而__call__中返回了一个wsgi_app()方法
run_simple方法里面需要的参数有(host,port,func,**options)
参数:
host : 服务器的ip地址
port : 服务器端口
func : 当请求过来的时候,执行func函数
options : 传参参数
具体实例代码如下:
from werkzeug.serving import run_simple
from werkzeug.wrappers import Response,Request @Request.application
def app(req):
if req.path == '/login':
return login(req)
return Response('200 OK') def login(res):
return Response('欢迎来到登陆页面') run_simple('127.0.0.1',8888,app)
req的意思就是request,他是werkzeug里面的用法,记住就行
5.请求上文
请求上文的意思是: 你怎么将app,request,session放进去的
首先我们要清楚,run方法实际上执行的是__call__方法,而通过源码我们发现__call__实际上返回的是一个wsgi_app的方法




返回到wsgi_app中
我们得到了ctx返回了一个request_context对象,对象里面有 --> app, request , session




最后得到结果: top是LocalStack中的top方法


到这里我们回顾之前一个学习的知识:
class Foo(object):
def __call__(self, *args, **kwargs):
print("我是可以执行的对象") def __setattr__(self, key, value):
print(key,value) def __getattr__(self, item):
print(item) f=Foo() #对象加括号 : 调用哪个__call__方法
f.num
#这里实际上执行的是__getattr__方法,如果我们在上面没有写这个函数,那么会报错
#以上打印的结果为 num f.num=1
#这里实际上执行的是__setattr__方法
#以上打印的结果为 num , 1
所以在上面我们发现 _local.stack[-1] ,所以我们是不是要找_local是不是有__getattr__方法呀



所以最后我们得到的 top结果为 None.




最后返回的rv:

到这里,请求上文也就结束了
6.请求下文
请求下文是你怎么将app,request,session拿出来调用的
请求下文是在你执行视图函数的时候才开始运行的
请求下文是执行函数的时候,request.方法或者使用到session的时候才到了请求下文的内容






因为我们之前request.method 所以执行了__getattr__方法



flask 第四章 偏函数 Local空间转时间 myLocalStack RunFlask+request 请求上下文的更多相关文章
- 《学习OpenCV》练习题第四章第八题ab
这道题是利用OpenCV例子程序里自带的人脸检测程序,做点图像的复制操作以及alpha融合. 说明:人脸检测的程序我参照了网上现有的例子程序,没有用我用的OpenCV版本(2.4.5)的facedet ...
- 《学习OpenCV》练习题第四章第七题abc
题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...
- 【TCP/IP详解 卷一:协议】第四章 ARP:地址解析协议 以及其他部分的一些知识
4.1 引言 数据链路 如以太网(Ethernet) 或者 令牌环网 都有自己的寻址机制(一般为 48 bit 的地址). 一个网络(数据链路层) 可以同时被多个不同的网络使用.比如,一组使用TCP/ ...
- flask基础之AppContext应用上下文和RequestContext请求上下文(六)
前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...
- 《深入理解java虚拟机》读书笔记三——第四章
第四章 虚拟机性能监控与故障处理工具 1.JDK命令行工具 jps命令: 作用:列出正在运行的虚拟机进程. 格式:jps [option] [hostid] 选项:-q 只输出LVMID(Local ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
- 《Linux内核设计与实现》读书笔记 第四章 进程调度
第四章进程调度 进程调度程序可看做在可运行太进程之间分配有限的处理器时间资源的内核子系统.调度程序是多任务操作系统的基础.通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发执行的 ...
- 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...
- PRML读书会第四章 Linear Models for Classification(贝叶斯marginalization、Fisher线性判别、感知机、概率生成和判别模型、逻辑回归)
主讲人 planktonli planktonli(1027753147) 19:52:28 现在我们就开始讲第四章,第四章的内容是关于 线性分类模型,主要内容有四点:1) Fisher准则的分类,以 ...
随机推荐
- 在vim下打开终端
注意:仅在vim8.1下可用 使用方法: :term 打开默认的终端 如果是linux,或者使用wsl, :term bash Ctrl+W/Ctrl+N 将终端设置成normal模式
- 机器学习总结(一) Adaboost,GBDT和XGboost算法
一: 提升方法概述 提升方法是一种常用的统计学习方法,其实就是将多个弱学习器提升(boost)为一个强学习器的算法.其工作机制是通过一个弱学习算法,从初始训练集中训练出一个弱学习器,再根据弱学习器的表 ...
- JS宽高理解
1.clentWidth和clientHeight ①加入无padding.无滚动条显示占据位置 clientWidth=style.width ②假如有padding.无滚动 clientWidth ...
- express之req res
request对象和response对象 Request req.baseUrl 基础路由地址 req.body post发送的数据解析出来的对象 req.cookies 客户端发送的cookies数 ...
- shell脚本中如何插入其它脚本?
答: 示例如下: #!/bin/sh . added.sh #include other script echo "hello"
- 使用Travis CI自动部署博客到github pages和coding pages
每次换系统或换电脑之后重新部署博客总是很苦恼?想像jekyll那样,一次性部署完成后,以后本地不用安装环境直接 git push 就能生成博客?那推荐你应该使用使用 Travis CI了. 这篇文章我 ...
- Python装饰器的另类用法
之前有比较系统介绍过Python的装饰器(请查阅<详解Python装饰器>),本文算是一个补充.今天我们一起探讨一下装饰器的另类用法. 语法回顾 开始之前我们再将Python装饰器的语法回 ...
- 爬虫基础之requests模块
1. 爬虫简介 1.1 概述 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 1.2 爬虫的价值 在互 ...
- ArcGIS JS API4 With VueJS集成开发
1.USING VUEJS WITH ARCGIS API FOR JAVASCRIPT,集成VUE到ArcGIS JS开发中. 2.ARCGIS API 4 FOR JS WITH VUE-CLI ...
- POJ 3616 奶牛挤奶
Milking Time 贝茜是一个勤劳的牛.事实上,她如此专注于最大化她的生产力,于是她决定安排下一个N(1≤N≤1,000,000)小时(方便地标记为0..N-1),以便她生产尽可能多的牛奶. ...