Python web开发高频面试题总结(最新版、面试必备)

2 篇文章 0 订阅
1 篇文章 0 订阅

什么是python模块?什么是Python的内置类型?
Python模块是包含Python代码的.py文件。此代码可以是函数类或变量。
Python中的内置类型如下:整型、浮点型、复数、字符串、布尔等

Python中的局部变量和全局变量是什么?
全局变量:在函数外或全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。
局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。

Python数组和列表有什么区别?
python本身并没有数组类型,但Numpy库中有数组类型。
Python中的数组和列表具有相同的存储数据方式。
数组里面元素的数据类型必须是相同的,而列表可以包含任何数据类型元素。

Python中的self是什么?
self是类的实例或对象。在Python中,self包含在第一个参数中。但是,Java中的情况并非如此,它是可选的。它有助于区分具有局部变量的类的方法和属性。init方法中的self变量引用新创建的对象,而在其他方法中,它引用其方法被调用的对象。

如何提高python的运行效率
1.使用生成器,因为可以节约大量内存
2.循环代码优化,避免过多重复代码的执行
3.核心模块用Cython PyPy等,提高效率
4.多进程、多线程、协程
5.多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率

什么是python的命名空间
python的命名空间相当于一个字典,键是变量名,值是变量名对应的对象。
每个命名空间中不能定义相同的变量,符合字典的特性–不存在添加,存在修改。调用这个变量名就会自动进入命名空间寻找对应的对象。

python的命名空间分为几个?他们是否互相影响,互相独立?
python的命名空间分为3个,他们互不影响,相互独立
第一个:每个函数内部都有属于自己的命名空间
第二个:每个模块都有自己的命名空间,存放模块内定义的变量,对象
第三个:python自带的内置命名空间,存放的是自带的属性…比如 print,int,str,class
Python如何解决变量名命名冲突问题?
在Python中,没有类似 private 之类的字关键来声明私有方法或属性。
Python中要声明私有属性,需要在属性前加上双下划线(但是结尾处不能有双下划线),如:self.__a。然而这样的什么方式并不是真正私有,而是“伪私有”。
Python的伪私有属性,实际是通过变量名压缩(mangling)来实现变量名局部化。变量名压缩的规则:在初始的变量名头部加上一个下划线,再加上类的名称,最后是初始变量名的名称。
Python的类不存在真正的私有属性,通过双下划线实现的伪私有属性,本质上是对变量名进行压缩,使之无法直接在外部调用。
为什么要使用伪私有属性?
使用伪私有属性是为了避免在类树中,多个类赋值相同的属性引发冲突问题。

如何在Python中实现多线程?
Python有一个多线程库,但是用多线程来加速代码的效果并不是那么的好,Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。

Python线程中start方法和run方法的区别?
若调用start,则先执行主进程,后执行子进程;
若调用run,相当于正常的函数调用,将按照程序的顺序执行

Python如何处理高并发?
1.HTML页面静态化
2.图片服务器分离(可以用fastdfs轻量级的分布式文件存储系统)
3.使用缓存(用redis)
4.数据库集群、读写分离。减轻数据库服务器的读写压力。
5.使用负载均衡的方法(配置nigix服务器,用nginx来配置负载均衡,只需要设置 如下代码,即可实现简单的负载均衡

 upstream djangoserver {  
             server 192.168.72.49:8080;  
             server 192.168.72.49:8081;  
          }   

6.镜像。镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。
7.CDN加速技术(内容分发网络)。

TCP与UDP区别

  1. TCP面向连接(如打电话要先拨号建立连接); UDP是无连接的,即发送数据之前不需要建立连接
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,即不保证可靠交付。TCP通过校验,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
  3. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  5. TCP对系统资源要求较多,UDP对系统资源要求较少。

谈谈你对 Django 的认识

  1. Django 是 走大而全的方向,它最出名的是全自动化的管理后台: 只需要使用 ORM做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。
  2. Django 内置的ORM 跟框架内的其他模块耦合程度高。应用程序必须使用 Django 内置的 ORM,否则就不能享受到框架内提供的种种基于其 ORM 的便利;
  3. Django 的卖点是超高的开发效率 ,其性能扩展有限;采用 Django 的项目,在流量达
    到一定规模后,都需要对其进行重构,才能满足性能的要求。
  4. Django 适用的是 中小型 的网站,或者是作为大型网站快速实现产品雏形的工具。
  5. Django 模板的设计哲学是彻底的将代码、样式分离 ;Django 从根本上杜绝在模板
    中进行编码、处理数据的可能。

django 请求的生命周期
前端请求—>Nginx—>uwsgi—>中间件—>url 路由—>view 视图—>ORM—>拿到数据返view—>视图将数据渲染到模板中,拿到字符串—>中间件—>wsgi—>Nginx—>前端渲染
a. wsgi, 创建 socket 服务端,用于接收用户请求, 并对请求进行初次封装。
b. 中间件,对所有请求到来之前,响应之前定制一些操作。
c. 路由匹配,在url 和视图函数对应关系中,根据当前请求 url 找到相应的函数。
d. 执行视图函数,业务处理(通过 ORM 去数据库中获取数据,再去拿到模板,然后将数据和模板进行渲染)。
e. 再经过所有中间件。
f. 通过 wsgi 将响应返回给用户。

FBV 模式和 CBV 模式
FBV(Function Base Views):一个 url 对应一个视图函数
CBV(Class Base views):一个 url 对应一个类
FBV 方式请求的过程 :用户发送url请求,Django会依次遍历路由映射表中的所有记录,一旦路由映射表其中的一条匹配成功了,就执行视图函数中对应的函数名,这是 V FBV 的执行流程。
CBV 方式请求的过程:当服务端使用cbv 模式的时候,用户发给服务端的请求包含 url和 method,这两个信息都是字符串类型, 服务端通过路由映射表匹配成功后会自动去找dispatch方法,然后Django会通过dispatch反射的方式找到类中对应的方法并执行,类中的方法执行完毕之后,会把客户端想要的数据返回给dispatch 方法,由 dispatch方法把数据返回经客户端。

问题:在多个用户同时发起对同一个商品的下单请求时,先查询商品库存,再修改商品库存,会出现资源竞争问题,导致库存的最终结果出现异常。 例如:id为16的商品的库存为10,两人同时购买,每人买5件,如果产生并发问题,两人下单都成功,但是库存变成了5
解决办法:
悲观锁
当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作,
语法如下:
select stock from tb_sku where id=1 for update;
SKU.objects.select_for_update().get(id=1)
乐观锁
乐观锁并不是真实存在的锁,而是在更新的时候判断此时的库存是否是之前查询出的库存,如果相同,表示没人修改,可以更新库存,否则表示别人抢过资源,不再执行库存更新。类似如下操作
update tb_sku set stock=2 where id=1 and stock=7;
SKU.objects.filter(id=1, stock=7).update(stock=2)
任务队列
将下单的逻辑放到任务队列中(如celery),将并行转为串行,所有人排队下单。比如开启只有一个进程的Celery,一个订单一个订单的处理。

wsgi 和 和 uwsgi
wsgi:一种实现 python 解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了 python web 程序与服务器之间交互的通用性。利用它,web.py 或 bottle或者 django 等等的 python web 开发框架,就可以轻松地部署在不同的 web 服务器上;
uwsgi:同 WSGI 一样是一种通信协议, uwsgi 协议是一个 uWSGI 服务器自有的协议,它用于定义传输信息的类型,它与 WSGI 相比是两样东西。
uWSGI 是实现了 uwsgi 和 WSGI 两种协议 的 Web 服务器 ,负责响应 python 的 web 请求。因为 apache、nginx等,它们自己都没有解析动态语言如 php 的能,而是分派给其他模块来做,比如 apache 就可以说内置了 php 模块,让人感觉好像 apache 就支持 php一样。 uWSGI 实现了wsgi 协议 、uwsgi 协议 、http 等协议 。 Nginx 中 HttpUwsgiModule的作用是与 uWSGI 服务器进行交换。

简述 django 对 http 请求的执行流程
一个 HTTP 请求,首先被转化成一个 HttpRequest 对象,然后该对象被传递给Request 中间件处理,若该中间件返回了 Response,则直接传递给 Response 中间件做收尾处理。否则,Request 中间件将访问 URL 配置,确定哪个 view 来处理,在确定了哪个 view 要执行,但是还没有执行该 view 的时候,系统会把 request 传递给View 中间件处理器进行处理, 如果该中间件返回了 Response ,那么该 Response 直接被传递给 Response 中间件进行后续处理,否则将执行确定的 View 函数处理并返回Response,在这个过程中如果引发了异常并抛出,会被 Exception 中间件处理器进行处理。

简述 Django 的 ORM
ORM,全拼 Object-Relation Mapping,意为 对象 — 关系映射。
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程, M ORM 操作本质上会根据对接的数据库引擎,翻译成对应的sql 语句,所有使用 Django 开发的项目无需关心程序底层使用的是 MySQL、Oracle、sqlite 等等,如果数据库迁移,只需要更换 Django 的数据库引擎即可。

Django 里 QuerySet 的 get 和 filter 方法的区别
django 的 get 方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话它会报错 ;
django 的 filter 方法是从数据库的取得匹配的结果,返回一个 对象列表 ,如果记录不存在的话,它会返回 [ ];
get 只能取出一条 数据,如果满足条件的数据有多条,抛出异常没有数据,也会抛出异常。
filter 如果有数据,就返回 QuerySet(类似于可以遍历的数组) 如果没有数据,返回
empty(不会抛异常)

简述 Django 下的( ( 内建的) ) 缓存机制
缓存是将一些常用的数据保存内存或者 memcache 中,在一定时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或 memcache 的缓存中去取得数据,然后返回给用户。
django 提供了 6 中内存缓存机制 ,分别为:
开发调试缓存(为开发调试使用,实际上不使用任何操作);
内存缓存(将缓存内容缓存到内存中);
文件缓存(将缓存内容写到文件 );
数据库缓存(将缓存内容存到数据库);
memcache 缓存(包含两种模块,python-memcached 或 pylibmc.)。
以上缓存均提供了三种粒度的应用。

Python 中@staticmethod 和@classmethod 的区别
在类中总共有三种方法:
普通方法(需要参数,使用时默认将类的实例对象传进去,类调用的时候需要传递实例对象);
@staticmethod 装饰的静态方法与普通函数相同(实例和类均可调用,没有默认的参数传递进去);
@classmethod 装饰的类方法(需要参数,使用时将调用的类传进去,或者实例对象调用时是将实例对应的类传进去。

什么是 socket
socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

什么是 websocket ?
t websocket 是从 HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议。
浏览器通过 JavaScript 向服务器发出建立 t websocket 连接的请求, 连接建立以后 ,
客户端和服务器端就可以通过 TCP 连接直接交换数据。

Web 开发中,session 和 cookie 的作用与区别:
Cookie 的概念:在浏览某些 网站 时,这些网站会把一些数据存在客户端,用于使用网站等跟踪用户实现用户自定义功能;
是否设置过期时间 : 如果不设置 过期时间,则表示这个 Cookie 生命周期为 浏览器会话期间 , 只要关闭浏览器,cookie 就消失了,这个生命期为浏览会话期的 cookie,就是会话 Cookie;
存储: 一般保存在 内存,不在硬盘;
如果设置了过期时间, 浏览器会把 cookie 保存在硬盘上,关闭再打开浏览器, 这些
cookie 依然有效直到超过的设置过期时间;
Session 的概念
作用:实现网页之间数据传递,是一个存储在服务器端的对象集合。
原理:当用户请求一个 http://Asp.net 页面时,系统将自动创建一个 Session;退出应用程序或关闭服务器时,该 Session 撤销。系统在创建 Session 时将为其分配一个长长的字符串标识,以实现对 Session 进行管理与跟踪。

cookie 和 session 的区别
1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。 简单的说,当你登录一个网站的时候,如果 web 服务器端使用的是 session, 那么所有的数据都保存在服务器上面,客户端每次请求服务器的时候会发送当前会话的 session_id ,服务器根据当
前 session_id 判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的session_id ,用特殊的浏览器伪造该用户的请求也是能够成功的。 session_id 是服务 器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性。 Session 是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的 SessionID, 用该 SessionID 为标识符来存取服务器端的 Session 存储空间。而 SessionID 这一数据则是保存到客户端,用 Cookie 保存的,用户提交页面时,会将这一 SessionID 提交到服务器端,来存取 Session 数据。这一
过程,是不用开发人员干预的。所以一旦客户端禁用 Cookie ,那么 Session 也会失效。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用 COOKIE。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个cookie。Session 对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型。

CSRF 原理
CSRF(Cross-site request forgery)跨站请求伪造,缩写为:CSRF/XSRF。
要完成一次 CSRF 攻击,受害者必须依次完成两个步骤:
1.登录受信任网站 A,并在本地生成Cookie;
2.在不登出 A的情况下,访问危险网站 B。

Web 开发中有哪些技术手段防止 SQL 注入?
1.使用预编译绑定变量的 SQL 语句;
2.严格加密处理用户的机密信息;
3.不要随意开启生产环境中 Webserver 的错误显示;
4.使用正则表达式过滤传入的参数;
5.字符串过滤;
6.检查是否包含非法字符。

如何查看占用 8080 端口的是什么进程?
windows 查看端口占用 : netstat -aon|findstr “8080”

谈谈 Django 中的中间件
1.django.middleware.security.SecurityMiddleware :一些安全设置,比如 XSS 脚本过滤。
2.django.contrib.sessions.middleware.SessionMiddleware:session 支持中间件,加入这个中间件,会在数据库中生成一个 django_session 的表;
3.django.middleware.csrf.CsrfViewMiddleware: 跨域请求伪造中间件。加入这个中间件,在提交表单的时候会必须加入 csrf_token,cookie 中也会生成一个名叫 n csrftoken 的值,也会在 header 中加入一个 HTTP_X_CSRFTOKEN 的值来放置 CSRF 攻击
4.django.contrib.auth.middleware.AuthenticationMiddleware:用户授权中间件。
在每个 HttpRequest对象到达 view 之前添加当前登录用户的 user属性,也就是你可以在 view 中通过 request 访问 user。
5.django.contrib.messages.middleware.MessageMiddleware:消息中间件。
展示一些后台信息给前端页面。如果需要用到消息,还需要INSTALLED_APPS 中添加django.contrib.message 才能有效。如果不需要,可以把这两个都删除
6.django.middleware.clickjacking.XFrameOptionsMiddleware : 防止通过 浏览器页面跨Frame 出现clickjacking(欺骗点击)攻击出现。
RESTful 规范
Representational State Transfer"表现层状态转化"
restful:编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。
restful: 给用户一个 URL,根据 method 不同在后端做不同的处理,
比如:post 创建数据、get 获取数据、put 和 patch 修改数据、delete 删除数据。
(1)每一个 URI 代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个 HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
Django REST framework ( DRF )
自动生成符合 RESTful 规范的 API,支持 OPTION 、 HEAD 、 POST 、 GET 、 PATCH 、 PUT 、DELETE。根据 Content-Type 来动态的返回数据类型(如 text、json)
Django Restframework 的流程
1.建立 Models;
2.依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示);
3.ViewSet 是一个 views 的集合,根据客户端的请求(GET、POST 等),返回Serialiers
处理的数据权限 Premissions 也在这一步做处理;
4.ViewSet 可在 Routers 进行注册,注册后会显示在ApiRoot 页上;
5.在 urls 里注册 ViewSet 生成的view,指定监听的 url。

Python做web开发的框架?(Django 、 Flask 、Tornado )
Django
Django主要是用来搞快速开发的,他的亮点就是快速开发,节约成本。适用于中小型项目的开发,或者用来构造大项目的雏形。用django开发的项目,访问量达到一定值的时候,其性能堪忧,这时候我们需要对它进行重构,从而满足它对性能的需求。
Django正常的并发量不过 10000, 如果要实现高并发的话,就要对 django 进行二次开发,比如把整个笨重的框架给拆掉,自己写 socket 实现 http 的通信,底层用纯 c,c++写提升效率,ORM 框架给干掉,自己编写封装与数据库交互的框架,因为啥呢,ORM 虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询。
Tornado
性能强悍,强悍到可以用它做游戏开发。
与django、flask甚至大多python框架的最大不同,tornado是异步非阻塞的,而且速度非常快。得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接。
Flask
轻量级的web开发框架,自带的功能比较少,很多功能需要我们自己写,但第三方库非常强大,全部的第三方模块加起来要超过django。体积小,开发成本也低,也适合web开发初学者拿来学习。

谈谈你对 http 协议 的认识: HTTP (超文本传输协议)
HTTP 协议,是用于从服务器传输超文本到本地浏览器的传送协议;
HTTP 由请求和响应构成,是一个无状态、应用层协议。
HTTP 的作用:可以使浏览器更加高效,使网络传输减少;保证计算机快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示等。

HTTP 与 与 HTTPS 的区别
HTTP 是一个基于 TCP/IP 通信协议来传递数据,一个属于 应用层的、无状态的 协议;浏览器作为 HTTP 客户端通过 URL 向HTTP 服务端即 WEB 服务器发送所有请求。Web 服务器根据接收到的请求后,向客户端发送响应信息。
HTTPS 是 HTTP 的安全版,在 HTTP 下加入 SSL (安全套接层 ) ,主要用于Web 的安全传输协议,在传输层对网络连接进行加密,保障在 Internet上数据传输的安全。
HTTP 的端口号为 80, HTTPS的端口号为 443
HTTP 铭文传输,HTTPS 是密文传输

GET 方法和 POST 方法的区别
(1)GET 产生一个 TCP 数据包。
GET 方式的请求,浏览器会把 http header和 data 一并发送出去,服务器响应 200(返回数据);
POST 产生两个TCP 数据包。
浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。
(2)Get 方法会将提交的数据放在 URL 中,即以明文的方式传递参数数据 ;Post 方法会将提交的数据放在请求体中。
(3)Get 方法传递的数据量较小,最大不超过 2KB(因为受 URL 长度限制)
Post 方法传递的数据量较大,一般不受限制(大小取决于服务器的处理能力)
(4)Get 方法安全性低,效率高;
Post 方法安全性高,效率低(耗时稍长)

什么是线程?
线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。
线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行

为什么要使用多线程?
线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、和其他进程应有的状态。
因为线程的划分尺度小于进程,使得多线程程序的并发性高。进程在执行过程之中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率。
线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性,多个线程共享一个进程的虚拟空间。线程的共享环境包括进程代码段、进程的共有数据等,利用这些共享的数据,线程之间很容易实现通信。
操作系统在创建进程时,必须为改进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能高得要多。
总结起来,使用多线程编程具有如下几个优点
进程之间不能共享内存,但线程之间共享内存非常容易。
操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此使用多线程来实现多任务并发执行比使用多进程的效率高
python语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了python的多线程编程。
普通创建方式 threading.Thread
自定义线程:继承threading.Thread来定义线程类,其本质是重构Thread类中的run方法

守护线程
所谓线程守护,就是主线程不管该线程的执行情况,只要是其他子线程结束且主线程执行完毕,主线程都会关闭。也就是说:主线程不等待该守护线程的执行完再去关闭。 设置守护线程之后,当主线程结束时,子线程也将立即结束,不再执行

GIL 全局解释器
在非Python环境中,单核情况下,同时只能有一个任务执行。多核时可以支持多个线程同时执行。但是在Python中,无论有多少个核同时只能执行一个线程。究其原因,这就是由于GIL的存在导致的。
GIL的全程是全局解释器,来源是Python设计之初的考虑,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL,我们可以把GIL看做是“通行证”,并且在一个Python进程之中,GIL只有一个。拿不到线程的通行证,并且在一个python进程中,GIL只有一个,拿不到通行证的线程,就不允许进入CPU执行。GIL只在cpython中才有,因为cpython调用的是c语言的原生线程,所以他不能直接操作cpu,而只能利用GIL保证同一时间只能有一个线程拿到数据。而在pypy和jpython中是没有GIL的。

Python针对不同类型的代码执行效率也是不同的
1、CPU密集型代码(各种循环处理、计算等),在这种情况下,由于计算工作多,ticks技术很快就会达到阀值,然后出发GIL的释放与再竞争(多个线程来回切换当然是需要消耗资源的),所以python下的多线程对CPU密集型代码并不友好。
2、IO密集型代码(文件处理、网络爬虫等设计文件读写操作),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序的执行效率)。所以python的多线程对IO密集型代码比较友好。
主要要看任务的类型,我们把任务分为I/O密集型和计算密集型,而多线程在切换中又分为I/O切换和时间切换。如果任务属于是I/O密集型,若不采用多线程,我们在进行I/O操作时,势必要等待前面一个I/O任务完成后面的I/O任务才能进行,在这个等待的过程中,CPU处于等待状态,这时如果采用多线程的话,刚好可以切换到进行另一个I/O任务。这样就刚好可以充分利用CPU避免CPU处于闲置状态,提高效率。但是如果多线程任务都是计算型,CPU会一直在进行工作,直到一定的时间后采取多线程时间切换的方式进行切换线程,此时CPU一直处于工作状态,此种情况下并不能提高性能,相反在切换多线程任务时,可能还会造成时间和资源的浪费,导致效能下降。这就是造成上面两种多线程结果不能的解释。
结论:I/O密集型任务,建议采取多线程,还可以采用多进程+协程的方式(例如:爬虫多采用多线程处理爬取的数据);对于计算密集型任务,python此时就不适用了。

Python的内存管理机制
A. Python GC 主要使用 引用计数 来跟踪和回收垃圾;
B. 在引用计数的基础上,通过 标记- - 清除 解决容器对象可能产生的循环引用问题,
C. 通过 分代回收 以空间换时间的方法提高垃圾回收效率。

正向代理和反向代理

  1. 正向代理:顺着请求的方向进行的代理,即代理服务器他是由你配置为你服务,去请求目标服务器地址。
    比如我们要去访问谷歌网站,我们直接访问不通,那么我们就可以找一个代理服务器为我们服务,我们通过代理服务器请求到谷歌网站。对于谷歌而言他只知道有一个服务器访问了自己,并不知道这件事你是访问不了他,找了一个代理服务器访问自己。
  2. 反向代理:反向代理正好与正向代理相反,代理服务器是为目标服务器服务的,虽然整体的请求返
    回路线都是一样的都是 Client 到 Proxy 到 Server。
    比如 我们访问百度网站,百度的代理服务器对外的域名为https://www.baidu.com
    具体内部的服务器节点我们不知道。现实中我们通过访问百度的代理服务器后,代理服务器给我们转发请求到他们 N 多的服务器节点中的一个给我们进行搜索后将结果返回。

什么是 Nginx ?
Nginx 功能丰富,可作为 HTTP 服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI,SSL,虚拟主机,URL 重写,Gzip 等功能。并且支持很多第三方的模块扩展。
Nginx 常用功能
Http 代理,反向代理:作为 Web 服务器最常用的功能之一,尤其是反向代理。
负载均衡。Nginx 提供的负载均衡策略有 2 种:内置策略和扩展策略
网页缓存 Nginx 可以对不同的文件做不同的缓存处理,配置灵活,并支持
FastCGI_Cache,主要用于对 FastCGI 的动态程序进行缓存
常见配置项
3. $ remote_addr 与$ http_x_forwarded_for 可以重新记录客户端的 ip 地址;
4. $ remote_user:用于记录客户端用户名;
5. $ time_local:用来记录访问时间与时区;
6. $ request:用来记录请求的 url 与 http 协议;
7. $ status:用来记录请求状态;成功是 200;
8. $ body_bytes_s ent:记录发送给客户端文件主体内容大小;
9. $ http_referer:用于记录从那个页面链接访问过来的;
10. $ http_user_agent:记录客户端浏览器的相关信息;
惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进展能获得链接,这样会影响系统性能。
每个指令必须有分号结束

大家都说 Nginx 快?快的原因是什么?
1:在高并发的情况下 nginx 比 apache 快,低并发体现不明显
2:快的原因得益于 nginx 的 epoll 模型。异步非阻塞。对于 Nginx 来说,把一个完整的连接请求处理都划分成了事件,一个一个的事件。

Docker技术
应用场景:
12. Web 应用的自动化打包和发布。
13. 自动化测试和持续集成、发布。
14. 在服务型环境中部署和调整数据库或其他的后台应用。
15. 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1、快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,示例方案:
开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
2、响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3、在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

Docker 架构
Docker 包括三个基本概念:
镜像(Image):
相当于是一个 root 文件系统。比如官方镜像ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):
镜像和容器的关系,像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):
仓库可看着一个代码控制中心,用来保存镜像。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。

处理bug的方法

  1. 输出语句
    代码调试的首要工具就是插入可靠地、真实的输出语句。当输出语句数量庞大且不易于管理的时候,在输出语句里恰当使用记录系统,这可以说是一个等效的好方案。许多编程语言里都配备了现成的类库,例如在Python里构建的记录库。输出语句是程序员检查数据值和变量类型最快、最简单和最直接的方式。高效的输出语句能够帮助程序员通过一段代码来跟踪数据流,并快速识别bug源头。
  2. 编写代码注释
    注释的功能就是在更易于理解的层次上解释代码的编写目的,尽可能多写一些:每行代码是干什么的,怎么去完成,这些问题都应该在通读代码之后很容易找到答案才行。另外,给各个功能和变量取合理的名称也有助于简化代码实施的过程。在代码行下面的空白处填写注释来回答为什么要使用特殊的实现功能,或者一段代码怎样和程序的其余部分互动等等。编写详细的注释可以说是软件工程里一步可靠地检验步骤,即使是在没有bug的代码里也是同样受用。这样,就算bug出现了也不用担心,注释会帮你节省数小时的排错时间。
  3. 调试器
    源代码调试器采用了输出语言方法里的逻辑推理。这样可以让程序员一行一行的单步执行代码,同时监测从变量值到底层虚拟机整个状态的一举一动。另外,大部分的编程语言都具有多个调试器,可以提供不同的功能,包括图形接口、终止程序的断点设置、执行环境内部任意代码的实施。
    在许多情况下,调试器可以说是大材小用了,但如果合理利用的话,调试器绝对是一款高效率的工具。
  4. Bug跟踪系统
    在一些比较重大的软件项目里,使用bug跟踪系统是很有必要的。如果没使用bug跟踪器,最典型的状况就是程序员要整理以往的邮件或者是聊天记录来查找bug,更糟糕点儿的就是程序员根本不记得其它东西,印象里只有一点bug的文档。一旦这种情况发生,bug将必然充斥着整个代码编程,更加严重的是,想要识别出这些bug并确定它们的位置是很难的。
    一个简单的文本文件在项目里可以作为最初的bug跟踪系统。随着代码库的不断增加,bug衍生出一个文本文件并不需要太长的时间。有很多商业和开源的bug跟踪软件提供的解决方案都是可以考虑的,选择哪一个bug跟踪软件首先要明确的部分就是要确保在编程项目里,那些非程序人员能够快速使用这个bug跟踪系统。
  5. 版本控制
    任何一个重大的软件工程项目里都不应该忽略使用版本控制系统。举例而言,像Git,Mercurial和SVN这类的版本控制允许不同的代码库版本在不同的基础上是可以分开的。不同的控制版本可以被合并到一起,因此,多个程序员可以同一时间运行同一个代码库。版本控制在代码排错里同样有着举足轻重地位,可以让程序员回滚修改较早版本的代码,尽可能在错误出现之前,在代码库里对错误进行修复。
  6. 自动化测试
    自动化测试就是一段代码用特殊的输入值来运行软件,以此来检测程序运行是否和预期的相符合。单元测试主要是用来检测单个功能的功能性,然而功能测试是用来检查特殊的程序性能,并且结合单元测试来检查软件系统的整体部分。有很多测试框架可以用来编写测试程序,而且大部分受欢迎的测试框架都是由Kent Bent编写的JUnit类库衍生而来的,Kent Bent是“测试驱动开发方法”最早的支持者之一。 Python标准类库包括一个JUnit的Python版本,称之为PyUnit或者unittest的单元测试框架。

简述 jsonp 及实现原理?
JSONP 是用来解决 跨域请求 问题的。
跨域:协议 域名端口号有一个不一样就是跨域。
实现原理: script 标签 src 属性中的链接却可以访问跨域的 js 脚本,利用这个特性,服务端不再返回 JSON 格式的数据,而是返回一段调用某个函数的 js 代码,在 src 中进行了调用,这样实现了跨域。

什么是 cors ?
CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 AJAX 跨域请求资源的方式,支持现代浏览器,IE 支持 10 以上。

列举 Http 请求中常见的请求方式
GET / POST / DELETE / PUT

列举 Http 请求中的状态码?
200 访问成功
302 重定向
401 权限问题
403 禁止访问
404 请求的 url地址不存在
500 服务器出现不可知的错误
503 访问限制有权限

列举 Http 请求中常见的请求头
User-Agent:浏览器类型
Cookie:这是最重要的请求头信息之一
Content-Type:请求类型

列举 django 的内置组件
url 、 view 、 model 、 template 、中间件

django 的 request 对象是在什么时候创建的?
当请求一个页面时,Django 会建立一个包含请求元数据的 HttpRequest 对象。
当 Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。每个视图会返回一个 HttpResponse 对象。

only 和 和 defer 的区别?
defer : 映射中排除某列数据
only : 仅取某个列中的数据

django 中如何根据数据库表生成 model 中的类?
Django 附带一个名为 inspectdb 的实用程序,可以通过检查现有的数据库来创建 Model

使用 ORM 和原生 SQL 的优缺点?
ORM:对象关系映射,通过创建一个类,这个类与数据库的表相对应!类的对象代指数据库中的一行数据。
简述 ORM 原理 :让用户不再写 SQL 语句,而是通过类以及对象的方式,和其内部提供的方法,进行数据库操作!把用户输入的类或对象转换成 SQL 语句,转换之后通 pymysql
执行完成数据库的操作。
ORM 的优缺点:
优点:1.提高开发效率,降低开发成本;2.使开发更加对象化
3.可移植;4.可以很方便地引入数据缓存之类的附加功能
缺点:在处理多表联查、where 条件复杂之类的查询时,ORM 的语法会变得复杂,就需要写入原生 SQL。

什么是 RPC ?
RPC(Remote Procedure Call)—远程过程调用,它是通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。RPC 协议假定某些传输协议的存在,如TCP或 UDP,为通信程序之间携带信息数据。
在 OSI 网络通信模型中,RPC 跨越了传输层和应用层。RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。

为什么要使用 django rest framework 框架?

  1. 客户端 - 服务端分离
    优点:提高用户界面的便携性,通过简化服务器提高可伸缩性….
  2. 无状态( Stateless ) :从客户端的每个请求要包含服务器所需要的所有信息
    优点:提高可见性(可以单独考虑每个请求),提高了可靠性(更容易从局部故障中修复),提高可扩展性(降低了服务器资源使用)
  3. 缓存( Cachable ) :服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求
    优点:减少交互次数,减少交互的平均延迟
  4. 统一接口 优点:提高交互的可见性,鼓励单独改善组件
  5. 支持按需代码 (Code-On-Demand 可选) 优点:提高可扩展性

django rest framework 如何实现的用户访问频率控制?
a. 基于用户 IP 限制访问频率
b. 基于用户 IP 显示访问频率(利于 Django 缓存)
c. view 中限制请求频率
d. 匿名时用 IP 限制+登录时用 Token 限制

django 与 与 flask 对比
一、整体设计方面
Django 提供一站式的解决方案,从模板、ORM、Session、Authentication 等都分配好了。总之,为你做尽量多的事情,而且还有一个admin,配合 django-suit,后台就出来了,最初 Django 就是由在新闻发布公司工作的人设计的 。
Flask 只提供了一些核心功能,非常简洁优雅。它是一个微框架,其他的由扩展提供,但它的 blueprint使它也能够很方便的进行水平扩展。
二、路由设计
Django 的路由设计是采用 集中处理 的方法,利用正则匹配。Flask 也能这么做,但更多的是使用 装饰器 的形式,
这个有优点也有缺点,优点是读源码时看到函数就知道怎么用的,缺点是一旦源码比较长,要查路由就不太方便了,
三、应用模块化设计
Django 的模块化是集成在命令里的,每个都是一个独立的模块,为以后的复用提供了便利。Flask 通过Blueprint 来提供模块化,自己对项目结构划分成不同的模块进行组织。

Flask 框架依赖组件
Route(路由);
templates(模板);
Models(orm 模型);
blueprint(蓝图);
Jinja2 模板引擎。

Flask 蓝图的作用
1.同的功能模块化;
2.大型应用;
3.项目结构;
4.可读性,易于维护(跟 Django的 view 功能相似)

Flask 中多app 应用是怎么完成?
请求进来时,可以根据 URL的不同,交给不同的 APP 处理

在 Flask 中实现 WebSocket 需要什么组件?
Flask-Sockets
Flask-Sockets 是 Flask 框架的一个扩展,通过它,Flask 应用程序可以使用 WebSocket。

wtforms 组件的作用?
WTForms 是一个支持多个 web 框架的form 组件,主要用于对用户请求数据进行验证。

Flask 框架默认 session 处理机制?
Flask的默认session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)
后编码(base64),放到 cookie 里。过期时间是通过 cookie 的过期时间实现的 。
为了防止 cookie 内容被篡改,session 会自动打上一个叫 session 的 hash 串,
这个串是经过 session 内容、SECRET_KEY 计算出来的,看得出, 这种设计虽然不能保证 session 里的内容不泄露,但至少防止了不被篡改。

解释 Flask 框架中的 Local 对象和 threading.local 对象的区别?
a. threading.local
作用:为每个线程开辟一块空间进行数据存储。
b. 自定义 Local 对象 https://www.jianshu.com/p/3f38b777a621
作用:为每个线程(协程)开辟一块空间进行数据存储。

ORM 的实现原理
概念: 对象关系映射 。用于实现面向对象编程语言里不同类型系统的数据之间的转换。
当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。当开发一个应用程序的时候(不使用 O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在 DAL 中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
ORM 解决的主要问题是对象关系的映射 。域模型和关系模型分别是建立在概念模型的基础上。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。

ORM 技术特点:

  1. 提高开发效率。由于 ORM 可以自动对 Entity 对象与数据库中的 Table 进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
  2. ORM 提供了对数据库的映射,不用 sql 直接编码,能够像操作对象一样从数据库获取数据。

简述 Tornado 框架的特点
Tornado 的独特之处在于 其所有开发工具能够使用在应用开发的任意阶段以及任
何档次的硬件资源上 。而且,完整集的 Tornado 工具可以使开发人员 完全不用考虑与目标连接的策略或目标存储区大小。
Tornado结构的专门设计为开发人员和第三方工具厂商提供了一个开放环境。
已有部分应用程序接口可以利用并附带参考书目,内容从开发环境接口到连接实现。
Tornado 包括强大的开发和调试工具,尤其适用于面对大量问题的嵌入式开发人员。这些工具包括 C 和 C++源码级别的调试器,目标和工具管理,系统目标跟踪,内存使用分析和自动配置。另外,所有工具能很方便地同时运行,很容易增加和交互式开发。

Tornado 操作 redis 使用的模块?
tornado-redis

Tornado 框架的适用场景?
Tornado 是使用 Python 编写的一个强大的、可扩展的 Web 服务器。
它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中;
我们现在所知道的 Tornado 是基于 Bret Taylor 和其他人员为 FriendFeed 所开发
的网络服务框架,当 FriendFeed 被 Facebook 收购后得以开源。不同于那些最多只能达到 10,000 个并发连接的传统网络服务器;
Tornado 在设计之初就考虑到了性能因素,旨在解决 C10K 问题,这样的设计使得其成为一个拥有非常高性能的框架。此外,它还拥有处理安全性、用户验证、社交网络以及与外部服务(如数据库和网站 API)进行异步交互的工具。

  • 1
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料 python面试题、知识点,用于程序员应聘学习参考,提供代码+题型等资料

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值