python面试题总结

2021/4/17 14:25:26

本文主要是介绍python面试题总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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五种基本数据类型和底层使用的数据结构

数据类型底层数据结构
stringsds(简单动态字符串)
hashziplist(压缩列表)、hashtable(哈希表)
listziplist(压缩列表)、linkedlist(双端链表)
setintset(整数集合、hashtable(哈希表))
zsetziplist(压缩列表)、skiplist(跳表)


这篇关于python面试题总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程