1.什么是中间件
中间件是一个轻量级的,底层的插件。可以介入Django的请求和相应过程,修改DJango的输入或输出。是面向切面编程。Django内置了4个切点和1个异常捕获点。分别对应了中间件的5个方法。
2.中间件常见用途
3.django类方法的调用as_veiw底层原理。
首先要确定,这个类方法继承自View类。才能被当做CBV模式。
当请求到达url之后,会进行正则匹配,并映射到相应的类.as_view()方法。
as_view()方法是父类VIew中的方法。
首先调用View.as_view()方法,此时对请求的Method进行判断,如果是小写,会raise一个异常。接着调用as_view()方法中的view()方法,view()方法进一步调用View类内的dispatch()方法。,在dispatch()方法中,request.method判断出HTTP请求的方法为GET,request.method.lower()将GET转换为get,getattr方法将得到的get负值给handler,(如果判断类中没有定义该方法,则赋值给handle http_method_not_allow方法,并直接返回response)然后通过return handler()调用handler()方法,即为RegisterView类中的get()方法,而get()方法会返回模板中的html文件(即register.html)。其返回的结果依次return给方法的调用者,最终返回给View.as_view()方法的结果是模板中的register.html文件。
父类VIew还自带定义了options方法,可以查看类中定义了(即允许使用)的请求方法。
3.cookie和session的关系
1.celery 原理
celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)。
组件介绍:
工作原理:
它的基本工作就是管理分配任务到不同的服务器,并且取得结果。至于说服务器之间是如何进行通信的?这个Celery本身不能解决。所以,RabbitMQ作为一个消息队列管理工具被引入到和Celery集成,负责处理服务器之间的通信任务。和rabbitmq的关系只是在于,celery没有消息存储功能,他需要介质,比如rabbitmq、redis、mysql、mongodb 都是可以的。推荐使用rabbitmq,他的速度和可用性都很高。
2.迭代器(iterator)和生成器
实现了__iter__和__next__方法的对象都称为迭代器。迭代器是一个有状态的对象,在调用next() 的时候返回下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。
生成器其实是一种特殊的迭代器,但是不需要像迭代器一样实现__iter__和__next__方法,只需要使用关键字yield就可以。
1.nginx
2.为什么选择gunicorn,gunicorn和uwsgi有什么区别。
首先在性能上,gunicorn和uwsgi区别不大。不过由于gunicorn是python编写,uwsgi是c语言编写,uwsgi的性能在极限状态下略有优势。
使用上,gunicorn的学习和使用配置较uwsgi要简单。包括官方文档,gunicorn也是更简单友好一些。
3.i/o多路复用
1.http和tcp协议之间的关系
http协议是建立在tcp协议之上的一种应用。当tcp三个握手建立连接之后,就需要用http协议来传输数据了。数据传输完成后,tcp进行4次挥手断开连接。之后浏览器把页面渲染出来。
1.memcache
https://mp.weixin.qq.com/s/zh9fq_e2BgdIeR8RKtY6Sg
2.使用redis分布式锁,因为redis是单线程的,如何进行高并发优化。
使用分段锁。
例如:商品秒杀的时候。假设一个商品的数量为100,可以分成10个锁,每个锁控制10个商品的秒杀。这样并发的性能就提升了10倍。
3.使用redis分布式锁时,redis是集群或主从部署,在锁还未同步到从机时,主机宕机。如何解决这个问题。
使用redlock 红锁。
转向使用zookeeper。
4.redis五种基本数据类型和底层使用的数据结构
数据类型 | 底层数据结构 |
---|---|
string | sds(简单动态字符串) |
hash | ziplist(压缩列表)、hashtable(哈希表) |
list | ziplist(压缩列表)、linkedlist(双端链表) |
set | intset(整数集合、hashtable(哈希表)) |
zset | ziplist(压缩列表)、skiplist(跳表) |