python面试题(web)
Python 语言
类变量和实例变量
@staticmethod 和 @classmethod;@property
闭包,装饰器,迭代器,yield,生成器?
staticmethod和装饰器的区别?
*args
和**kwargs
鸭子类型
@property 和 @setter
-
Python的垃圾回收机制(GC: garbage collection)
__new__
和__init__
的区别。Python里面如何拷贝一个对象?
自省
写一个bottle绑定 url path的 decorator 或者口述一下原理。
标准库线程安全的队列是哪一个?不安全的是哪一个?logging是线程安全的吗?
python适合的场景有哪些?当遇到计算密集型任务怎么办?
python高并发解决方案?我希望听到twisted->tornado->gevent,能扯到golang,erlang更好
解释一下 Gevent 和 threading / multiprocessing 的关系
全局解释器锁 GIL
ORM
元类 metaclass
描述符 descriptor
协程 corountine
pythonic
Python有哪些数据结构?
python中多线程多进程的并发?哪一种比较高?
-
python的面向对象?
26.
Web 开发框架
CGI、WSGI、FastCGI ?
Flask 源码?
Django 和 Tornado 的关系、差别?
django、flask、tornado这几个框架有啥特点?
restfull 风格的api怎么写?
网页嵌入的im原理?
部署一个任何py服务器+django的应用,简单描述一下?
操作系统原理
-
并行与并发的区别?
- 并行是指两个或多个事件在同一时刻发生。
- 并发是指两个或多个事件在同一时间间隔内发生。
进程间通信
多进程和多线程
epoll,select的区别?边缘触发,水平触发区别?
负载均衡的几种算法?
计算密集型,IO密集型任务怎么办?
time_wait
是什么情况?出现过多的close_wait
可能是什么原因?
算法
快速排序
冒泡
二分法
动态规划
。。。。。。
计算机网络
协议的本质?
TCP/IP
socket编程?
tcp/udp的区别?
tcp粘包是怎么回事,如何处理?
udp有粘包吗?
HTTP(含2.0)
有哪几种常用的请求方法?简单说一说他们的区别?
post 和 get方法区别
从输入URL到页面加载完成发生了什么?
数据库(存储)SQL/cache/nosql
关系型数据库和非关系型数据库的区别?
有没有听过缓存层?缓存层是干嘛的?
存储可能包含rdbms,nosql以及缓存等,我以mysql,redis举例
MySQL 相关
ORM?
手写SQL?
增删改查
触发器
SQL 语法、调优
SQLAlchemy 的用法
谈谈mysql字符集和排序规则?
varchar与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符
primary key和unique的区别?
外键有什么用,是否该用外键?外键一定需要索引吗?
myisam与innodb的区别?innodb的两阶段锁定协议是什么情况?
索引有什么用,大致原理是什么?设计索引有什么注意点?
redis相关
什么场景用redis,为什么mysql不适合?
谈谈redis的事务?用事务模拟原子+1操作?原子操作还有其它解决方案吗?
redis内存满了会怎么样?
设计模式
单例模式
工厂模式
装饰器、面向切面编程 AOP
。。。。。。
网络安全
web安全相关
解释一下 cookie 和 session 的关系
xsrf 的攻击和防范方法解释一下
sql注入是怎么产生的,如何防止?
xss如何预防?htmlescape后能否避免xss?
csrf是什么?django是如何防范的?
密码技术
什么是分组加密?加密模式有哪些?ecb和cbc模式有什么区别?为什么需要iv向量?
简单说说https的过程?
对称加密与非对称加密区别?
4.如何生成共享秘钥? 如何防范中间人攻击?
其他
bottleneck
rush condition的处理方法,scale的方向
做个短链接服务
golang,rust是否了解?
numpy,pandas是啥?
消息队列?
——————
—————————–
高并发的解决方案?
1.使用代理服务器,“根据因特网流量状况以及内容类型将请求导向特定的Web服务器”(注:《HTTP权威指南》“6.2 为什么使用代理”,P141)。
HTTP/0.9 ?
HTTP/0.9 报文也由请求和响应组成, 但请求中只包含方法和请求 URL, 响应中只包含实体。 它没有版本信息(它是第一个, 而且是当时唯一的版本), 没有状态码或原因短语, 也没有首部。
但这种简单协议无法提供更多的灵活性, 也无法实现本书中描述的大部分 HTTP 特性和应用。 这里对其进行简要的描述, 是因为仍然有一些客户端、 服务器和其他应用程序在使用这个协议, 应用程序的编写者应该清楚它的局限性。
(注:《HTTP权威指南》“3.2.5 版本0.9的报文”,P55-P56。)
幂等性?
即使在非错误情况下, 连接也可以在任意时刻关闭。 HTTP 应用程序要做好正确处理非预期关闭的准备。 如果在客户端执行事务的过程中, 传输连接关闭了, 那么,除非事务处理会带来一些副作用, 否则客户端就应该重新打开连接, 并重试一次。
对管道化连接来说, 这种情况更加严重一些。 客户端可以将大量请求放入队列中排队, 但源端服务器可以关闭连接, 这样就会留下大量未处理的请求, 需要重新调度。
副作用是很重要的问题。 如果在发送出一些请求数据之后, 收到返回结果之前, 连接关闭了, 客户端就无法百分之百地确定服务器端实际**了多少事务。 有些事务,比如 GET 一个静态的 HTML 页面, 可以反复执行多次, 也不会有什么变化。 而其他一些事务, 比如向一个在线书店 POST 一张订单, 就不能重复执行, 不然会有下多张订单的危险。
如果一个事务, 不管是执行一次还是很多次, 得到的结果都相同, 这个事务就是幂等的。 实现者们可以认为 GET、HEAD、 PUT、 DELETE、 TRACE 和 OPTIONS 方法都共享这一特性。 19 客户端不应该以管道化方式传送非幂等请求(比如 POST)。否则, 传输连接的过早终止就会造成一些不确定的后果。 要发送一条非幂等请求,就需要等待来自前一条请求的响应状态。尽管用户 Agent 代理可能会让操作员来选择是否对请求进行重试, 但一定不能自动重试非幂等方法或序列。 比如, 大多数浏览器都会在重载一个缓存的 POST 响应时提供一个对话框, 询问用户是否希望再次发起事务处理
(注:《HTTP权威指南》“4.7.3 连接关闭容限、 重试以及幂等性”,P107-P108。)
post、get、put、head、delete这五种HTTP方法以及它们之间的相同点和不同点?
一旦 Web 服务器收到了请求, 就可以根据方法、 资源、 首部和可选的主体部分来对请求进行处理了。
有些方法(比如 POST) 要求请求报文中必须带有实体主体部分的数据。 其他一些方法(比如 OPTIONS) 允许有请求的主体部分, 也允许没有。 少数方法(比如GET) 禁止在请求报文中包含实体的主体数据。
—————————————————————
面试官不会仅仅问你flask提供的API怎么用,而是会继续深入的问下去flask的源码里怎么设计这个API的,甚至问到如果你来设计这个API,你会怎么设计,这个设计需要用到Python的那些东西等等,会不断的把思维发散开去。。如果你不知道怎么学,去看下招聘信息,比如这是一段我从某招聘网站上复制下来的招Python Web开发岗位的要求:
- 熟练掌握Python,熟悉python异步IO、多线程、多进程编程;
- 熟悉一种web开发框架(Django/Flask/Tornado),参与过实际的python web开发;
- 了解前端开发技术,熟悉HTTP协议,TCP/IP,HTML, 了解Ajax, oauth,Ajax, Jquery等,熟悉前后端的交互过程;
- 熟悉一种常用的ORM框架,不限于 peewee/SQLAlchemy;
- 熟悉常用的数据结构算法、oo思想、一般设计模式,了解操作系统原理;
7.有比较强的trouble shooting能力,善于通过错误跟踪和日志分析快速解决问题。
差不多是这样的。。所以,我的建议是,需要了解的基础只是还是了解下吧,不需要非常深入,但某些概念还是要搞熟悉。
背概念+代码实现。
比如生成器,需要知道的有这些:
1.概念(或者说特性)-保存之前的数据,然后在下一次调用时能在上一次调用产生的数据的基础之上进行计算,这种函数在Python中称为生成器。
2.代码实现:简单的就是怎么使用生成器,创建一个生成器等。难度大的玩法就多了,比如,自己实现一个拥有生成器功能的函数;再比如,使用生成器实现迭代器,再再比如使用生成器模拟线程并发等等。
3.一般面试,如果问到生成器,肯定会问到的是第一部分关于生成器的概念(或者说特性),然后问的深一点就会涉及到这些特性有什么用途,能用来实现什么东西,这个就是第二部分的东西了。
建议去刷LeetCode,做完easy和medium这两个难度级别的题就可以,最好多做几遍,把各种解法都想通了,那面试和笔试中数据结构和算法的部分基本就没问题了。。