- bootstrap中的响应式布局是如何完成的
什么是相应式:
随着屏幕分辨率不同在页面做出了不同的响应

原理
分辨率不同占比不同
例
bootstrap删格系统sm,md,lg自带响应功能,xs不带响应功能
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="row">
<div class="col-md-6">hfg</div>
<div class="col-md-6">4552</div>
</div>
</body>
</html>
运行结果
原理:
源码


基于@midia实现
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.c1 {
background-color: red;
}
@media (min-width:600px){
.c1{
background-color: green;
}
}
</style>
</head>
<body>
<div class="c1">
sdfsdfsdf
</div>
</body>
</html>

- 跨域
由于浏览器有同源策略的限制,导致不同域发请求并获取返回值时,浏览器就会阻止。
有些不阻止,如:在head中的link和body中的script,img,src属性的标签无同源策略的不会限制
ajax受同源策略的限制 - 如何解决跨域
cors ,如果浏览器中响应头标注不用限制,安全的数据,在服务端不仅返回数据还要返回响应头,这样浏览器不在阻止
jsonp, 由于script的标签不收同源策略的限制,发送script标签 - flask基本实现原理
flask基于wsgi,(基于socket)wekzeug,
from flask import Flask
app = Flask(__name__) # 实例化Flask对象。app对象中包含了Flask这个类的init中所有东西
'''
decrator = app.route('/index/')
@decrator
def index():
retrun 'hello world'
'''
@app.route('/index') # # 带参数的装饰器,先执行app.route('/index/')= decorator,@decorator再装饰index,
def index(): # 立即执行:decorator(index) # 把url和函数的对应关系加入到self.url_map = Map(),有几个函数就有几个对应关系,如self.url_map = {index的对应关系, login的对应关系}
return 'hello world'
@app.route('/login')
def login():
return 'login'
if __name__ == '__main__':
app.run() # 此时app中多了self.url_map={index的对应关系, login的对应关系} # app.__call__
实例化app时,app中封装的值:



执行run:
run实际是把socket运行起来,run_simple

所有请求都要经过call方法,请求到来,获取请求的url,到app.url_map中匹配对应关系,匹配成功,找到函数,执行函数。所有web框架都是这样。
- flask框架组件:蓝图,session
- flask上下文管理:
轻量,可扩展性强只是表象,其最大特点还是:上下文管理- 原理:
对比Django:
请求进框架一层层到了视图函数前一定做了很多操作,django的request就是请求相关所有数据,但不是最原始的数据,而是经过一步步处理完后的数据。所以到了视图函数是request有参数,而flask中index这个视图函数中没有参数,就是说没人传递这个参数,请求相关数据没有,怎么获取呢?导入request,print(request.method),自己去某个地方拿的。也就是说请求的数据没有传到视图函数时,放到某个地方,如果谁要,就自己去拿,而import request,就是去获取了,而里面有什么,是前面处理过原始请求的人定的。flask中把请求放到某地,别人去取就是flask上下文管理机制。Django是传参到视图函数的形式。这是基本原理,
而实际上更复杂。
当放到到,把请求相关所有数据request和一个session(空值)打包放进RequestContext(ctx)对象中,然后另外一个人读取request中的cookie数据,把原来传给客户的cookie信息拿到放入到空的session中,ctx交个LocalStack对象代理,后续谁获取就去找这个个代理拿,这个代理去Local对象中拿。
LocalStack对象:管理及获取数据
Local对象:存储数据
ctx对象:封装请求和session数据交给LocalStack,ctx也叫请求上下文
请求进来时还封装了另外一个Local对象:app对象和G对象(空字典)封装到AppContext对象app_ctx(也叫应用上下文):交个另外一个LocalStack对象,再交个另外一个Local对象
两个Local分别管理自己的对象。
如果自己不想拿,可以创建四个秘书,叫app,G,request,session,秘书去找LocalStack,LocalStack把数据交个秘书,秘书给我,我才能拿到数据。
视图:
如果想要获取request.method:
-先找到秘书(LocalProxy对象) -->LocalStack -->Local
视图处理完数据,返回给用户数据时表示这个请求终止了。之前的信息不能保存,将此请求放在Local中的数据剔除,因为下次请求来时不知道是哪个。
flask是单进程单线程。但是如果是两请求一起进来。一个进来,一个排队。当处理完第一个再处理第二个。如果有两个线程,一位这两个同时到来,怎样区分。用线程id,请求进来放到Local是标注了线程id,第一个请求来时也标注了线程id。取数据时根据线程拿。请求完成后根据线程id剔除各自数据。
不管有多少个请求,都是两个Local,LocalStack,四个LocalProxy

Local是真正储存数据的,Local内部存的字典。
所有在运行flask时以上变量都创建好了,
接下来的执行app.call,其中的 environ为原生的请求相关的数据,对其进行处理封装。


ctx = self.request_context(environ) = RequestContext(self, environ) =包含( request = app.request_class(environ),self.session = None)
创建好ctx后执行ctx.push()

前面是ctx对象,app_ctx对象:



创建好app_ctx对象后执行app_ctx.push()
把app交给了Local
以上步骤完成后视图函数就可以从以上封装的数据中取了
如在视图函数中执行print(reqeust.method),对象.某方法—>执行:对象.__getattr__方法


实际是执行以下函数

也就是r = ctx.request
其他导入的session,current_app, g用法和以上reqeust用法一模一样,都是找到相应的数据再取出来
以上就是所有flask上下文管理。维护的变量比较多。
Django的上下文管理又是另外一种方式。PhP,java,里面所有框架都是用Django传参的方式。
flask的g的作用:app_ctx中的g,g存在周期请求进来,完成后就没有了,意义是:一次请求生命周期中进行传递参数,如给请求进来时想给视图函数传值。临时放到g中,取时到g中取。如:请求结束后给用户传内容时,给g传个值,用户在g中获取值。和去快递柜取快递一样。
示例:
from flask import Flask, request, session, current_app, g
app = Flask(__name__)
@app.before_request
def b1():
print('之前') # 视图函数前传递给视图函数
g.xxx = 123 # 不能用全局变量传值,因为多线程的情况下可能会改写值,如加锁没有并发效果,通过g传值就可以了
@app.route('/index')
def index():
print('视图')
print(g.xxx)
return 'index'
if __name__ == '__main__':
app.run() # app.__call__
运行结果
之前
127.0.0.1 - - [08/Mar/2019 21:46:38] "GET /index HTTP/1.1" 200 -
视图
123
- RPC
队列:queue模块,redis中的列表,rabbitMQ官网
队列应用场景:
生产者消费者模型,把所有用户请求放到队列中,马上给用户返回:您的请求在处理,稍等,后台很多线程不停处理,处理完了再返回给用户。
RPC
数据交互:公司和公司间调用restful api接口,格式是json字典格式,前几年使用web service,数据是xmls格式,key value格式,rpc依赖于消息队列,如去哪儿网向国航发送查询票务的请求,创建一个队列,把请求和队列名打包放到队列中发送给国航。,以前是去其api取数据,而rpc是国航收到队列后。再查询是否有票,再把回复的消息放到队列中。去哪儿网拿到后立即销毁这个队列。
rpc基于消息队列创造出来用户程序之间的数据传输而用
流程
去哪儿调用者(创建任务信息+创建队列)打包后放入队列
国航读取此队列获取:任务信息 + 响应要放置的队列名称,
国航根据任务信息进行票务查询和操作,把执行结果放入响应的队列中。
去哪儿网从响应队列读取内容,然后将队列删除
公司和公司之间可以通过rpc通信,但是一般不会使用,因为连队列要用户名和密码等。大部分公司之间数据交互使用 restful api。公司内部部门之间系统调用。一般使用rpc通信,因为很快。rabbit MQ官网最后一致图就是rpc原理。
大话数据结构