首页 / 面试 / python面试题总结
python面试题总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python面试题总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4710字,纯文字阅读大概需要7分钟。
内容图文
![python面试题总结](/upload/InfoBanner/zyjiaocheng/592/1c33c205789447d9806d1e2b6214fcf7.jpg)
django相关
1.什么是中间件
中间件是一个轻量级的,底层的插件。可以介入Django的请求和相应过程,修改DJango的输入或输出。是面向切面编程。Django内置了4个切点和1个异常捕获点。分别对应了中间件的5个方法。
- process_request(self, request):在执行视图前被调用,每个请求上都会调用,不主动进行返回或返回HttpResponse对象。
- process_view(self, request,view_func,view_args,view_kwargs): 调用视图之前执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象。
- process_template_response(self, request,response): 在视图刚好执行完之后执行,每个请求都会调用,不主动进行返回或返回HttpResponse对象。
- process_response(self, request,response): 所有响应返回浏览器之前调用,每个请求都会调用,不主动进行返回或返回HttpResponse对象。
process_exception(self, request,exception): 当视图抛出异常时调用,不主动进行返回或返回HttpResponse对象。
2.中间件常见用途
- 实现统计功能:
统计IP,统计浏览器 - 实现权重控制:
黑名单,白名单 - 实现反爬:
反爬虫,频率控制 - 界面友好化,应用交互友好化:
应用异常不显示500报错,显示指定提示页面。
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的关系
python
1.celery 原理
celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)。
组件介绍:
- Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
- Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。
- Broker:消息代理,又称消息中间件,接受任务生产者发送过来的任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息代理,但适用于生产环境的只有RabbitMQ和Redis, 官方推荐 RabbitMQ。
- Celery Worker:执行任务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。
- Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。
工作原理:
它的基本工作就是管理分配任务到不同的服务器,并且取得结果。至于说服务器之间是如何进行通信的?这个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(跳表) |
内容总结
以上是互联网集市为您收集整理的python面试题总结全部内容,希望文章能够帮你解决python面试题总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。