DAY 95 flask04
1 python的web框架
-django框架,同步框架,3.x以后,加入了异步,websocket
-1.x对websocket支持比较差
-2.x channels
-3.x 可以使用channels,原生支持,asgi协议
-flask,同步框架
-orm没有:sqlalchemy
-session,redis,异步,信号(第三方支持),forms,
-web.py
-tornado:异步,老牌,python2上
-sanic: aiomysql aioredis,异步orm框架
-fastapi:
-websocket:应用层协议,为了解决http协议存在的问题,长连接,服务端主动向客户端推送消息
2 flask框架
-介绍
-基本使用
-登录显示用户信息案例
-配置文件(使用类方式)
-路由系统(基本使用和本质)
-cbv分析
-模板语法
-请求响应
-session(源码:SecureCookieSessionInterface)
-闪现:flash
-请求扩展
-before_request
-after_request
-before_first_request
-teardown_request
-errorhandler
-template_global
-template_filter
-中间件
-服务器中间件
-数据库中间(分库分表,读写分离 mycat)
-消息队列中间件(redis,rabbitmq(保证数据准确性),kafka(吞吐量)...)
-蓝图
-请求上下文分析
服务和服务之间调用
-http符合restful规范
-rpc(远程过程调用):rpc框架:grpc...,底层socket,也用http
-消息队列:
django内置的app中:management
-django自定制命令
python mangae.py initdb (把在项目路径下的sql文件导入数据库)
flask上下文源码回顾
请求上下文执行流程(ctx):
-0 flask项目一启动,有6个全局变量
-_request_ctx_stack:LocalStack对象
-_app_ctx_stack :LocalStack对象
-request : LocalProxy对象
-session : LocalProxy对象
-1 请求来了 app.__call__()---->内部执行:self.wsgi_app(environ, start_response)
-2 wsgi_app()
-2.1 执行:ctx = self.request_context(environ):返回一个RequestContext对象,并且封装了request(当次请求的request对象),session
-2.2 执行: ctx.push():RequestContext对象的push方法
-2.2.1 push方法中中间位置有:_request_ctx_stack.push(self),self是ctx对象
-2.2.2 去_request_ctx_stack对象的类中找push方法(LocalStack中找push方法)
-2.2.3 push方法源码:
def push(self, obj):
#通过反射找self._local,在init实例化的时候生成的:self._local = Local()
#Local()flask封装的支持线程和协程的local对象
# 一开始取不到stack,返回None
rv = getattr(self._local, "stack", None)
if rv is None:
#走到这,self._local.stack=[],rv=self._local.stack
self._local.stack = rv = []
# 把ctx放到了列表中
#self._local={'线程id1':{'stack':[ctx,]},'线程id2':{'stack':[ctx,]},'线程id3':{'stack':[ctx,]}}
rv.append(obj)
return rv
-3 如果在视图函数中使用request对象,比如:print(request)
-3.1 会调用request对象的__str__方法,request类是:LocalProxy
-3.2 LocalProxy中的__str__方法:lambda x: str(x._get_current_object())