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-Relation Mapping,意为对象-关系映射
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面
向对象编程,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|grep 8080
输出结果: tcp 0 0 :::8080 :::* LISTEN 12006/java
执行命令: ps -ef | grep 12006

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-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/
sessionriding,缩写为:CSRF/XSRF。
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情
包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包
括:个人隐私泄露以及财产安全。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
  1.登录受信任网站A,并在本地生成Cookie。
  2.在不登出A的情况下,访问危险网站B。

14、谈谈RESTful规范

Representational State Transfer "表现层状态转化"
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(function base views) 就是在视图里使用函数处理请求。
CBV(class base views) 就是在视图里使用类处理请求。
如果我们要写一个处理GET方法的view,用函数写的话是下面这样。
from django.http import HttpResponse
def my_view(request):
     if request.method == 'GET':
            return HttpResponse('OK')
如果用class-based view写的话,就是下面这样
from django.http import HttpResponse
from django.views import View
class MyView(View):
      def get(self, request):
            return HttpResponse('OK')
Django的url是将一个请求分配给可调用的函数的,而不是一个class。针对这个问题,class-based view提
供了一个as_view()静态方法(也就是类方法),
在url中,就这么写:
# urls.py
from django.conf.urls import url
from myapp.views import MyView
  
urlpatterns = [
     url(r'^index/$', MyView.as_view()),
]

16、谈谈Django REST freamwork

自动生成符合 RESTful 规范的 API
支持 OPTION、HEAD、POST、GET、PATCH、PUT、DELETE
根据 Content-Type 来动态的返回数据类型(如 text、json)
Django Rest framework 的流程大概是这样的
1.建立 Models
2.依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器
显示)
3.ViewSet 是一个 views 的集合,根据客户端的请求(GET、POST等),返回 Serialiers 处理的数据
权限 Premissions 也在这一步做处理
4.ViewSet 可在 Routers 进行注册,注册后会显示在 Api Root 页上
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是轻量级的框架,*,灵活,可扩展性很强,核心基于Werkzeug WSGI工具和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')
#class Loginview(View):
#    pass
#2.直接在处理的函数前加装饰器
#@method_decorator(test)
#    def post(self,request,*args,**kwargs):pass

23、简述MVC和MTV

#MVC软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)
#Model:负责业务对象与数据库的映射(ORM)
#View:负责与用户的交互
#Control:接受用户的输入调用模型和视图完成用户的请求
#Django框架的MTV设计模式借鉴了MVC框架的思想,三部分为:Model、Template和View
#Model(模型):负责业务对象与数据库的对象(ORM)
#Template(模版):负责如何把页面展示给用户
#View(视图):负责业务逻辑,并在适当的时候调用Model和Template
#此外,Django还有一个urls分发器,
#它将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

24、django路由系统中name的作用?

#用于反向解析路由,相当于给url取个别名,只要这个名字不变,即使对应的url改变
#通过该名字也能找到该条url

25、列举django的内置组件?

#1.Admin是对model中对应的数据表进行增删改查提供的组件
#2.model组件:负责操作数据库
#3.form组件:1.生成HTML代码2.数据有效性校验3校验信息返回并展示
#4.ModelForm组件即用于数据库操作,也可用于用户请求的验证

26、 说一下Django,MIDDLEWARES中间件的作用和应用场景?

#中间件是介于request与response处理之间的一道处理过程,用于在全局范围内改变Django的输入和输出。
#简单的来说中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作
#例如:
#1.Django项目中默认启用了csrf保护,每次请求时通过CSRF中间件检查请求中是否有正确#token值
#2.当用户在页面上发送请求时,通过自定义的认证中间件,判断用户是否已经登陆,未登陆就去登陆。
#3.当有用户请求过来时,判断用户是否在白名单或者在黑名单里

27、列举django中间件的5个方法?

#1.process_request : 请求进来时,权限认证
#2.process_view : 路由匹配之后,能够得到视图函数
#3.process_exception : 异常时执行
#4.process_template_responseprocess : 模板渲染时执行
#5.process_response : 请求有响应时执行

28、 django的request对象是在什么时候创建的?

#class WSGIHandler(base.BaseHandler):
#    request = self.request_class(environ)
#请求走到WSGIHandler类的时候,执行__cell__方法,将environ封装成了request

29、Django重定向是如何实现的?用的什么状态码?

#1.使用HttpResponseRedirect
#from django.http import HttpResponseRedirect  
#2.使用redirect和reverse
#状态码:301和302
#301和302的区别:
#相同点:都表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址
#不同点:
#301比较常用的场景是使用域名跳转。比如,我们访问 http://www.baidu.com 会跳转到
 https://www.baidu.com
#表示旧地址A的资源已经被永久地移除了
#302用来做临时跳转,比如未登陆的用户访问用户中心重定向到登录页面。表示旧地址A的资源还在
(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B

30、xxss攻击

#-- XSS攻击是向网页中注入恶意脚本,用在用户浏览网页时,在用户浏览器中执行恶意脚本的攻击。
#    -- XSS分类,反射型xss ,存储型xss
#    -- 反射型xss又称为非持久型xss,攻击者通过电子邮件等方式将包含注入脚本的链接发送给受害者,
#        受害者通过点击链接,执行注入脚本,达到攻击目的。
#    -- 持久型xss跟反射型的最大不同是攻击脚本将被永久的存放在目标服务器的数据库和文件中,
多见于论坛
#        攻击脚本连同正常信息一同注入到帖子内容当中,当浏览这个被注入恶意脚本的帖子的时候,
恶意脚本会被执行
#    -- 防范措施 1 输入过滤  2 输出编码  3 cookie防盗
#        1,输入过滤 用户输入进行检测 不允许带有js代码
#        2,输出编码 就是把我们的脚本代码变成字符串形式输出出来
#        3,cookie加密
        
#向页面注入恶意的代码,这些代码被浏览器执行
#XSS攻击能做些什么:
#    1.窃取cookies
#    2.读取用户未公开的资料,如果:邮件列表或者内容、系统的客户资料,联系人列表
#解决方法:
#    1.客户度端:表单提交之前或者url传递之前,对需要的参数进行过滤
#    2.服务器端:检查用户输入的内容是否有非法内容

31、 django中csrf的实现机制

#第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在
SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;
#第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起
传给后端;Cookies:{csrftoken:xxxxx}
#第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;

32、基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?

#1.后端将csrftoken传到前端,发送post请求时携带这个值发送
data: {
             csrfmiddlewaretoken: '{{ csrf_token }}'
        },
#2.获取form中隐藏标签的csrftoken值,加入到请求数据中传给后端
 data: {
         csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val()
         },
#3.cookie中存在csrftoken,将csrftoken值放到请求头中
headers:{ "X-CSRFtoken":$.cookie("csrftoken")},

33、Django本身提供了runserver,为什么不能用来部署?(runserver与uWSGI的区别)

#1.runserver方法是调试 Django 时经常用到的运行方式,它使用Django自带的
#WSGI Server 运行,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。
#2.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是一种通信协议,
而uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。
#uWSGI具有超快的性能、低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够
将用户访问请求与应用 app 隔离开,实现真正的部署 。
#相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

34、 cookie和session的区别:

#1.cookie:
#    cookie是保存在浏览器端的键值对,可以用来做用户认证
#2.session:
#   将用户的会话信息保存在服务端,key值是随机产生的自符串,value值时session的内容
#    依赖于cookie将每个用户的随机字符串保存到用户浏览器上
#Django中session默认保存在数据库中:django_session表
#flask,session默认将加密的数据写在用户的cookie中

35、列举django orm 中所有的方法(QuerySet对象的所有方法)

#<1> all():                  查询所有结果 
#<2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象。获取不到返回None
#<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个。获取不到会
抱胸
#如果符合筛选条件的对象超过一个或者没有都会抛出错误。
#<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
#<5> order_by(*field):       对查询结果排序
#<6> reverse():              对查询结果反向排序 
#<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。 
#<9> first():                返回第一条记录 
#<10> last():                返回最后一条记录 
#<11> exists():              如果QuerySet包含数据,就返回True,否则返回False
#<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一
系model的实例化对象,而是一个可迭代的字典序列
#<13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个
字典序列
#<14> distinct():            从返回结果中剔除重复纪录

36、only和defer的区别?

#only:从数据库中只取指定字段的内容
#defer:指定字段的内容不被检索

37、select_related和prefetch_related的区别?

#有外键存在时,可以很好的减少数据库请求的次数,提高性能
#select_related通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询
#prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询