Python工程师面试题 与Python Web相关


Posted in Python onJanuary 14, 2016

本文为大家分享的Python工程师面试题主要与Python Web相关,供大家参考,具体内容如下

1、解释一下 WSGI 和 FastCGI 的关系?
CGI全称是“公共网关接口”(CommonGateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。
FastCGI像是一个常驻(long-live)型的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
1.4,于2012年03月23日发布.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中配置了。现在连接和配置都已经完成了,接下来是一个简单的例子:

from django.conf import settings 
from django.core.cache import cache 
#read cache user id 
def read_from_cache(self, user_name): 
  key = 'user_id_of_'+user_name 
  value = cache.get(key) 
  if value == None: 
    data = None 
  else: 
    data = json.loads(value) 
  return data 
#write cache user id 
def write_to_cache(self, user_name): 
  key = 'user_id_of_'+user_name 
  cache.set(key, json.dumps(user_name), settings.NEVER_REDIS_TIMEOUT)

5、如何进行Django单元测试
Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。类名为django.test.TestCase,继承于python的unittest.TestCase。

from django.test import TestCase 
from myapp.models import Animal 
  
class AnimalTestCase(TestCase): 
  def setUp(self): 
    Animal.objects.create(name="lion", sound="roar") 
    Animal.objects.create(name="cat", sound="meow") 
  
  def test_animals_can_speak(self): 
    """Animals that can speak are correctly identified""" 
    lion = Animal.objects.get(name="lion") 
    cat = Animal.objects.get(name="cat") 
    self.assertEqual(lion.speak(), 'The lion says "roar"') 
    self.assertEqual(cat.speak(), 'The cat says "meow"')

执行目录下所有的测试(所有的test*.py文件):运行测试的时候,测试程序会在所有以test开头的文件中查找所有的test cases(inittest.TestCase的子类),自动建立测试集然后运行测试。

$ python manage.py test

执行animals项目下tests包里的测试:

$ python manage.py testanimals.tests

执行animals项目里的test测试:

$ python manage.py testanimals

单独执行某个test case:

$ python manage.py testanimals.tests.AnimalTestCase

单独执行某个测试方法:

$ python manage.py testanimals.tests.AnimalTestCase.test_animals_can_speak

为测试文件提供路径:

$ python manage.py testanimals/

通配测试文件名:

$ python manage.py test--pattern="tests_*.py"

启用warnings提醒:

$ python -Wall manage.py test

6、解释下Http协议
HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。
HTTP协议的主要特点可概括如下:

  • 1.支持客户/服务器模式。
  • 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得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是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。

补充:

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK     //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)

希望通过本文能够帮助大家顺顺利利通过Python面试。

Python 相关文章推荐
Python中使用urllib2防止302跳转的代码例子
Jul 07 Python
Python中字符串的格式化方法小结
May 03 Python
python简单读取大文件的方法
Jul 01 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
安装并免费使用Pycharm专业版(学生/教师)
Sep 24 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
用Python可视化新冠疫情数据
Jan 18 Python
Python工程师面试题 与Python基础语法相关
Jan 14 #Python
5种Python单例模式的实现方式
Jan 14 #Python
Python2.x与Python3.x的区别
Jan 14 #Python
python Django模板的使用方法
Jan 14 #Python
Python数据类型学习笔记
Jan 13 #Python
python基础入门学习笔记(Python环境搭建)
Jan 13 #Python
详解python时间模块中的datetime模块
Jan 13 #Python
You might like
社区(php&&mysql)五
2006/10/09 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
JS实现图片高亮展示效果实例
2015/11/24 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
Vue分页插件的前后端配置与使用
2019/10/09 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
Python读写Redis数据库操作示例
2014/03/18 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
keras slice layer 层实现方式
2020/06/11 Python
Python里面search()和match()的区别
2016/09/21 面试题
opencv实现图像几何变换
2021/03/24 Python
信息总监管理职责范本
2014/03/08 职场文书
中等生评语大全
2014/05/04 职场文书
工程部文员岗位职责
2015/02/04 职场文书
行政司机岗位职责
2015/04/10 职场文书
小学安全教育主题班会
2015/08/12 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
微信小程序基础教程之echart的使用
2021/06/01 Javascript