【转载】python面试基础知识(三) Django部分
发布日期:2019-11-21 14:07:43点击次数:次
最近,小编在整理python面试基础知识,看了很多博客、文章和咨询了一些大厂公司大牛。了解到,在python面试的时候,不仅要求你有项目经验,还要考试代码呢!今天,小编和大家分享一下python面试基础知识,希望帮忙大家找到理想的工作!
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面试基础知识,小编还会陆续更新哦!希望大家都能找到合适的工作!