31, 在视图函数中,常见的装饰器有哪些?
django.views.decorators.csrf_exempt: 绕过csrf保护
django.views.decorators.http.require_GET: 限定请求方式为get请求
django.views.decorators.http.require_POST: 限定请求方式为post请求
django.views.decorators.http.require_http_methods: 设置限定的请求方式
django.views.decorators.cache.cache: 设置请求
django.util.decorators.method_decorator: 在CBV中类函数中使用装饰器
django.db.transaction.atomic: 保证视图函数事务完整性
32,wsgi和uwsgi的区别
wsgi全名(Python Web service Getway interface)是为python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。也可以认为WSGI是一种通信协议。
uWSGI 是一个服务器,它实现了WSGI协议, uWSGI,HTTP等协议。nginx中HttpUwsgiModule 的作用是与uWSGI服务器进行交换。
33,QuerySet 两大特性
惰性执行
创建查询集不会访问数据库,直接调用数据时,才会访问数据库,调用数据的情况包括迭代,序列化与if 合用
缓存
使用同一个查询集,第一次使用时会发生数据库查询,然后Django 会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少数据库的查询次数。
34, 简述什么是FBV和CBV
FBV(function base views)就是在视图中使用函数处理请求。
CBV(class base views ) 就是在视图里使用类处理请求
python 是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承,封装,多态)。所以Django在后来加入Class-Based-View.可以让我们用类写View。这样做的优点主要有以下两种:
1,提高代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
2,可以使用不同的函数针对不同的HTTP 方法处理,而不是通过很多if判断,提高代码课可读性f
35, selected_related 与 prefetch_related有什么区别
在django中,所有的Queryset 都是惰性的,意思是当创建一个查询集的时候,并没有跟数据库发生任何交互。因此我们可以对查询集进行级联的filter等操作,只有在访问Queryset的内容的时候,django才会真正进行数据库的访问。而多频率,复杂的数据库查询往往是性能问题最大的根源。
不过我们实际开发中,往往需要访问到外键对象的其他属性。如果按照默认的查询方式去遍历取值,那么会造成多次的数据库查询,效率可想而知。
在查询对象集合的时候,把指定的外键对象也一并完整查询加载,避免后续的重复查询
1,select_related 适用于外键和多对一的关系查询
2, prefetch_reated适用于一对多或者多对多的查询
36, session 与 cookie的区别
存储位置:session在服务器中,cookie是在客户端
存储数据大小: session无限制, cookie不同浏览器都会有不同的限制, 大概几KB
安全性:session更安全, cookie在本地容易泄露, 一般需要加密
性能:数据如果全部存在session会造成服务器性能下降,可以选择部分数据使用cookie存到客户端
37, 对django的认识
1, django是走大而全的方向, 它最出名的是其全自动化的管理后台:只需要使用起ORM, 做简单的对象定义,它就能自动生成数据库结构,以及全功能的管理后台。
2, django内置的ORM跟框架内的其他模板耦合程度高。
应用程序必须使用django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM的便利:
理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛坯房做全新的装修。
3,django的卖点就是超高的开发效率,其性能扩展有限;采用django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能要求。
4, django适用的是中小型的网站,或者作为大型网站快速实现产品雏形的工具。
5, django模板的设计哲学就是彻底的将代码,样式分离;django从根本上杜绝在模板中进行编码,处理数据的可能。
38, django, flask, tornado的对比
1,django走的是大而全的方向,开发效率高。它的MTV框架,自带ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器给开发者提高了超高的开发效率。
2, Flask是轻量级的框架,自由,灵活,可扩展性很强,核心基于Werkzeug WSGI 工具和jinja2模板引擎。
3, Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式
Tornado的两大核心模块:
iostraem:对非阻塞式的socket进行简单的封装
ioloop:对I/O多路复用的封装,它实现了一个单例
39, QuerySet对象的常用方法
all():查询所有结果
filter(**kwargs): 它包含了所给筛选条件相匹配的对象。获取不到返回None
get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个。获取不到会报错。
如果符合筛选条件的对象超过一个或者没有都会抛出错误。
exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象。
order_by(*field): 对查询结果排序
reverse():对查询结果反向排序
count():返回数据库中匹配查询的对象数量
first():返回第一条记录
exists():如果QuerySet包含数据,就返回True,否则返回False
values(*field): 返回一个ValueQuerySet ------一个特使的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
values_list(*field):它与values()非常相似,它返回的是一个元组序列,value返回的是一个字典序列
disrinct():从返回结果中剔除重复记录
40, filter和exclude的区别
取到的值都是QuerySet对象,filter选择满足条件的,exclude排除满足条件的。