1. Django ORM查询中select_related和prefetch_related的区别??
def select_related(self, *fields)
性能相关:表之间进行join连表操作,一次性获取关联的数据。
总结:
1. select_related主要针一对一和多对一关系进行优化。
2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。
def prefetch_related(self, *lookups)
性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。
总结:
1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。
2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。
2. Django ORM是什么?
对象关系映射,通过models中的类来对应数据库中的一个表,一个对象对应一个数据行,一个属性对应数据库中的一个字段
3. Django创建项目的命令?
django-admin startproject 项目名称
python manage.py startapp 应用 app 名
4. Django 创建项目后,项目文件夹下的组成部分(对mvt 的理解)?
项目文件夹下的组成部分:
manage.py 是项目运行的入口,指定配置文件路径。
与项目同名的目录,包含项目的配置文件。
__init__
.py 是一个空文件,作用是这个目录可以被当作包使用,也可以做一些初始化操作。
settings.py 是项目的整体配置文件。
urls.py 是项目的 URL 配置文件。
wsgi.py 是项目与 WSGI 兼容的 Web 服务器。
5. 对 MVC,MVT解读的理解?
M:Model,模型,和数据库进行交互
V:View,视图,负责产生Html页面
C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答。
1、 用户点击注按钮,将要注册的信息发送给网站服务器。
2、 Controller控制器接收到用户的注册信息,Controller会告诉Model层将用户的注册信息保存到数据库
3、 Model层将用户的注册信息保存到数据库
4、 数据保存之后将保存的结果返回给Model模型,
5、 Model层将保存的结果返回给Controller控制器。
6、 Controller控制器收到保存的结果之后,或告诉View视图,view视图产生一个html页面。
7、 View将产生的Html页面的内容给了Controller控制器。
8、 Controller将Html页面的内容返回给浏览器。
9、 浏览器接受到服务器Controller返回的Html页面进行解析展示。
M:Model,模型,和MVC中的M功能相同,和数据库进行交互。
V:view,视图,和MVC中的C功能相同,接收请求,进行处理,与M和T进行交互,返回应答。
T:Template,模板,和MVC中的V功能相同,产生Html页面
1、 用户点击注册按钮,将要注册的内容发送给网站的服务器。
2、 View视图,接收到用户发来的注册数据,View告诉Model将用户的注册信息保存进数据库。
3、 Model层将用户的注册信息保存到数据库中。
4、 数据库将保存的结果返回给Model
5、 Model将保存的结果给View视图。
6、 View视图告诉Template模板去产生一个Html页面。
7、 Template生成html内容返回给View视图。
8、 View将html页面内容返回给浏览器。
9、 浏览器拿到view返回的html页面内容进行解析,展示。
6. Django中models利用ORM对Mysql进行查表的语句(多个语句)?
字段查询
all():返回模型类对应表格中的所有数据。
get():返回表格中满足条件的一条数据,如果查到多条数据,则抛异常:MultipleObjectsReturned,
查询不到数据,则抛异常:DoesNotExist。
filter():参数写查询条件,返回满足条件 QuerySet 集合数据。
条件格式:
模型类属性名__条件名=值
注意:此处是模型类属性名,不是表中的字段名
关于 filter 具体案例如下:
判等 exact。
BookInfo.object.filter(id=1)
BookInfo.object.filter(id__exact=1)此处的__exact 可以省略
模糊查询 like
例:查询书名包含'传'的图书。contains
1. contains BookInfo.objects.filter(btitle__contains=’传’)
空查询 where 字段名 isnull
1. BookInfo.objects.filter(btitle__isnull=False)
范围查询 where id in (1,3,5)
1. BookInfo.objects.filter(id__in=[1,3,5])
比较查询 gt lt(less than) gte(equal) lte
1. BookInfo.objects.filter(id__gte=3)
日期查询
1. BookInfo.objects.filter(bpub_date__year = 1980)
2. BookInfo.objects.filter(bpub_date__gt = date(1980,1,1))
exclude:返回不满足条件的数据。
3. BookInfo.objects.exclude(id=3)
F 对象
作用:用于类属性之间的比较条件。
1. from django.db.models import F
2. 例:where bread > bcomment BookInfo.objects.filter(bread__gt =F(‘bcomment’))
3. 例:BookInfo.objects.filter(bread__gt=F(‘bcomment’)*2)
Q 对象
作用:用于查询时的逻辑条件。可以对 Q 对象进行&|~操作。
1. from django.db.models import Q
2. BookInfo.objects.filter(id__gt=3, bread__gt=30)
3. BooInfo.objects.filter(Q(id__gt=3) & Q(bread__gt=3))
4. 例:BookInfo.objects.filter(Q(id__gt=3) | Q(bread__gt=30))
5. 例:BookInfo.objects.filter(~Q(id=3))
order_by 返回 QuerySet
作用:对查询结果进行排序。
1. 例: BookInfo.objects.all().order_by('id')
2. 例: BookInfo.objects.all().order_by('-id')
3. 例:BookInfo.objects.filter(id__gt=3).order_by('-bread')
聚合函数
作用:对查询结果进行聚合操作。
1. sum count max min avg
aggregate:调用这个函数来使用聚合。
1. from django.db.models import Sum,Count,Max,Min,Avg
2. 例:BookInfo.objects.aggregate(Count('id'))
{'id__count': 5} 注意返回值类型及键名
1. 例:BookInfo.objects.aggregate(Sum(‘bread’))
{‘bread__sum’:120} 注意返回值类型及键名
count 函数
作用:统计满足条件数据的数目。
例:统计所有图书的数目。
1. BookInfo.objects.all().count()
例:统计 id 大于 3 的所有图书的数目。
1. BookInfo.objects.filter(id__gt = 3).count()
模型类关系
一对多关系
例:图书类-英雄类
models.ForeignKey() 定义在多的类中。
2)多对多关系
例:新闻类-新闻类型类
models.ManyToManyField() 定义在哪个类中都可以。
3)一对一关系
例:员工基本信息类-员工详细信息类
models.OneToOneField() 定义在哪个类中都可以。
7. django中间件的使用?
面试官问你Django中间件的时候,我们不应该只是局限于面试官的问题,而应做到举一反三。
面试之前准备一些白纸,在问到一些问题的时候应该用画图的形式展示出来
比如这里问到Django的中间件,我们应该给面试官画出Django的生命周期整体流程图,把中间件作为一部分的回答内容,
这样的好处在于,即展示了你对Django从前到后的流程都很熟悉又回答了面试官的问题,还顺带秀了一把其他技能,一举两得。
中间件介绍:作为Django的门户,一切请求都会先经过中间件才会到达Django后端,所以中间件可以用来做全局方面的一些功能
详细:给我们定义了五个方法
1.def process_request(request):
pass
2.def process_view(request):
pass
3.def process_template_response(request):
pass
4.def process_exception(request):
pass
5.def process_response(request):
pass
这些内容应该做到快速回答,不要"慢条斯理"的,搞IT的都很忙好吧,知识点一定要掌握牢固,脱口而出
一定要记住你是需要在有限的时间内将自己的看家本领不遗余力的倾囊而出
8. 谈一下你对uWSGI和 nginx的理解?
1.uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
WSGI是一种通信协议。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
2. nginx是一个开源的高性能的HTTP服务器和反向代理:
1.作为web服务器,它处理静态文件和索引文件效果非常高;
2.它的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间;
3.稳定性高,配置简洁;
4.强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用。
9. 说说nginx和uWISG 服务器之间如何配合工作的?
首先浏览器发起http请求到nginx服务器,Nginx根据接收到请求包,进行url分析,判断访问的资源类型,如果是静态资源,直接读取静态资源返回给浏览器,如果请求的是动态资源就转交给uwsgi服务器,uwsgi服务器根据自身的uwsgi和WSGI协议,找到对应的Django框架,Django框架下的应用进行逻辑处理后,将返回值发送到uwsgi服务器,然后uwsgi服务器再返回给nginx,最后nginx将返回值返回给浏览器进行渲染显示给用户。 如果可以,画图讲解效果更佳,可以 将下面的图画给面试官。
10. django开发中数据库做过什么优化?
1.设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能;
2.使用缓存,减少对数据库的访问;
3.在orm框架下设置表时,能用varchar确定字段长度时,就别用text;
4.可以给搜索频率高的字段属性,在定义时创建索引;
5.Django orm框架下的Querysets 本来就有缓存的;
6.如果一个页面需要多次连接数据库,最好一次性取出所有需要的数据,减少对数据库的查询次数;
7.若页面只需要数据库里某一个两个字段时,可以用QuerySet.values();
8.在模板标签里使用with标签可以缓存Qset的查询结果。
11. 验证码过期时间怎么设置?
将验证码保存到数据库或session,设置过期时间为1分钟,然后页面设置一个倒计时(一般是前端js实现 这个计时)的展示,一分钟过后再次点击获取新的信息。
12. Python中三大框架各自的应用场景?
- django:主要是用来搞快速开发的,他的亮点就是快速开发,节约成本,正常的并发量不过10000,如果要实现高并发的话,就要对django进行二次开发,比如把整个笨重的框架给拆掉,自己写socket实现http的通信,底层用纯c,c++写提升效率,ORM框架给干掉,自己编写封装与数据库交互的框
架,因为啥呢,ORM虽然面向对象来操作数据库,但是它的效率很低,使用外键来联系表与表之间的查询; - flask:轻量级,主要是用来写接口的一个框架,实现前后端分离,提升开发效率,Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验
证等。Flask没有默认使用的数据库,你可以选择MySQL,也可以NoSQL。
其 WSGI 工具箱采用 Werkzeug(路由模块),模板引擎则使用 Jinja2。这两个也是Flask框架的核心。Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。 - Tornado: Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。 得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。
13. django如何提升性能(高并发)?
对一个后端开发程序员来说,提升性能指标主要有两个一个是并发数,另一个是响应时间网站性能的优化一般包括web前端性能优化,应用服务器性能优化,存储服务器优化。
对前端的优化主要有:
1.减少http请求,减少数据库的访问量,比如使用雪碧图。
2.使用浏览器缓存,将一些常用的css,js,logo图标,这些静态资源缓存到本地浏览器,通过设置http头中的cache-control和expires的属性,可设定浏览器缓存,缓存时间可以自定义。
3.对html,css,javascript文件进行压缩,减少网络的通信量。
对我个人而言,我做的优化主要是以下三个方面:
1.合理的使用缓存技术,对一些常用到的动态数据,比如首页做一个缓存,或者某些常用的数据做
个缓存,设置一定得过期时间,这样减少了对数据库的压力,提升网站性能。
2.使用celery消息队列,将耗时的操作扔到队列里,让worker去监听队列里的任务,实现异步操
作,比如发邮件,发短信。
3.就是代码上的一些优化,补充:nginx部署项目也是项目优化,可以配置合适的配置参数,提升效率,增加并发量。
4.如果太多考虑安全因素,服务器磁盘用固态硬盘读写,远远大于机械硬盘,这个技术现在没有普及,主要是固态硬盘技术上还不是完全成熟, 相信以后会大量普及。
5.另外还可以搭建服务器集群,将并发访问请求,分散到多台服务器上处理。
6.最后就是运维工作人员的一些性能优化技术了。
14. 什么是restful api,谈谈你的理解?
上来先给面试官扔出一手Django的restgramework源码(这一块知识课下一定要自己看着源码走三遍做到烂熟于心,看着面试官的眼睛快速自信的说出。这一手源码扔出来之后,面试已经成功一半)
REST:Representational State Transfer的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。
REST是设计风格而不是标准。是指客户端和服务器的交互形式。我们需要关注的重点是如何设计REST风格的网络接口。
REST的特点:
1.具象的。一般指表现层,要表现的对象就是资源。比如,客户端访问服务器,获取的数据就是资源。比如文字、图片、音视频等。
2.表现:资源的表现形式。txt格式、html格式、json格式、jpg格式等。浏览器通过URL确定资源的位置,但是需要在HTTP请求头中,用AcceptContent-Type字段指定,这两个字段是对资源表现的描述。
3.状态转换:客户端和服务器交互的过程。在这个过程中,一定会有数据和状态的转化,这种转化叫做状态转换。其中,GET表示获取资源,POST表示新建资源,PUT表示更新资源,DELETE表示删除资源。HTTP协议中最常用的就是这四种操作方式。
RESTful架构:
1.每个URL代表一种资源;
2.客户端和服务器之间,传递这种资源的某种表现层;
3.客户端通过四个http动词,对服务器资源进行操作,实现表现层状态转换。
15.如何设计符合 RESTful 风格的 API
一、域名:
将api部署在专用域名下:
http://api.example.com
或者将api放在主域名下:
http://www.example.com/api/
二、版本:
将API的版本号放在url中。
http://www.example.com/app/1.0/info
http://www.example.com/app/1.2/info
三、路径:
路径表示API的具体网址。每个网址代表一种资源。 资源作为网址,网址中不能有动词只能有名词,一般名词要与数据库的表名对应。而且名词要使用复数。
错误示例:
http://www.example.com/getGoods
http://www.example.com/listOrders
正确示例:
获取单个商品
http://www.example.com/app/goods/1
获取所有商品
http://www.example.com/app/goods
四、使用标准的HTTP方法:
对于资源的具体操作类型,由HTTP动词表示。 常用的HTTP动词有四个。
GET SELECT :从服务器获取资源。
POST CREATE :在服务器新建资源。
PUT UPDATE :在服务器更新资源。
DELETE DELETE :从服务器删除资源。
示例:
获取指定商品的信息
GET http://www.example.com/goods/ID
新建商品的信息
POST http://www.example.com/goods
更新指定商品的信息
PUT http://www.example.com/goods/ID
删除指定商品的信息
DELETE http://www.example.com/goods/ID
五、过滤信息:
如果资源数据较多,服务器不能将所有数据一次全部返回给客户端。API应该提供参数,过滤返回结果。 实例:
指定返回数据的数量
http://www.example.com/goods?limit=10
指定返回数据的开始位置
http://www.example.com/goods?offset=10
指定第几页,以及每页数据的数量
http://www.example.com/goods?page=2&per_page=20
六、状态码:
服务器向用户返回的状态码和提示信息,常用的有:
200 OK :服务器成功返回用户请求的数据
201 CREATED :用户新建或修改数据成功。
202 Accepted:表示请求已进入后台排队。
400 INVALID REQUEST :用户发出的请求有错误。
401 Unauthorized :用户没有权限。
403 Forbidden :访问被禁止。
404 NOT FOUND :请求针对的是不存在的记录。
406 Not Acceptable :用户请求的的格式不正确。
500 INTERNAL SERVER ERROR :服务器发生错误。
七、错误信息:
一般来说,服务器返回的错误信息,以键值对的形式返回。
{
error: 'Invalid API KEY'
}
八、响应结果:
针对不同结果,服务器向客户端返回的结果应符合以下规范。
返回商品列表
GET http://www.example.com/goods
返回单个商品
GET http://www.example.com/goods/cup
返回新生成的商品
POST http://www.example.com/goods
返回一个空文档
DELETE http://www.example.com/goods
九、使用链接关联相关的资源:
在返回响应结果时提供链接其他API的方法,使客户端很方便的获取相关联的信息。
十、其他:
服务器返回的数据格式,应该尽量使用JSON,避免使用XML。
21. django关闭浏览器,怎样清除 cookies 和 session?
设置Cookie
1. def cookie_set(request):
2. response = HttpResponse("<h1>设置Cookie,请查看响应报文头</h1>")
3. response.set_cookie('h1', 'hello django')
4. return response
读取Cookie
1. def cookie_get(request):
2. response = HttpResponse("读取Cookie,数据如下:<br>")
3. if request.COOKIES.has_key('h1'):
4. response.write('<h1>' + request.COOKIES['h1'] + '</h1>')
5. return response
以键值对的格式写会话。
1. request.session['键']=值
根据键读取值。
1. request.session.get('键',默认值)
清除所有会话,在存储中删除值部分。
1. request.session.clear()
清除会话数据,在存储中删除会话的整条数据。
1. request.session.flush()
删除会话中的指定键及值,在存储中只删除某个键及对应的值。
1. del request.session['键']
设置会话的超时时间,如果没有指定过期时间则两个星期后过期。
如果value是一个整数,会话将在value秒没有活动后过期。
如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
如果value为None,那么会话在两周后过期。
1. request.session.set_expiry(value)
Session 依赖于 Cookie,如果浏览器不能保存 cookie 那么 session 就失效了。因为它需要浏览器的 cookie 值去 session 里做对比。session就是用来在服务器端保存用户的会话状态。
cookie 可以有过期时间,这样浏览器就知道什么时候可以删除 cookie了。 如果 cookie 没有设置过期时间,当用户关闭浏览器的时候,cookie 就自动过期了。你可以改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制session 框架的这一行为。缺省情况下, SESSION_EXPIRE_AT_BROWSER_CLOSE设置为 False ,这样,会话 cookie 可以在用户浏览器中保持有效达SESSION_COOKIE_AGE 秒(缺省设置是两周,即 1,209,600 秒)如果你不想用户每次打开浏览器都必须重新登陆的话,用这个参数来帮你。如果SESSION_EXPIRE_AT_BROWSER_CLOSE
设置为 True,当浏览器关闭时,Django 会使 cookie 失效。
SESSION_COOKIE_AGE:设置 cookie 在浏览器中存活的时间。
22. 有用过Django REST framework 吗?
面试就喜欢面试官问这种问题,前面就已经说过了,这种问题一提出来,我们内心是高兴的一笔的,正好将我们学的Django restframework源码带面试官走一波,之后可以再补充一点Django的其他源码,比如ORM源码,settings源码,
admin源码...最后一定要记住,你要展示出你不仅阅读过源码还基于源码在自己的实际项目中参考借鉴过。如果把面试比作考试题满分100的话,这一题就是送分的30分大题!!!
23. Celery分布式任务队列?
情景:用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等。 使用celery后,情况就不一样了。解决:将耗时的程序放到celery中执行。将多个耗时的任务添加到队列queue中,也就是用redis实现broker中间人,然后用多个worker去监听队列 里的任务去执行。
- 任务task:就是一个Python函数。
- 队列queue:将需要执行的任务加入到队列中。
- 工人worker:在一个新进程中,负责执行队列中的任务。
- 代理人broker:负责调度,在布置环境中使用redis。
正向代理:请求经过代理服务器从局域网发出,然后到达互联网上的服务器。
特点:服务端并不知道真正的客户端是谁。
反向代理:请求从互联网发出,先进入代理服务器,再转发给局域网内的服务器。
特点:客户端并不知道真正的服务端是谁。
区别:正向代理的对象是客户端。反向代理的对象是服务端。
24. 简述Django下的(内建的)缓存机制?
Django提供6种缓存方式:
开发调试
内存
文件
数据库
Memcache缓存(python-memcached模块)
Memcache缓存(pylibmc模块)
除此之外还可使用redis缓存
由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,
最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内(默认配置)再有人来访问时,
则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。
这里可以向面试官介绍一下前面提到的Django中间件配合缓存协同工作的机制
25. 对cookie与session的了解?他们能单独用吗?
首先需要搞清楚的是session是存储在服务器上的,cookie是存储在客户端浏览器上的两者是相辅相成的用户首次访问服务器,服务器会为每个用户单独创建一个session对象(HttpSession),
并为每个session分配唯一一个id(sessionId),sessionId通过cookie保存到用户端,当用户再次访问服务器时,需将对应的sessionId携带给服务器,服务器通过这个唯一sessionId就可以找到用户对应的session对象,从而达到管理用户状态
26. Django里QuerySet的get和filter方法的区别?
1) 输入参数
get 的参数只能是model中定义的那些字段,只支持严格匹配。
filter的参数可以是字段,也可以是扩展的 where查询关键字,如 in,like 等。
2) 返回值
get返回值是一个定义的 model 对象。
filter返回值是一个新的 QuerySet 对象,然后可以对 QuerySet 在进行查询返回新的 QuerySet 对象,支持链式操作,QuerySet 一个集合对象,可使用迭代或者遍历,切片等,但是不等于 list 类型(使用一定要注意)。
3) 异常
get只有一条记录返回的时候才正常,也就说明 get 的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常。 filter 有没有匹配的记录都可以
27. django 中当一个用户登录 A 应用服务器(进入登录状态),然后下次请求被 nginx 代理到 B 应用服务器会出现什么影响?
如果用户在A应用服务器登陆的session数据没有共享到B应用服务器,那么之前的登录状态就没有了。
1.安装django-cors-headers,之后在settings.py中配置
pip install django-cors-headers
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware', # 注意顺序
...
)
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
'*'
)
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)
2.使用JSONP
使用Ajax获取json数据时,存在跨域的限制。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。因此,我们需要将Ajax调用中的dataType从JSON改为JSONP(相应的API也需要支持JSONP)格式。
JSONP只能用于GET请求。
3.直接修改Django中的views.py文件
修改views.py中对应API的实现函数,允许其他域通过Ajax请求数据:
def myview(_request):
response = HttpResponse(json.dumps({“key”: “value”, “key2”: “value”}))
response[“Access-Control-Allow-Origin”] = “*”
response[“Access-Control-Allow-Methods”] = “POST, GET, OPTIONS”
response[“Access-Control-Max-Age”] = “1000”
response[“Access-Control-Allow-Headers”] = “*”
return response
28. Django对数据查询结果排序怎么做,降序怎么做,查询大于某个字段怎么做?
- 排序使用order_by()
- 降序需要在排序字段名前加-
- 查询字段大于某个值:使用filter(字段名_gt=值)
更多骚操作:
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
models.Tb1.objects.filter(name__contains="ven") # 获取name字段包含"ven"的
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.filter(id__range=[1, 3]) # id范围是1到3的,等价于SQL的bettwen and
类似的还有:startswith,istartswith, endswith, iendswith
date字段还可以:
models.Class.objects.filter(first_day__year=2017)
29. 生成迁移文件和执行迁移文件的命令是什么?
python manage.py makemigrations
python manage.py migrate
30.uWSGI与uwsgi区别
uWSGI是一个 Web 服务器,它实现了WSGI 协议、uwsgi、http 等协议。注意 uwsgi 是一种通信协议,而 uWSGI 是实现 uwsgi 协议和 WSGI 协议的Web 服务器。uWSGI 具有超快的性能、低内存占用和多app 管理等优点,并且搭配着 Nginx就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能。
31.apache和nginx的区别?(2018-4-16-lxy)
Nginx相对Apache的优点:
轻量级,同样起web 服务,比apache 占用更少的内存及资源;
抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发连接,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能; 配置简洁; 高度模块化的设计,编写模块相对简单;
社区活跃。
Apache相对Nginx的优点:
rewrite ,比nginx 的rewrite 强大;
模块超多,基本想到的都可以找到;
少bug ,nginx 的bug 相对较多; 超稳定。
32. git 常用命令? (2018-4-23-lxy)
- git clone 克隆指定仓库
- git status 查看当前仓库状态
- git diff 比较版本的区别
- git log 查看 git 操作日志
- git reset 回溯历史版本
- git add 将文件添加到暂存区
- git commit 将文件提交到服务器
- git checkout 切换到指定分支
- git rm 删除指定文件
(命令好记,实际操作就相对较难,平时应有意识地去锻炼使用git管理我们的代码仓库)
33. 什么是gitlab,github和gitlab的区别?
公司开始把代码从GitHub上迁移到GitLab上,在使用一段时间过后,发现GitLab与GitHub还是有不少区别的。
先说一下相同点,二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。
GitHub作为开源代码库及版本控制系统,拥有超过900万的开发者用户,目前仍然是最火的开源项目托管系统。GitHub同时提供公共仓库和私有仓库,但如果要使用私有仓库,是需要付费的。
而GitLab解决了这个问题,你可以在上面创建私人的免费仓库。
GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有不少的特色:
允许免费设置仓库权限;允许用户选择分享一个project的部分代码;允许用户设置project的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过innersourcing让不在权限范围内的人访问不到该资源。
从代码私有性方面来看,有时公司并不希望员工获取到全部的代码,这个时候GitLab无疑是更好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。
公司开始把代码从GitHub上迁移到GitLab上,在使用一段时间过后,发现GitLab与GitHub还是有不少区别的。
先说一下相同点,二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。
GitHub作为开源代码库及版本控制系统,拥有超过900万的开发者用户,目前仍然是最火的开源项目托管系统。GitHub同时提供公共仓库和私有仓库,但如果要使用私有仓库,是需要付费的。
而GitLab解决了这个问题,你可以在上面创建私人的免费仓库。
GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有不少的特色:
允许免费设置仓库权限;允许用户选择分享一个project的部分代码;允许用户设置project的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过innersourcing让不在权限范围内的人访问不到该资源。
从代码私有性方面来看,有时公司并不希望员工获取到全部的代码,这个时候GitLab无疑是更好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。
34. git中 .gitignore文件的作用?
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
35. HttpRequest和HttpResponse是什么?干嘛用的?
HttpRequest是django接受用户发送多来的请求报文后,将报文封装到HttpRequest对象中去。
HttpResponse 返回的是一个应答的数据报文。render内部已经封装好了HttpResponse类。
视图的第一个参数必须是HttpRequest对象,两点原因:表面上说,他是处理web请求的,所以必须是请求对象,根本上说,他是基于请求的一种web框架,所以,必须是请求对象。 因为view处理的是一个request对象,请求的所有属性我们都可以根据对象属性的查看方法来获取具体的信息:格式:request.属性
request.path 请求页面的路径,不包含域名
request.get_full_path 获取带参数的路径
request.method 页面的请求方式
request.GET GET 请求方式的数据
request.POST POST请求方式的数据
request.COOKIES 获取cookie
request.session 获取session
request.FILES 上传图片(请求页面有enctype="multipart/form-data"属性时FILES才有数据)
36. 什么是反向解析
使用场景:模板中的超链接,视图中的重定向
使用:在定义url时为include定义namespace属性,为url定义name属性
在模板中使用url标签:{% url 'namespace_value:name_value'%}
在视图中使用reverse函数:redirect(reverse('namespce_value:name_value’))
根据正则表达式动态生成地址,减轻后期维护成本。
注意反向解析传参数,主要是在我们的反向解析的规则后面天界了两个参数,两个参数之间使用空格隔开:位置参数
37.列举常见的请求方法。
GET 请求指定的页面信息,并返回实体主体。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
38.列举常见的状态码。
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态码:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
更多状态码http://www.runoob.com/http/http-status-codes.html
39.http 和 https 的区别?
http的中文叫做超文本传输协议,它负责完成客户端到服务端的一系列操作,是专门用来传输注入HTML的超媒体文档等web内容的协议,它是基于传输层的TCP协议的应用层协议
https:https是基于安全套接字的http协议,也可以理解为是http+ssl/tls(数字证书)的组合
http和https的区别:
HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头
HTTP 是不安全的,而 HTTPS 是安全的
HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443
在 OSI 网络模型中,HTTPS的加密是在传输层完成的,因为SSL是位于传输层的,TLS的前身是SSL,所以同理
HTTP无需认证证书,而https需要认证证书
40.简述 websocket 协议及实现原理。
websocket是一种在单个TCP连接上进行全双工通讯的协议,双工(duplex)是指两台通讯设备之间,允许有双向的资料传输。全双工的是指,允许两台设备间同时进行双向资料传输。这是相对于半双工来说的,半双工不能同时进行双向传输,这期间的区别相当于手机和对讲机的区别,手机在讲话的同时也能听到对方说话,对讲机只能一个说完另一个才能说。
41.django 中如何实现 websocket?
django实现websocket大致上有两种方式,一种channels,一种是dwebsocket。channels依赖于redis,twisted等,相比之下使用dwebsocket要更为方便一些。
安装
# pip install dwebsocket
配置:
# setting.py
INSTALLED_APPS = [
.....
.....
'dwebsocket',
]
MIDDLEWARE_CLASSES = [
......
......
'dwebsocket.middleware.WebSocketMiddleware' # 为所有的URL提供websocket,如果只是单独的视图需要可以不选
]
WEBSOCKET_ACCEPT_ALL=True # 可以允许每一个单独的视图实用websockets
简单使用:
模拟文件下载的简单示例
from dwebsocket.decorators import accept_websocket
@accept_websocket
def test(request):
if not request.is_websocket(): # 判断是不是websocket连接
return render(request, 'websocket.html')
else:
download = Haproxy()
t = threading.Thread(target=download.run)
t.start()
sent = []
while download.status:
if len(download.res_dict) > len(sent):
for i in download.res_dict.keys():
if i not in sent:
sent.append(i)
request.websocket.send(str(sent[-1]+str(download.res_dict[sent[-1]])).encode('utf-8')) # 发送消息到客户端
if not download.status:
request.websocket.send('下载完成'.encode('utf-8'))
dwebsocket有两种装饰器:require_websocket和accept_websocekt,使用require_websocket装饰器会导致视图函数无法接收导致正常的http请求,一般情况使用accept_websocket方式就可以了,
dwebsocket的一些内置方法:
request.is_websocket():判断请求是否是websocket方式,是返回true,否则返回false
request.websocket: 当请求为websocket的时候,会在request中增加一个websocket属性,
WebSocket.wait() 返回客户端发送的一条消息,没有收到消息则会导致阻塞
WebSocket.read() 和wait一样可以接受返回的消息,只是这种是非阻塞的,没有消息返回None
WebSocket.count_messages()返回消息的数量
WebSocket.has_messages()返回是否有新的消息过来
WebSocket.send(message)像客户端发送消息,message为byte类型
42.Python web 开发中, 跨域问题的解决思路是?
# 方案1.安装django-cors-headers
pip install django-cors-header
配置settings.py文件
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware', # 注意顺序
...
)
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
'*'
)
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
'Pragma',
)
# 方案2.使用JSONP
使用Ajax获取json数据时,存在跨域的限制。不过,在Web页面上调用js的script脚本文件时却不受跨域的影响,JSONP就是利用这个来实现跨域的传输。因此,我们需要将Ajax调用中的dataType从JSON改为JSONP(相应的API也需要支持JSONP)格式。
JSONP只能用于GET请求。
# 方案3.直接修改Django中的views.py文件
修改views.py中对应API的实现函数,允许其他域通过Ajax请求数据:
def myview(_request):
response = HttpResponse(json.dumps({“key”: “value”, “key2”: “value”}))
response[“Access-Control-Allow-Origin”] = “*”
response[“Access-Control-Allow-Methods”] = “POST, GET, OPTIONS”
response[“Access-Control-Max-Age”] = “1000”
response[“Access-Control-Allow-Headers”] = “*”
return response
43.什么是wsgi?
WSGI的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口。具体的来说,WSGI是一个规范,定义了Web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。
44.列举django的内置组件?
.Admin是对model中对应的数据表进行增删改查提供的组件
.model组件:负责操作数据库
.form组件:1.生成HTML代码2.数据有效性校验3校验信息返回并展示
.ModelForm组件即用于数据库操作,也可用于用户请求的验证
45.django 中 model 的 SlugField 类型字段有什么用途
SlugField 本质上相当于存放字符串,但是在意义上,主要用于把某些字段形成语义化的,可以访问的短网址(slug)字符串。