面试django需要get到的知识点

1. 列举HTTP请求中常见的请求方式

方法名称有8种:GET,POST,DELETE,PUT,OPTIONS,TRACE,CONNECT 
注意点:方法名称是区分大小写的
当某个请求所针对的资源不支持的请求方式的时候,服务器应当返回状态码406
当服务器不认识或者不支持对应的请求方式时,应返回状态码501

2. Django的MVT模式

Django的MVT模式本质上和MVC是一样的,都是为了各组件间保持松耦合关系,只是定义上有些许不同。
Django的MVT分别是指:
M代表模型,负责业务对象和数据的关系映射。
T代表模板,负责如何那页面展示给用户。
V代表视图,负责业务逻辑,并在适当时候调用Model和Template。
相信你们上面的都知道,然后下面这一点是重点:
除了以上一层之外,还需要一个URL分发器,它的作用是将一个URL的页面请求分发给不同的view处理,view在调用相应的model和template。

3. django的生命周期

  1. WSGI,请求封装后交给web框架。
  2. 中间件,对请求进行校验或在请求对象中添加其他相关数据。
  3. 路由匹配,根据浏览器发送的不同url去匹配不同的视图函数。
  4. 视图函数,在视图函数中进行业务逻辑的处理,可能会涉及到orm,templates=>渲染
  5. 中间件,对相应的数据进行处理
  6. WSGI,将响应的内容发送给浏览器

4.简述FBV和CBV

FBV和CBV本质上是一致的
基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的好处:
1. 提高了代码的复用性,可以使用面向对象的技术,例如Mixin(多继承)
2. 可以针对不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读行。

5.谈谈你对ORM的理解

概念:orm简单来说就是通过实例对象的语法,完成对关系型数据库的操作,是对象-关系映射(Object/Relational Mapping)的缩写。
ORM把数据库映射成对象。
数据库的表(table)–> 类对象(class)
记录(record,行数据) -->对象(object)
字段(field) -->对象的属性(attribute)
ORM 的特点:

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

ORM的优点:

  1. 数据模型都在一个地方定义,更容易更新和维护,也利于重用代码
  2. ORM有现成的工具,很多功能都可以自动完成,比如,数据消毒,预处理,事务。
  3. 基于ORM的业务代码比较简单,代码量少,容易理解。

ORM的缺点:

  1. ORM库不是轻量级工具,需要花很多精力学习和设置。
  2. 会牺牲程序的执行效率和会固定的思维模式。
  3. 对于复杂的查询,ORM要么是无法表达,要么是性能不如原生的SQL。

6.什么是中间件并简述其作用

django的中间件是一个轻量级,底层的插件系统,可以介入Django的请求和相应处理过程,修改Django的输入或输出。
定义一个中间件工厂函数,然后返回一个可以被调用的中间件。
中间件工厂函数需要接收一个可以调用的get_response对象。
中间件是介于request和response处理之间的一道处理过程,用于全局范围改变Django的输入和输出,简单的来说中间件是帮助我们在视图函数指向之前和指向之后都可以做一些额外的操作。
可以用来访问网站之前,检查访问的ip地址是否频繁,如果频繁就阻止访问。

7. django中间件的生命周期

中间件中一共有5个方法,分别是process_request, process_response,process_view,process_exception,process_render_template。
当一个请求,首先从上往下运行这些类中process_request方法, 之后进入django的从上往下执行每个类中的process_view方法,在然后就进入我们自定义的view.py 文件,如果你的视图中有错误,那就回从下往上执行中间件中的process_exception方法,然后就把错误信息在通过process_response中返回给客户端。

  1. 处理请求前:在每个请求上,request对象产生之后,url匹配之前调用,返回None或HTTPResponse对象。(process_request)
  2. 处理视图前:在每个请求上,url匹配之后,视图函数调用之前调用,返回None或者HTTPResponse对象。(process_response)
  3. 处理相应后:视图函数调用只有,所有响应返回浏览器之前被调用,在每个请求上调用,返回HttpResponse对象。(process_view)
  4. 异常处理:当视图抛出异常时调用,在每个请求上调用,返回一个HTTPResponse对象。(process_exception)

8.常用视图响应的方式是什么

处理函数接受HTTP请求并返回响应,可以放在任何地方。
处理函数可以返回web文本,页面,重定向,错误,图片等任何内容。
处理函数通过HTTPResponse,JSONResponse等类表达式和返回相应。
按照约定,处理函数放在对应APP中的views…py 文件中。
相应类型
HTTPResponse类及其子类
usage: 一次性响应,返回字符串

from django.http import HttpResponse

response = HttpResponse("hello")

JsonResponse类
usage:一次性响应,返回Json数据

from django.http import JsonResponse

response = JsonResponse({'foo':'bar'})

StreamingResponse类
usage: 流式响应,返回大的文本文件

FileResponse类
usage:流式响应,返回大的二进制文件

from django.http import FileResponse

response = FileResponse(open('myfile.png','rb'))

手动转载 :https://blog.csdn.net/sinat_29718177/article/details/79850453老铁点赞。

9. Django开发中数据库做过什么优化?

  1. 设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能。
  2. 使用缓存,减少对数据库的访问。
  3. 在orm框架下设置频率搞得字段属性,在定义时创建索引。
  4. 可以给搜索频率高的字段属性,在定义时创建索引。
  5. 如果一个页面需要多次连接数据库,最好一次性取出所有需要的数据,减少对数据库的查询次数;
  6. 若页面只需要数据库里一个两个字段时,可以用QuerySet.values()。
  7. Django orm 框架下的QuerySets本来就有缓存。
  8. 在模板标签里使用with标签可以缓存QuerySet的查询结果。

10. Django如何提升性能(高并发)

对于一个后端开发程序员来说,提升性能指标主要有两个,一个是并发数,另一个相应时间网站性能优化,性能优化一般包括web前端性能优化,应用服务器性能优化,存储服务器优化。
对前端的优化主要有:

  1. 减少HTTP请求,减少数据库的访问量,比如使用雪碧图
  2. 使用浏览器缓存,将一些常用的css,js,logo图标,这些静态资源缓存到本地浏览器,通过设置HTTP头中的cache-control和expires的属性,可设定浏览器缓存,缓存时间可以自定义。
  3. 对HTML,css,Javascript文件进行压缩,减少网络的通信量。
    对于个人而言,我做的优化主要是以下三个方面:
  4. 合理的使用缓存技术,对一些常用到的动态数据,比如首页做一个缓存,或者某些常用的数据做个 缓存,设置一定得过期时间,这样减少对数据库的压力,提升网站性能。
  5. 使用celery消息队列,将耗时的操作扔到队列里,让worker去监听队列里的任务,实现异步操作,比如发邮件,发短信。
  6. 就是代码上的一些优化,补充:nginx部署项目也是项目优化,可以配置合适的配置参数,提升效率,增加并发量。
  7. 如果太多考虑安全因素,服务器磁盘用固态硬盘读写,远远大于机械硬盘,这个技术现在没有普及,主要是固态硬盘技术还不是完全成熟,相信以及会大量普及。
  8. 另外还可以搭建服务器集群,将并发访问请求,分散到多台服务器上处理。
  9. 运维工作人员的一些性能优化技术。

11. 什么是restful api,谈谈你的理解?

REST:Representational State Transfer 的缩写,翻译:具象状态传输。一般解释为‘表现层状态转换’
REST的特点:

  1. 具象的。一般指表现层,要表现的对象就是资源。比如,客户端访问服务器,获取的数据就是资源。比如文字,图片,音视频等。
  2. 表现:资源的表现形式。TXT格式,HTML格式,json格式,jpg格式等。浏览器通过url确定资源的表现,但是需要在HTTP请求头中,用accept和content-Type字段指定,这两个字段是对资源表现的描述。
  3. 状态转化:客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转化。其中,GET表示获取资源,POST表示新建资源,PUT表示更新资源,DELETE表示删除资源。HTTP协议中最常用的就是这四种操作方式。

REST架构:

  1. 每一个URL代表一种资源。
  2. 客户端和服务器之间,传递这种资源的某种表现层。
  3. 客户端通过四个HTTP动词,对服务器资源进行操作,实现表现层状态转换。

12. 如何设计符合RESTful风格的API

  1. 域名:将api部署在专用域名下或者将api放在主域名下
  2. 版本:将API的版本号放在url中
  3. 路径:路径表示API的具体网址。每个网址代表一种资源。资源作为网址,网址中不能有动词只能有名词,一般名词要与
    数据库的表名对应。而且要使用复数。
  4. 使用标准的HTTP方式:对于资源的具体操作类型,由HTTP动词表示。常用的HTTP动词有四个。
    GET SELECT:从服务器获取资源。
    POST CREATE:在服务器新建资源。
    PUT UPDATE:在服务器更新资源。
    DELETE DELETE:从服务器删除资源。
  5. 过滤信息:如果资源数据较多,服务器不能将所有数据一次全部返回给客户端。API应该提供参数,过滤返回结果。
  6. 状态码:服务器向用户返回的状态码和提示信息,常用的有:
    200 OK :服务器成功返回用户请求的数据。
    201 CREATED: 用户新建或修改数据成功。
    202 Accepted: 表示请求已进入后台排队。
    400 INVALID REQUEST :用户发出的请求有错误。
    401 Unauthorized: 用户没有权限。
    403 Forbidden : 访问被禁止。
    404 NOT FOUND:请求针对的是不存在的记录。
    406 NOt Acceptable: 用户请求的格式不正确。
    500 INTERNAL SERVER ERROR : 服务器发生错误。
  7. 错误信息:一般来说服务器返回的错误信息,一键值对的形式返回。
  8. 相应结果:针对不同结果,服务器向客户端返回的结果应符合以下规范。
  9. 使用链接关联相关的资源:在返回相应结果提供链接其他API的方法,使客户端很方便的获取相关联的信息。
  10. 其他:服务器返回的数据格式,应该尽量使用json,避免使用XML。

11. 什么csrf 攻击原理,如何理解?

     简单来说就是:你访问了信息网站A,然后A会用保存你的个人信息并返回给你的浏览器一个cookie,然后在cookie的过期时间之内,你去访问了一个恶意的网站B,他给你返回一些恶意请求代码,要求你去访问网站A,而你的浏览器在收到这个恶意请求之后,在你不知情的情况下,会带上保存在本地浏览器的cookie信息去访问网站A,然后网站A误以为是用户本身的操作,导致来自恶意网站C的攻击代码会被执行:发邮件,发消息,修改你的密码,购物,转账,偷窥你的个人信息,导致你私人信息泄露和账户财产受到威胁。

12. 启动Django服务的方法?

     runserver方法是调试Django时经常用的运行方式,它使用Django自带的WSGI Server运行,主要在测试和开发中使用,并且runserver开启的方式也是单进程。

13. Django中哪里用到了线程?哪里用到了协程?哪里用到了进程?

  1. Django中耗时的任务用一个进程或者线程来执行,比如发邮件,使用celery
  2. 部署django项目的时候,配置文件中设置了进程和协程的相关配置。

14. 代码优化从哪些方面考虑?有什么想法?

  1. 优化算法时间
    算法的时间复杂度对程序的执行效率影响最大,在python中可以通过选择合适的数据结果来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同的场景有不同的优化方式。总的来说,一般有分治,贪心,动态规划等思想。
  2. 循环优化
    每种编程语言都会强调需要优化循环。当时用python的时候,你可以依靠大量的技巧使得循环运行得更快。然而,开发者经常漏掉的一个方法是:
    避免在一个循环中使用点操作。每一次你调用方法 str.uuper,python都会求该方法的值。然而,如果你用一个变量代替求得的值,值就变成了已知的,python就可以更快的执行任务。优化循环的关键,是要减少python再循环内部执行的工作量,因为python原生的解释器在那种情况下,真的会减缓执行的速度。(注意:优化循环的方式有很多,这只是其中的一个,例如,许多程序员都会说,列表推导式是在循环中提高执行速度的最好方式。这里的关键是,优化循环是程序取得更高的执行速度的更好方式之一。)
  3. 函数选择
    在循环的时候使用xrange而不是range,使用xrange可以节省大量的系统内存,因为xrang()在序列中每次调用只产生一个整数元素。而range()将直接返回完整的元素列表,用于循环是会有不必要的开销。在Python3中xrange不再存在,里面range提供一个可以遍历任意长度的范围的iterator。
  4. 并行编程
    因为GIL的存在,python很难重分利用多核CPU的优势。但是,可以通过内置的模块Multiprocessing实现下面几种并行模式:
    多进程:对于CPU密集型的程序,可以使用multiprocessing的process,pool等封装好的类,通过多进程的方式实现并行计算。但是因为进程的通信成本比较大,对于进程之间需要大量数据交互的程序效率未必有大的提高。
    多线程:对于IO密集型的程序,multiprocessing.dummy模块使用multiprocessing的接口封装threading,使得多线程也变得非常轻松(比如可以是用Pool的map接口,简洁高效)。
    分布式:multiprocessing中的Managers类提供了可以在不同进程之间共享数据的方式,可以再次基础上开发分布式的程序。
  5. set的用户
    set 的union,intersection,difference操作要比list的迭代要快。因此如果涉及到要求list交集,并集或者差的问题可以转换为set来操作。

15. nginx的正向代理与反向代理?

	web 开发中,部署方式大致类似。简单来说,使用nginx主要是为了实现分流,转发,负载均衡,以及分担服务器的压力。nginx部署简单。nginx部署简单,内存消耗少,成本低。nginx既可以做正向代理,也可以做反向代理。
	正向代理:请求进过代理服务器从局域网发出,然后到达互联网上的服务器。
	特点: 服务端并不知道真正的客户端是谁。
	反向代理: 客户端并不知道真正的服务端是谁。
	特点:客户端并不知道真正的服务端是谁
	区别:正向代理的对象是客户端。反向代理的对象是服务端。

16. 简述Django下的缓存机制?

		一个动态网站的基本权衡点就是他是动态的,每次用户请求页面,服务器会重新计算。从开销处理的角度来看,这比你读取一个现成的标准文件的代价要昂贵的多。
		这就是需要缓存的地方。
		Django自带了一个健壮的缓存系统来保存动态页面这样避免对于每次请求都重新计算。方便起见,Django提供了不同级别的缓存粒度:可以缓存特定视图的输出,可以仅仅缓存那些很难生产出来的部分,或者可以缓存整个网站Django也能很好的配合那些 下游 的缓存,比如Squid和基于浏览器的缓存。这里有一些缓存不必要直接去控制但是可以提供线索,关于网站那些部分需要缓存和如何缓存。
		设置缓存:
		缓存系统需要一些社会才能使用也就是说,你必须告诉他你要把数据缓存在哪里,是数据库中,文件系统或者直接在内存中。这个决定很重要,因为他会影响你的缓存性能,是的,一些缓存类型要比其他的缓存类型更快速。
		你的缓存配置是通过setting文件中我的CACHES配置来实现的。这里有CACHES所有可配置的变量值。

17. 对cookie与session的了解?

session采用的是在服务器端保持状态的方案,而cookie采用的是在客户端保持状态的方案。但是禁用cookie就不能得到session。因为session使用session ID 来确定当前对话对应的服务器session,而session ID 是通过Cookie来传递的,禁用cookie相当于失去了sessionID,也就得不到Session。

18. Django HTTP 请求的处理流程?

django 和其他web 框架的HTTP处理的流程大致相同,Django处理一个Request 的过程是首先通过中间件,然后在通过默认的URL方式进行的。我们可以在Middleware这个地方把所有的Request拦截住,用我们自己的方式完成处理以后直接返回Response。

  1. 加载配置
    Django的配置都在 “Project/setting.py” 中定义,可以是Django的配置,也可以是自定义的配置,并且都通过Django.conf.settings 访问,非常方便。
  2. 启动
    最核心动作的是通过django.core.management.commands.runfcg的Command来启动,他运行 django.core.serversfastcgi中的runfatscgi,runfastcgi使用了flup的WSGIServer来启动fastcgi。而WSGIServer中携带了django.core.handlers.wsgi 的 WSGIHander类的一个实例,通过WSGIHandler来处理web服务器传过来的请求,此时才是真正进入Django的世界。
  3. 处理Request
    当有HTTP请求时,WSGIHandler就开始工作了,它从BaseHandler继承而来。WSGIHandler为每个请求创建一个WSGIRequest是从http.HTTPRequest继承而来,接下来就开始创建Response了。
  4. 创建Response
    BaseHandler 的get_response 方法就是根据 request 创建 response,而具体生成response的动作就是执行urls.py中对应的view函数了,这也是Django可以处理“”友好 URL“”的关键步骤,每个这样的函数都要返回一个Response实例。此时一般的做法是通过loader加载template并生成页面内容,其中需要的就是通过ORM技术从数据库中驱虎数据,并渲染到Template中,从而生成具体的页面了。
  5. 处理 Response
    Django返回Response给flup,flup就取出Response的内容返回给Web服务器,由后者返回给浏览器。
    总之,Django在fastcgi中主要做了两件事;处理Request 和创建 Response,而他们对应的核心就是 “”urls 分析“”,“”模板技术“”和“”OMR技术“”

19. django中当一个用户登录A应用服务器(进入登录状态) ,然后下次请求被nginx代理到B应用服务器会出现什么影响?

如果用户在A应用服务器登录的session数据没有共享到B应用服务器,那么之前的登录状态就没有了。

20. 跨域请求的问题django怎么解决

启用中间件
post 请求
验证码
表单中添加csrf_token标签

21. Django本身提供了runserver,为什么不能用来部署?

runserver方法是调试Django时经常用到的运行方式,它使用Django自带的WSGI Server 运行,主要在测试和开发中使用,并且runserver 开启的方式也是单进程。

uWSGI 是一个 Web 服务器。他实现了WSGI协议,uwsgi,http等协议。注意uwsgi 是一种通信协议。而uWSGI是实现uwsgi是实现uwsgi协议和WSGI协议的Web服务器。uWSGI具有超快的性能,低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用怒访问请求与应用app隔离开,实现真正的部署。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。

22. git常用命令?

git clone 克隆指定仓库
git status 查看党庆仓库状态
git diff 比较版本的区别
git log 查看git操作日志
git reset 回溯历史版本
git add 将文件添加到暂存区
git commit 将文件提交到服务器
git checkout 切换到指定分支
git rm 删除指定文件

发布了4 篇原创文章 · 获赞 1 · 访问量 83

猜你喜欢

转载自blog.csdn.net/Miss_ss_L/article/details/105150340