Python Web是python程序员的一大就业方向,以下是针对这一方向的面试题总结。
1.解释一下WSGI和FastCGI的关系?
CGI全称是"公共网关接口"(CommonGateway Interface),HTTP服务器与你的或其他机器上的程序进行"交谈"的一种工具,其程序必须运行在网络服务器上。CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。
FastCGI像是一个常驻型的CGI,它可以一直执行着,只要激活后,不会每次都要花时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。它还支持分布式的运算,即FastCGI程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器的请求。
FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。
WSGI的全程为: PythonWeb Server Gateway Interface v1.0(Python Web服务器网关接口)
它是Python应用程序和Web服务器之间的一种接口。
它的作用,类似于FCGI或FASTCGI之类的协议作用。
WSGI的目标,是要建立一个简单的普遍适用的服务器与Web框架之间的接口。
Flup就是使用 Python 语言对 WSGI 的一种实现,是可以用于 Python 的应用开发中的一种工具或者说是一种库。
Spawn-fcgi是一个小程序,这个程序的作用是管理fast-cgi进程,那么管理wsgi进程也是没有问题的,功能和php-fpm类似。
简单来说,WSGI和FastCGI都是一种CGI,用于连接Web服务器与应用程序,而WSGI专指Python应用程序。而flup是WSGI的一种实现,Spawn-fcgi是用于管理flup进程的一个工具,可以启动多个wsgi进程,并管理它们。
2.解释一下Django和Tornado的关系、差别
Django源自于一个新闻Web站点,于 2005 年以开源的形式被释放出来。
Django 框架的核心组件有:用于创建模型的对象关系映射为最终用户设计的完美管理界面一流的URL设计,设计者友好的模板语言缓存系统等等。
它鼓励快速开发,并遵循MVC设计。Django遵循BSD版权。
Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调跨苏开发和DRY(Do Not RepeatYourself))原则。
Tornado是FriendFeed使用的可扩展的非阻塞式web服务器及其相关工具的开源版本。这个Web框架看起来有些像web.py或者Google的webapp,不过为了能有效利用非阻塞式服务器环境,这个Web框架还包含了一些相关的有用工具和优化。
Tornado和现在的主流Web的服务器框架(包括大多数Python的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其非阻塞的方式和对epoll的运用,Tornado每秒可以处理数以千计的连接,这意味着对于实时Web服务来说,Tornado是一个理想的Web框架。我们开发这个Web服务器的主要目的就是为了处理FriendFeed的实时功能——在FriendFeed的应用里面每一个活动用户都会保持一个服务器连接。
3.解释下django-debug-toolbar的使用
使用django开发站点时,可以使用django-debug-toolbar来进行调试。在settings.py中添加’debug_toolbar.middleware.DebugToolbarMiddleware’到项目的MIDDLEWARE_CLASSES 内。
4.解释下Django使用redis缓存服务器
为了能在Django中使用redis,还需要安装redis for Django的插件。然后在Django的settings中配置。
安装
pip install django-redis
配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
附录django-redis 中文文档:http://django-redis-chs.readthedocs.io/zh_CN/latest/#
5.如何进行Django单元测试?
Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。类名为django.test.TestCase,继承于python的unittest.TestCase。
6.解释下Http协议
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
HTTP协议的主要特点可概括如下:
(1).支持客户/服务器模式
(2).简单快速:客户端向服务器请求服务时,只需要传送请求方法和路径。请求方法常用的有GET、POST、HEAD等。每种方法规定了客户与服务器联系的类型不同。由于HTTP服务器的程序规模小,因为通信速度很快。
(3).灵活:HTTP运行传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
(4).无连接:无连接的含义是限制每次连接只能处理一个请求。服务器处理完客户端的请求,并收到客户端的应答后,即断开连接。采用这种方式可以节省传输时间。
(5).无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
7.解释下Http请求头
Accept:指浏览器或其他客户可以接受的MIME文件格式。可以根据它判断并返回适当的文件格式。
Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器默认值是ISO-8859-1.
Accept-Language:指出浏览器可以接受的语言种类,如en或en-us,指英语。
Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。
Cache-Control:设置关于请求被代理服务器存储的相关选项。一般用不到。
Connection:用来告诉服务器是否可以维持固定的HTTP连接。HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接。
Content-Type:用来表名request的内容类型。可以用HttpServletRequest的getContentType()方法取得。
Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
8.常见的响应状态码
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息-表示请求已接收,继续处理
2xx:成功-表示请求已被成功接收、理解、接受
3xx:重定向-要完成请求必须进行更进一步的操作
4xx:客户端错误-请求有语法错误或请求无法实现
5xx:服务器端错误-服务器未能实现合法的请求
常见状态码、状态描述、说明:
200 OK //客户端请求成功
202 Accepted/接受 // 告诉客户端请求正在被执行,但还没有处理完。
203 Non-Authoritative Information/非官方信息 //是表示文档被正常的返回,但是由于正在使用的是文档副本所以某些响应头信息可能不正确。这是 HTTP 1.1中新加入的。
300 Multiple Choices/多重选择 // 表示被请求的文档可以在多个地方找到,并将在返回的文档中列出来。如果服务器有首选设置,首选项将会被列于定位响应头信息中。
400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权,这个状态码必须和WWW-Authenticate报头域一起使用
403 Forbidden // 服务器收到请求,但是拒绝提供服务
404 Not Found // 请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
9.你是如何进行项目上线部署的,简单谈一下步骤
参考我的这篇文章:https://www.jianshu.com/p/9c83916b404c
10.在Django项目中你有没有用到cookie,是怎么使用的?
参考我的这篇文章:https://www.jianshu.com/p/c8728ab807b5