Django面试题

1. 对Django的认识?

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

2. Django 、Flask、Tornado的对比

#1.Django走的是大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器
#给开发者提升了超高的开发效率
#2.Flask是轻量级的框架,自由,灵活,可扩展性很强,核心基于Werkzeug WSGI工具和jinja2模板引擎
#3.Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式
#Tornado的两大核心模块:
#    1.iostraem:对非阻塞式的socket进行简单的封装
#    2.ioloop:对I/O多路复用的封装,它实现了一个单例

3. 什么是wsgi,uwsgi,uWSGI?

#WSGI:
#    web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,而后将请求交给web框架
#    实现wsgi协议的模块:
#        1.wsgiref,本质上就是编写一个socket服务端,用于接收用户请求(django)
#        2.werkzeug,本质上就是编写一个socket服务端,用于接收用户请求(flask)
#uwsgi:
#    与WSGI同样是一种通讯协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型
#uWSGI:
#    是一个web服务器,实现了WSGI协议,uWSGI协议,http协议,

4. django请求的生命周期?

#1.wsgi,请求封装后交给web框架 (Flask、Django)     
#2.中间件,对请求进行校验或在请求对象中添加其余相关数据,例如:csrf、request.session     - 
#3.路由匹配 根据浏览器发送的不一样url去匹配不一样的视图函数    
#4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染     - 
#5.中间件,对响应的数据进行处理。 
#6.wsgi,将响应的内容发送给浏览器。

5. 简述什么是FBV和CBV?

#FBV和CBV本质是同样的
#基于函数的视图叫作FBV,基于类的视图叫作CBV
#在python中使用CBV的优势:
#1.提升了代码的复用性,可使用面向对象的技术,好比Mixin(多继承)
#2.能够用不一样的函数针对不一样的HTTP方法处理,而不是经过不少if判断,提升代码可读性

6. 如何给CBV的程序添加装饰器?

#引入method_decorator模块
#1.直接在类上加装饰器
#@method_decorator(test,name='dispatch')
#class Loginview(View):
#    pass
#2.直接在处理的函数前加装饰器
#@method_decorator(test)
#    def post(self,request,*args,**kwargs):pass

7. 简述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

8. django路由系统中name的做用?

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

9. 列举django的内置组件?

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

10. 说一下Django,MIDDLEWARES中间件的做用和应用场景?

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

11. 列举django中间件的5个方法?

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

12. django的request对象是在何时建立的?

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

13. 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

14. xxss攻击

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

15. django中csrf的实现机制

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

16. 基于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")},

17. 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 隔离开,实现真正的部署 。
#相比来说,支持的并发量更高,方便管理多进程,发挥多核的优点,提高性能。

18. cookie和session的区别:

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

19. 列举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():            从返回结果中剔除重复纪录

20. only和defer的区别?

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

21. select_related和prefetch_related的区别?

#有外键存在时,能够很好的减小数据库请求的次数,提升性能
#select_related经过多表join关联查询,一次性得到全部数据,只执行一次SQL查询
#prefetch_related分别查询每一个表,而后根据它们之间的关系进行处理,执行两次查询

22. filter和exclude的区别?

``css

取到的值都是QuerySet对象,filter选择知足条件的,exclude:排除知足条件的.

# 23. F和Q的做用?

F:对数据自己的不一样字段进行操做 如:比较和更新

Q:用于构造复杂的查询条件 如:& |操做

# 24. values和values_list的区别?

values : 取字典的queryset

values_list : 取元组的queryset

# 25. 如何使用django orm批量建立数据?

bulk_create()

objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)]

models.Book.objects.bulk_create(objs)

# 26. django的Form和ModeForm的做用?

Form做用:

1.在前端生成HTML代码

2.对数据做有效性校验

3.返回校验信息并展现

ModeForm:根据模型类生成From组件,而且能够操做数据库

# 27. django的Form组件中,若是字段中包含choices参数,请使用两种方式实现数据源实时更新。

1.重写构造函数

def def init(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")html

2.利用ModelChoiceField字段,参数为queryset对象

# 28. django的Model中的ForeignKey字段中的on_delete参数有什么做用?

删除关联表中的数据时,当前表与其关联的field的操做

django2.0以后,表与表之间关联的时候,必需要写on_delete参数,不然会报异常

# 29. django如何实现websocket?

列举django orm中三种能写sql语句的方法。

1.使用execute执行自定义的SQL

2.使用extra方法

3.使用raw方法

1.执行原始sql并返回模型

2.依赖model多用于查询

# 30. django orm 中如何设置读写分离?

1.手动读写分离:经过.using(db_name)来指定要使用的数据库

2.自动读写分离:

1.定义类:如Router

2.配置Router

settings.py中指定DATABASE_ROUTERS

DATABASE_ROUTERS = ['myrouter.Router',]

提升读的性能:多配置几个数据库,并在读取时,随机选取。写的时候写到主库

实现app之间的数据库分离:分库分表

## 31. django中如何实现orm表中添加数据时建立一条日志记录。

# 32. django内置的缓存机制?

全站缓存

MIDDLEWARE_CLASSES = (
‘django.middleware.cache.UpdateCacheMiddleware’, #第一
'django.middleware.common.CommonMiddleware',
‘django.middleware.cache.FetchFromCacheMiddleware’, #最后
)前端

视图缓存

from django.views.decorators.cache import cache_page
import timepython

@cache_page(15) #超时时间为15秒
def index(request):
t=time.time() #获取当前时间
return render(request,"index.html",locals())ios

模板缓存

{% load cache %}
web

不缓存:-----{{ t }}

{% cache 2 'name' %} # 存的key
ajax

缓存:-----:{{ t }}


{% endcache %}

# 33. django的缓存能使用redis吗?若是能够的话,如何配置?

1.安装 pip install django-redis

2.在stting中配置CACHES,能够设置多个缓存,根据名字使用

CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
                # "PASSWORD": "密码",
            }
        }
    },
    #另添加缓存
    "JERD": { }

3.根据名字去链接池中获取链接

from django_redis import get_redis_connection
    conn = get_redis_connection("default")
# 34. django的模板中filter和simple_tag的区别?

自定义filter:{{ 参数1|filter函数名:参数2 }}

1.能够与if标签来连用

2.自定义时须要写两个形参

simple_tag:{% simple_tag函数名 参数1 参数2 %}

1.能够传多个参数,没有限制

2.不能与if标签来连用

# 35. django-debug-toolbar的做用?

1.是django的第三方工具包,给django扩展了调试功能

包括查看sql语句,db查询次数,request,headers等

## 36. django中如何实现单元测试?

# 37. 解释orm中 db first 和 code first的含义?

数据持久化的方式:

db first基于已存在的数据库,生成模型

code first基于已存在的模型,生成数据库库

# 38. django中如何根据数据库表生成model中的类?

1.在settings中设置要链接的数据库

2.生成model模型文件

python manage.py inspectdb

3.模型文件导入到models中

python manage.py inspectdb > app/models.py

# 39. 使用orm和原生sql的优缺点?

1.orm的开发速度快,操做简单。使开发更加对象化

执行速度慢。处理多表联查等复杂操做时,ORM的语法会变得复杂

2.sql开发速度慢,执行速度快。性能强

# 40. django的contenttype组件的做用?

这个组件保存了项目中全部app和model的对应关系,每当咱们建立了新的model并执行数据库迁移后,ContentType表中就会自动新增一条记录

当一张表和多个表FK关联,而且多个FK中只能选择其中一个或其中n个时,能够利用contenttypes

# 41. 谈谈你对restful规范的认识?

首先restful是一种软件架构风格或者说是一种设计风格,并非标准,它只是提供了一组设计#原则和约束条件,主要用于客户端和服务器交互类的软件。

就像设计模式同样,并非必定要遵循这些原则,而是基于这个风格设计的软件能够更简洁,更#有层次,咱们能够根据开发的实际状况,作相应的改变。

它里面提到了一些规范,例如:

1.restful 提倡面向资源编程,在url接口中尽可能要使用名词,不要使用动词

二、在url接口中推荐使用Https协议,让网络接口更加安全

https://www.bootcss.com/v1/mycss?page=3

(Https是Http的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,

所以加密的详细内容就须要SSL(安全套接层协议))

三、在url中能够体现版本号

https://v1.bootcss.com/mycss

不一样的版本能够有不一样的接口,使其更加简洁,清晰

四、url中能够体现是不是API接口

https://www.bootcss.com/api/mycss

五、url中能够添加条件去筛选匹配

https://www.bootcss.com/v1/mycss?page=3

六、能够根据Http不一样的method,进行不一样的资源操做

(5种方法:GET / POST / PUT / DELETE / PATCH)

七、响应式应该设置状态码

八、有返回值,并且格式为统一的json格式

九、返回错误信息

返回值携带错误信息

十、返回结果中要提供帮助连接,即API最好作到Hypermedia

若是遇到须要跳转的状况 携带调转接口的URL

  ret = {
        code: 1000,
        data:{
        id:1,
        name:'小强',
        depart_id:http://www.luffycity.com/api/v1/depart/8/
        }
}
#  42. 接口的幂等性是什么意思?

1.是系统的接口对外一种承诺(而不是实现)

2.承诺只要调用接口成功,外部屡次调用对系统的影响都是一致的,不会对资源重复操做

# 43. 什么是RPC?

远程过程调用 (RPC) 是一种协议,程序可以使用这种协议向网络中的另外一台计算机上的程序请求服务

1.RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

2.首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,而后等待应答信息。

2.在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器得到进程参数,计算结果,发送答复信息,而后等待下一个调用信息,

3.最后,客户端调用进程接收答复信息,得到进程结果,而后调用执行继续进行。

# 44. 为何要使用API

系统之间为了调用数据。

数据传输格式:

1.json

2.xml

# 45. 为何要使用django rest framework框架?

能自动生成符合 RESTful 规范的 API

1.在开发REST API的视图中,虽然每一个视图具体操做的数据不一样,

但增、删、改、查的实现流程基本同样,这部分的代码能够简写

2.在序列化与反序列化时,虽然操做的数据不一样,可是执行的过程却类似,这部分的代码也能够简写

REST framework能够帮助简化上述两部分的代码编写,大大提升REST API的开发速度

# 46. django rest framework框架中都有那些组件?

1.序列化组件:serializers 对queryset序列化以及对请求数据格式校验

2.路由组件routers 进行路由分发

3.视图组件ModelViewSet 帮助开发者提供了一些类,并在类中提供了多个方法

4.认证组件 写一个类并注册到认证类(authentication_classes),在类的的authticate方法中编写认证逻

5.权限组件 写一个类并注册到权限类(permission_classes),在类的的has_permission方法中编写认证逻辑。

6.频率限制 写一个类并注册到频率类(throttle_classes),在类的的allow_request/wait 方法中编写认证逻辑

7.解析器 选择对数据解析的类,在解析器类中注册(parser_classes)

8.渲染器 定义数据如何渲染到到页面上,在渲染器类中注册(renderer_classes)

9.分页 对获取到的数据进行分页处理, pagination_class

10.版本 版本控制用来在不一样的客户端使用不一样的行为

在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不一样 作不一样处理

# 47. django rest framework框架中的视图均可以继承哪些类?

class View(object):

class APIView(View): 封装了view,而且从新封装了request,初始化了各类组件

class GenericAPIView(views.APIView):

1.增长了一些属性和方法,如get_queryset,get_serializer

class GenericViewSet(ViewSetMixin, generics.GenericAPIView)

父类ViewSetMixin 重写了as_view,返回return csrf_exempt(view)

并从新设置请求方式与执行函数的关系

class ModelViewSet(mixins.CreateModelMixin,

mixins.RetrieveModelMixin,

mixins.UpdateModelMixin,

mixins.DestroyModelMixin,

mixins.ListModelMixin,

GenericViewSet):pass

继承了mixins下的一些类,封装了list,create,update等方法

和GenericViewSet

# 48. 简述 django rest framework框架的认证流程

1.用户请求走进来后,走APIView,初始化了默认的认证方法

2.走到APIView的dispatch方法,initial方法调用了request.user

3.若是咱们配置了认证类,走咱们本身认证类中的authentication方法

# 49. django rest framework如何实现的用户访问频率控制

使用IP/用户帐号做为键,每次的访问时间戳做为值,构造一个字典形式的数据,存起来,每次访问时对时间戳列表的元素进行判断,

把超时的删掉,再计算列表剩余的元素数就能作到频率限制了

匿名用户:使用IP控制,可是没法彻底控制,由于用户能够换代理IP登陆用户:使用帐号控制,可是若是有不少帐号,也没法限制

# 50. rest_framework序列化组件的做用,以及一些外键关系的钩子方法

做用:帮助咱们序列化数据

1.choices get_字段名_display

2.ForeignKey source=orm 操做

3.ManyToManyFiled SerializerMethodField()

def get_字段名():

return 自定义

# 51. 给用户提供一个接口以前须要提早作什么

1.跟前端进行和交互,肯定前端要什么

2.把需求写个文档保存

# 52. PV和UV

1.pv:页面访问量,没打开一次页面PV计算+1,页面刷新也是

2.UV:独立访问数,一台电脑终端为一个访客

# 53. 什么是跨域以及解决方法:

跨域:

浏览器从一个域名的网页去请求另外一个域名的资源时,浏览器处于安全的考虑,不容许不一样源的请求

同源策略:

协议相同

域名相同

端口相同

处理方法:

1.经过JSONP跨域

JSON是一种数据交换格式

JSONP是一种非官方的跨域数据交互协议

jsonp是包含在函数调用中的json

script标签不受同源策略的影响,手动建立一个script标签,传递URL,同时传入一个回调函数的名字

服务器获得名字后,返回数据时会用这个函数名来包裹住数据,客户端获取到数据以后,当即把script标签删掉

2.cors:跨域资源共享

使用自定义的HTTP头部容许浏览器和服务器相互通讯

1.若是是简单请求,直接设置容许访问的域名:

容许你的域名来获取个人数据

response['Access-Control-Allow-Origin'] = "*"

2.若是是复杂请求,首先会发送options请求作预检,而后再发送真正的PUT/POST....请求

所以若是复杂请求是PUT等请求,则服务端须要设置容许某请求

若是复杂请求设置了请求头,则服务端须要设置容许某请求头

简单请求:

一次请求

非简单请求:

两次请求,在发送数据以前会先发一次请求用于作“预检”,

只有“预检”经过后才再发送一次请求用于数据传输。

只要同时知足如下两大条件,就属于简单请求。

(1) 请求方法是如下三种方法之一:HEAD GET POST

(2)HTTP的头信息不超出如下几种字段:

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、 text/plain

JSONP和CORS:

1.JSONP只能实现GET请求,而CORS支持全部类型的HTTP请求

2.jsonp须要client和server端的相互配合

3.cors在client端无需设置,server端须要针对不一样的请求,来作head头的处理

# 54. 如何实现用户的登录认证

1.cookie session

2.token 登录成功后生成加密字符串

3.JWT:json wed token缩写 它将用户信息加密到token中,服务器不保存任何用户信息

服务器经过使用保存的密钥来验证token的正确性

# 55. 如何将dict转换成url的格式:

使用urlencode

from urllib.parse import urlencode

post_data={"k1":"v1","k2":"v2"}

ret=urlencode(post_data)

print(ret,type(ret)) #k1=v1&k2=v2 <class 'str'>

```redis

相关文章
相关标签/搜索