您的位置:首页 > 编程语言 > Python开发

笔试、面试题收集(主要是Python Web开发)

2017-11-22 13:19 483 查看

高并发的解决方案?

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禁止请求报文包含实体主体数据。

语言基础、HTTP基础epoll、select是个啥?

gevent用过没,咋实现的?

redis用过没,讲讲怎么用的?

多进程、协程如何使用?

消息队列用过没?

django、flask、tornado这几个框架有啥特点?

Python有哪些数据结构?

面试官不会仅仅问你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这两个难度级别的题就可以,最好多做几遍,把各种解法都想通了,那面试和笔试中数据结构和算法的部分基本就没问题了。。

参考文献:

1.互联网。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息