Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 最新资讯 >

【转载】python面试基础知识(三) Django部分

发布日期:2019-11-21 14:07:43点击次数:

分享到:
  最近,小编在整理python面试基础知识,看了很多博客、文章和咨询了一些大厂公司大牛。了解到,在python面试的时候,不仅要求你有项目经验,还要考试代码呢!今天,小编和大家分享一下python面试基础知识,希望帮忙大家找到理想的工作!

【转载】python面试基础知识(三) Django部分

  1、Django请求的生命周期

  a.wsgi,创建socket服务端,用于接收用户请求并对请求进行初次封装。

  b.中间件,对所有请求到来之前,响应之前定制一些操作。

  c.路由匹配,在url和视图函数对应关系中,根据当前请求url找到相应的函数。

  d.执行视图函数,业务处理【通过ORM去数据库中获取数据,再去拿到模板,然后将数据和模板进行渲染】

  e.再经过所有中间件。

  f.通过wsgi将响应返回给用户。

  2、简述django对http请求的执行流程。

  一个HTTP请求,首先被转化成一个HttpRequest对象,然后该对象被传递给

  Request中间件处理,如果该中间件返回了Response,则直接传递给

  Response中间件做收尾处理。否则的话Request中间件将访问URL配置,确

  定哪个view来处理,在确定了哪个view要执行,但是还没有执行该view的时

  候,系统会把request传递给View中间件处理器进行处理,如果该中间件返回

  了Response,那么该Response直接被传递给Response中间件进行后续处

  理,否则将执行确定的View函数处理并返回Response,在这个过程中如果引

  发了异常并抛出,会被Exception中间件处理器进行处理。

  3、简述Django的orm

  ORM,全拼Object-RelationMapping,意为对象-关系映射

  实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面

  向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项

  目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据

  库引擎即可

  4、Django里QuerySet的get和filter方法的区别?

  django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。

  django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。

  get

  只能取出一条数据,如果满足条件的数据有多条,抛出异常

  没有数据,也会抛出异常

  filter

  如果有数据,就返回QuerySet(类似于可以遍历的数组)如果没有数据,返回empty(不会抛异常)

  5、简述Django下的(内建的)缓存机制。

  缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去

  执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.django提

  供了6中内存缓存机制,分别为:

  开发调试缓存(为开发调试使用,实际上不使用任何操作);

  内存缓存(将缓存内容缓存到内存中);

  文件缓存(将缓存内容写到文件);

  数据库缓存(将缓存内容存到数据库);

  memcache缓存(包含两种模块,python-memcached或pylibmc.)。

  以上缓存均提供了三种粒度的应用。

  6、django中model的slugfeild类型字段有什么用途?

  只包含字母、数字、下划线和连接符,通常用于urls

  7、Python中@staticmethod和@classmethod的区别。

  在类中总共有三种方法:普通方法(需要参数,使用时默认将类的实例对象传进去,类调用的时候需要

  传递实例对象),@staticmethod装饰的静态方法与普通函数相同(实例和类均可调用,没有默认的参

  数传递进去),@classmethod装饰的类方法(需要参数,使用时将调用的类传进去,或者实例对象调

  用时是将实例对应的类传进去。

  8、什么是socket?

  socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为

  几个简单的接口供应用层调用以实现进程在网络中通信。

  9、Web开发中,session和cookie的作用与区别。

  Cookie概念

  在浏览某些网站时,这些网站会把一些数据存在客户端,用于使用网站等跟踪用户实现用户自定

  义功能.

  是否设置过期时间:

  如果不设置过期时间,则表示这个Cookie生命周期为浏览器会话期间,只要关闭浏览器,cookie就消失了.

  这个生命期为浏览会话期的cookie,就是会话Cookie;

  存储:一般保存在内存,不在硬盘;

  如果设置了过期时间,浏览器会把cookie保存在硬盘上,关闭再打开浏览器,这些cookie依然有效直到超

  过的设置过期时间;

  Session的概念

  作用:实现网页之间数据传递,是一个存储在服务器端的对象集合。

  原理:当用户请求一个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对

  象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

  10、Web开发中有哪些技术手段防止SQL注入?

  1.使用预编译绑定变量的SQL语句

  2.严格加密处理用户的机密信息

  3.不要随意开启生产环境中Webserver的错误显示

  4.使用正则表达式过滤传入的参数

  5.字符串过滤

  6.检查是否包函非法字符

  11、如何查看占用8080端口的是什么进程?

  windows查看端口占用

  在windows命令行窗口下执行:

  netstat-aon|findstr"8080"

  linux系统

  先使用netstat命令,再用ps命令

  执行命令:netstat-anp|grep8080

  输出结果:tcp00:::8080:::*LISTEN12006/java

  执行命令:ps-ef|grep12006

  12、谈谈Django中的中间件。

  django.middleware.security.SecurityMiddleware’

  一些安全设置,比如XSS脚本过滤。

  django.contrib.sessions.middleware.SessionMiddleware

  session支持中间件,加入这个中间件,会在数据库中生成一个django_session的表。

  django.middleware.common.CommonMiddleware

  通用中间件,会处理一些URL,比如baidu.com会自动的处理成www.baidu.com。比如/blog/111会处理

  成/blog/111/自动加上反斜杠

  django.middleware.csrf.CsrfViewMiddleware

  跨域请求伪造中间件。加入这个中间件,在提交表单的时候会必须加入csrf_token,cookie中也会生成一

  个名叫csrftoken的值,也会在header中加入一个HTTP_X_CSRFTOKEN的值来放置CSRF攻击

  django.contrib.auth.middleware.AuthenticationMiddleware

  用户授权中间件。他会在每个HttpRequest对象到达view之前添加当前登录用户的user属性,也就是你可

  以在view中通过request访问user

  django.contrib.messages.middleware.MessageMiddleware

  消息中间件。展示一些后台信息给前端页面。如果需要用到消息,还需要在INSTALLED_APPS中添加

  django.contrib.message才能有效。如果不需要,可以把这两个都删除

  django.middleware.clickjacking.XFrameOptionsMiddleware

  防止通过浏览器页面跨Frame出现clickjacking(欺骗点击)攻击出现。

  13、谈谈CSRF原理

  CSRF(Cross-siterequestforgery),中文名称:跨站请求伪造,也被称为:oneclickattack/

  sessionriding,缩写为:CSRF/XSRF。

  你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情

  包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包

  括:个人隐私泄露以及财产安全。

  要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  1.登录受信任网站A,并在本地生成Cookie。

  2.在不登出A的情况下,访问危险网站B。

  14、谈谈RESTful规范

  RepresentationalStateTransfer"表现层状态转化"

  restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。

  restful:给用户一个url,根据method不同在后端做不同的处理,比如:post创建数据、get获取数据、put

  和patch修改数据、delete删除数据。

  (1)每一个URI代表一种资源;

  (2)客户端和服务器之间,传递这种资源的某种表现层;

  (3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

  我们常用的状态码:

  200请求成功

  301永久重定向

  302临时重定向

  403权限问题

  404找不到页面

  500服务器问题

  15、Django中FBV与CBV

  FBV(functionbaseviews)就是在视图里使用函数处理请求。

  CBV(classbaseviews)就是在视图里使用类处理请求。

  如果我们要写一个处理GET方法的view,用函数写的话是下面这样。

  fromdjango.httpimportHttpResponse

  defmy_view(request):

  ifrequest.method=='GET':

  returnHttpResponse('OK')

  如果用class-basedview写的话,就是下面这样

  fromdjango.httpimportHttpResponse

  fromdjango.viewsimportView

  classMyView(View):

  defget(self,request):

  returnHttpResponse('OK')

  Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-basedview提

  供了一个as_view()静态方法(也就是类方法),

  在url中,就这么写:

  #urls.py

  fromdjango.conf.urlsimporturl

  frommyapp.viewsimportMyView

  urlpatterns=[

  url(r'^index/$',MyView.as_view()),]

  16、谈谈DjangoRESTfreamwork

  自动生成符合RESTful规范的API

  支持OPTION、HEAD、POST、GET、PATCH、PUT、DELETE

  根据Content-Type来动态的返回数据类型(如text、json)

  DjangoRestframework的流程大概是这样的

  1.建立Models

  2.依靠Serialiers将数据库取出的数据Parse为API的数据(可用于返回给客户端,也可用于浏览器

  显示)

  3.ViewSet是一个views的集合,根据客户端的请求(GET、POST等),返回Serialiers处理的数据

  权限Premissions也在这一步做处理

  4.ViewSet可在Routers进行注册,注册后会显示在ApiRoot页上

  5.在urls里注册ViewSet生成的view,指定监听的url

  17、对Django的认识?

  #1.Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象

  定义,它就能自动生成数据库结构、以及全功能的管理后台。

  #2.Django内置的ORM跟框架内的其他模块耦合程度高。

  #应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利;

  #理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛

  胚房做全新的装修。

  #3.Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都

  需要对其进行重构,才能满足性能的要求。

  #4.Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。

  #5.Django模板的设计哲学是彻底的将代码、样式分离;Django从根本上杜绝在模板中进行编码、处理数

  据的可能。

  18、Django、Flask、Tornado的对比

  #1.Django走的是大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据

  库和开发测试用的服务器

  #给开发者提高了超高的开发效率

  #2.Flask是轻量级的框架,自由,灵活,可扩展性很强,核心基于WerkzeugWSGI工具和jinja2模板引擎

  #3.Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式

  #Tornado的两大核心模块:

  #1.iostraem:对非阻塞式的socket进行简单的封装

  #2.ioloop:对I/O多路复用的封装,它实现了一个单例

  19、什么是wsgi,uwsgi,uWSGI?

  #WSGI:

  #web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架

  #实现wsgi协议的模块:

  #1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)

  #2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)

  #uwsgi:

  #与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型

  #uWSGI:

  #是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,

  20、django请求的生命周期?

  #1.wsgi,请求封装后交给web框架(Flask、Django)

  #2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session-

  #3.路由匹配根据浏览器发送的不同url去匹配不同的视图函数

  #4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates=>渲染-

  #5.中间件,对响应的数据进行处理。

  #6.wsgi,将响应的内容发送给浏览器。

  21、简述什么是FBV和CBV?

  #FBV和CBV本质是一样的

  #基于函数的视图叫做FBV,基于类的视图叫做CBV

  #在python中使用CBV的优点:

  #1.提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)

  #2.可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性

  22、如何给CBV的程序添加装饰器?

  #引入method_decorator模块

  #1.直接在类上加装饰器

  #@method_decorator(test,name='dispatch')

  #classLoginview(View):

  #pass

  #2.直接在处理的函数前加装饰器

  #@method_decorator(test)

  #defpost(self,request,*args,**kwargs):pass

  以上,就是python面试基础知识,小编还会陆续更新哦!希望大家都能找到合适的工作!