python web面试题

1、分别描述HTTP请求和响应的报文的结构,请求、响应报文结构的相同和不同。描述一下RESful协议、以及涉及到的方法以及代表的含义。

HTTP请求报文

一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据。

1)请求行

请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1
方法字段就是HTTP使用的请求方法,比如常见的GET/POST

2)请求头部

HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者 POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说 Content-Length必须出现。
常见的请求头字段含义:

  • Accept: 浏览器可接受的MIME类型。
  • Accept-Charset:浏览器可接受的字符集。
  • Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
  • Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
  • Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
  • Content-Length:表示请求消息正文的长度。
  • Host: 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
  • If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。
  • Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
  • User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
  • Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
  • Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
  • From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。
  • Connection:处理完这次请求后是否断开连接还是继续保持连接。如果Servlet看到这里的值为“Keep- Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入 ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
  • Range:Range头域可以请求实体的一个或者多个子范围。例如,
    — 表示头500个字节:bytes=0-499
    — 表示第二个500字节:bytes=500-999
    — 表示最后500个字节:bytes=-500
    — 表示500字节以后的范围:bytes=500-
    — 第一个和最后一个字节:bytes=0-0,-1
    — 同时指定几个范围:bytes=500-600,601-999
    — 但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。

3)空行

它的作用是通过一个空行,告诉服务器请求头部到此为止。

4)请求数据

若方法字段是GET,则此项为空,没有数据
若方法字段是POST,则通常来说此处放置的就是要提交的数据

HTTP响应报文

同样的,HTTP响应报文也由三部分组成:响应行、响应头、响应体

1)响应行

响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK
其中协议版本HTTP/1.1或者HTTP/1.0,200就是它的状态码,OK则为它的描述。
常见状态码:

  • 100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
  • 200~299:表示成功接收请求并已完成整个处理过程。常用200
  • 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存)
  • 400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够)
  • 500~599:服务器端出现错误,常用500

2)响应头

响应头用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据。
设置HTTP响应头往往和状态码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。应答头可以用来完成:设置Cookie,指定修改日期,指示浏览器按照指定的间隔刷新页面,声明文档的长度以便利用持久HTTP连接,……等等许多其他任务。

3)响应体

响应体就是响应的消息体,如果是纯数据就是返回纯数据,如果请求的是HTML页面,那么返回的就是HTML代码,如果是JS就是JS代码,如此之类。
REST – Representational State Transfer 直接翻译:表现层状态转移。
所谓REST就是用URL定位资源,用HTTP描述操作。

追问:关键是 RESTful 之前也一直是 url 来定位资源的啊?!

答:RPC的话很多不是资源,而是操作,例如/DeleteOrder/GetOrder?id=1
REST中URI使用名词而不是动词,且推荐用复数。,例如/DeleteOrder/orders/1

RESTful协议

-(1)每一个URI代表一种资源;
-(2)客户端和服务器之间,传递这种资源的某种表现层(Representation);
-(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

Restful用到的方法:

-Jersey API、HttpURLConnection、HttpClient、JAX-RS API、webClient

2,描述一下TCP通信协议的1+.建立连接,2.数据传输,3.断开连接 各个阶段的流程;使用流程图或时序图,描述出Python语境下的socket通信流程(服务器和客户端)。

建立连接/三次握手

客户端 向 服务器TCP层 发送一个请求 FIN
服务器 收到了 服务器 发送的 FIN ,返回 FIN 和 ACk,表示收到了 客户端的请求
客户端 收到 服务器返回的数据 后再次发送 ACk,和服务器建立了链接

数据传输

客户端 发送 数据给服务器,服务器收到了,返回给客户端一个 ACK
客户端 发送 数据给服务器,服务器收到了,返回给客户端一个 ACK

简述python中的垃圾回收机制。

在python中的垃圾回收机制主要以引用计数为主要手段,以标记清除和隔代回收作为辅助操作手段,完成对内存中无效语言的自动管理操作

①引用计数

一个对象被创建或拷贝时计数加1,当引用变量被销毁时减1,当计数为0时,该对象会被清除
优点:操作简单,实时性能优秀,能在最短时间内获得并运算对象引用数
缺点:内存负担加重,会造成常驻内存的情况

②标记清除

通过根节点判断对象是否可达,将不可达部分清除

③隔代回收

以空间换取时间效率。python为了提高程序执行效率,将垃圾回收机制进行了阀值限定。第0代中的垃圾回收机制执行最为密集,其次是第1代,最后是第2代

3、python2和python3的区别?

1.性能

Py3.0 运行 pystone benchmark 的速度比 Py2.5 慢 30%。 Guido 认为 Py3.0 有极大的优化空间, 在字符串和整形操作上可以取得很好的优化结果。Py3.1 性能比 Py2.5 慢 15%, 还有很大的提升空间。

2.编码

Py3.X 源码文件默认使用 utf-8 编码

3. 语法

1) 去除了<>,全部改用!=
2) 去除``,全部改用 repr()
3) 关键词加入 as 和 with,还有True,False,None
4) 整型除法返回浮点数,要得到整型结果,请使用//
5) 加入 nonlocal 语句。使用noclocal x可以直接指派外围(非全局)变量
6) 去除 print 语句,加入print()函数实现相同的功能。同样的还有exec语句,已经		改为exec()函数
7) 改变了顺序操作符的行为, 例如 x<y, 当 x 和 y 类型不匹配时抛出 TypeError 而		不是返回随即的 bool 值
8) 输入函数改变了, 删除了 raw_input, 用 input 代替:
	X:guess = int(raw_input('Enter an integer : ')) # 读取键盘输入的方法
	X:guess = int(input('Enter an integer : '))
9) 去除元组参数解包。 不能 def(a, (b, c)):pass 这样定义函数了
10) 新式的 8 进制字变量, 相应地修改了 oct()函数。
11) 增加了 2 进制字面量和 bin()函数
12) 扩展的可迭代解包。在 Py3.X 里,a, b, *rest = seq 和 *rest, a = seq 都是合
	法的, 只要求两点:rest 是 list对象和 seq 是可迭代的。
13) 新的 super(),可以不再给 super()传参数,
14) 新的 metaclass 语法:
	class Foo(*bases, **kwds):
		pass
15) 支持 class decorator。用法与函数 decorator 一样:

4. 字符串和字节串

1) 现在字符串只有 str 一种类型, 但它跟 2.x 版本的 unicode 几乎一样。
2) 关于字节串, 请参阅“数据类型” 的第 2 条目

5.数据类型

1)Py3.X 去除了 long 类型, 现在只有一种整型——int, 但它的行为就像 2.X 版本	的 long
2) 新增了 bytes 类型, 对应于 2.X 版本的八位串, 定义一个 bytes 字面量的方法	如下:str 对象和 bytes 对象可以使用.encode() (str -> bytes) or .decode() (bytes ->str)方	法相互转化。
3) dict 的.keys()、 .items 和.values()方法返回迭代器, 而之前的 iterkeys()等函数都	被废弃。 同时去掉的还有dict.has_key(), 用 in 替代它吧

6.面向对象

1) 引入抽象基类(Abstraact Base Classes, ABCs) 。
2) 容器类和迭代器类被 ABCs 化。
3) 迭代器的 next()方法改名为__next__(), 并增加内置函数 next(), 用以调用迭代	器的__next__()方法
4) 增加了@abstractmethod 和 @abstractproperty 两个 decorator, 编写抽象方法(属	性)更加方便。

7.异常

1) 所以异常都从 BaseException 继承, 并删除了 StardardError
2) 去除了异常类的序列行为和.message 属性
3) 用 raise Exception(args)代替 raise Exception, args 语法
4) 捕获异常的语法改变, 引入了 as 关键字来标识异常实例
5) 异常链, 因为__context__在 3.0a1 版本中没有实现

8.模块变动

1)移除了 cPickle 模块,可以使用 pickle 模块代替。最终我们将会有一个透明高效的	模块。
2) 移除了 imageop 模块
3) 移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter,
mimify, popen2,rexec, sets, sha, stringold, strop, sunaudiodev, timing 和 xmllib 模块
4)移除了 bsddb 模块(单独发布,可以从 http://www.jcea.es/programacion/pybsddb.htm
获取)
5) 移除了 new 模块
6) os.tmpnam()和 os.tmpfile()函数被移动到 tmpfile 模块下
7) tokenize 模块现在使用 bytes 工作。 主要的入口点不再是 generate_tokens, 而	是tokenize.tokenize()

9.其它

1) xrange() 改名为 range(), 要想使用 range()获得一个 list, 必须显式调用:
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2) bytes 对象不能 hash, 也不支持 b.lower()、 b.strip()和 b.split()方法, 但对于
后两者可以使用 b.strip(b’ \n\t\r \f’ )和 b.split(b’ ‘)来达到相同目的
3) zip() 、 map()和 filter()都返回迭代器。而 apply()、callable()、coerce()、
execfile()、 reduce()和 reload ()函数都被去除了现在可以使用 hasattr()来 替换callable(). 	hasattr()的语法如: hasattr(string, '__name__')
4 ) string.letters 和相关的 .lowercase和 .uppercase被去除,请改用string.ascii_letters 	等
5) 如果 x < y 的不能比较, 抛出 TypeError 异常。 2.x 版本是返回伪随机布尔值的
6) __getslice__系列成员被废弃。 a[i:j]根据上下文转换为 a.__getitem__(slice(I, j))
或 __setitem__和 __delitem__调用
7) file 类被废弃 

4. 线程和进程有什么区别?

进程和线程的关系:

(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.

进程与线程的区别:

(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值