面试题--web(django)

django

  1. django建立项目的命令?
    django-admin startproject 项目名称
    python manage.py startapp  应用app名
  2. django建立项目后,项目文件夹下的组织部分(对mvt的理解)?

    项目文件夹下的组成部分:
    manage.py 是项目运行的入口,指定配置文件路径。
    与项目同名的目录,包含项目的配置文件。
    ___init.py 是一个空文件,做用是这个目录能够被看成包使用。
    settings.py 是项目的总体配置文件。
    urls.py 是项目的URL 配置文件。
    wsgi.py 是项目与WSGI 兼容的Web 服务器。javascript

  3. 对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 页面的内容返回给浏览器。
    九、浏览器接受到服务器Controller 返回的Html 页面进行解析展现。

    M:Model,模型,和MVC 中的M 功能相同,和数据库进行交互。css

    V:view,视图,和MVC 中的C 功能相同,接收请求,进行处理,与M 和T 进行交互,返回应答。
    T:Template,模板,和MVC 中的V 功能相同,产生Html 页面

    html

    1、用户点击注册按钮,将要注册的内容发送给网站的服务器。
    2、View 视图,接收到用户发来的注册数据,View 告诉Model 将用户的注册信息保存进数据库。
    3、Model 层将用户的注册信息保存到数据库中。
    4、数据库将保存的结果返回给Model
    5、Model 将保存的结果给View 视图。
    6、View 视图告诉Template 模板去产生一个Html 页面。
    7、Template 生成html 内容返回给View 视图。
    8、View 将html 页面内容返回给浏览器。
    九、浏览器拿到view 返回的html 页面内容进行解析,展现。

     

  4. Django 中models 利用ORM 对Mysql 进行查表的语句(多个语句)?
    字段查询
    all():返回模型对应表格中的全部数据
    get():返回表格中知足条件的一条数据,若是查到多条数据,则抛出异常:MultipleObjectsReturned,查询不到数据,则跑异常:DoesNotExist
    
    filter():参数写查询条件,返回知足条件 QuerySet 集合数据
    条件格式:
    **模型类属性名**__条件名=值
    注意:此处是模型类属性名,不是表中的字段名
    关于filter 具体案例以下:
    判等exact。
    1. BookInfo.object.filter(id=1)
    2. BookInfo.object.filter(id__exact=1)此处的__exact 能够省略
    
    like  模糊查询
    
    例:查询书名包含‘传’的图书,contains
    contains :   Bookinfo.objects.filter(bittle__contains='')
    
    空查询 where 字段名 isnull
    BookInfo.objects.filter(bittle__isnull=False)
    
    范围查询 where id in (1,2,3)
    BookInfo.objects.filter(id__in=[1,2,3])
    
    比较查询 gt  It(less  than)  gte(equal) Ite
    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  对象
    做用:用于类属性之间的比较条件
    
    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 对象进行& | ~操做
    
    from django.db.models.import Q
    BookInfo.objects.filter(id__gt=3, bread__gt=30)
    BookInfo.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))
    
    聚合查询
    做用: 对查询结果进行聚合操做
    (sum  count  max  min  avg)
    
    aggregate: 调用这个函数使用聚合
    from django,db,models  import Sum, Count, Max, Min, Avg
    例: BookInfo.onjects.aggregate(Count('id'))
    
    ('id__count': 5) 注意返回值类型及键名
    
    BookInfo.Objects.aggregate(Sum('bread'))
    
    {'bread__sum' : 120}  注意返回类型及键名
    count  函数
    做用:统计知足条件数据的数据
    例:统计多有图书的数目
    BookInfo.objects.all().count()
    例:统计id大于3的全部图书的数目
    BookInfo.objects.filter(id__gt=3).count()
    
    模型类关系
    1)一对多关系
    例:图书类-英雄类
    models.ForeignKey() 定义在多的类中
    2) 多对多的关系
    例:新闻类-新闻类型类
    models.ManyToManyField()  定义在哪一个类中均可以
    3)一对一关系
    例员工基本信息类--员工详细信息类
    models.OneToOneField() 定义在哪一个类中均可以
    View Code

     

  5. django中间件的使用?
    django在中间件中预设了6个方法,这6个方法区别在于不一样的阶段执行,对输入或输出进行干预,方法以下:
    1 初始化: 无需任何参数,服务器响应第一个请求的时候调用一次,用于肯定是否启用当前中间件
    
    def __init__():
        pass
    
    2.处理请求前:在每一个请求上调用,返回None或者HttpResponse 对象
    
    def process_response(request):
        pass
    
    3 处理视图前,在每一个请求上调用,返回None 或HttpResopnse对象
    def  process_view(request.view_func, view_args, view_kwargs):
        pass
    
    4 处理模板响应前: 在每一个请求上调用,返回实现render 方法的响应对象
    def peocess_template_response(request, response):
        pass
    5 处理响应后,多有响应返回浏览器以前被调用,每一个请求上调用,返回HttpResponse对象
    
    def process_response(request, response):
        pass
    
    6  异常处理:当时图抛出异常时调用,在每一个请求上调用,返回一个HttpResponse对象
    def process_exception(request, execption):
        pass

     

  6. 谈一下你对UWSGI和nginx的理解
    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服务器

    nginx:是一个开源的高性能的HTTP的服务器和反向代理:前端

    1.做为web 服务器,它处理静态文件和索引文件效果很是高;
    2.它的设计很是注重效率,最大支持5万个并发连接,但只占用不多的内存空间;
    3.稳定性高,配置简介;
    4.强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用

     

  7. 说说nginx和uWSGI 服务器之间如何配合工做的?
    首先浏览器发起http请求到nginx服务器,Nginx根据接收到的请求包,进行url分析,判断访问的资源类型,若是是静态资源,直接读取静态资源返回给浏览器,若是请求的是动态资源就是转交给uwsgi服务器,uwsgi服务器根据自身的uwsgi和WSGI协议,找到对应的django框架,django框架下的应用进行逻辑处理后将返回值发送到uwsgi服务器,而后uwsgi在返回给nginx,最后nginx将返回值返回给浏览器进行渲染显示给用户。
  8. django开发中数据作过什么优化?
    1.设计表时,尽可能少使用外键,由于外键约束会影响插入和删除性能
    2.使用缓存,减小对数据库的访问
    3.orm框架下设置表时,能使用varchar肯定字段长度时,就别用text
    4.能够给搜索频率搞得字段属性,在定义时建立索引
    5. django orm 框架下的Querysets  原本就有缓存的
    6.若是一个页面须要屡次连接数据库,最好一次性去除全部须要的数据,减小数据库的查询次数
    7, 若页面只须要数据库里面的某一两个字段时,能够用QuerySet.values()
    8.在模板标签里使用with标签能够缓存Qset查询结果
  9. 验证码过时时间怎么设置?
    将验证码保存到数据库或者session,设置过时时间为1分钟,而后也买你设置一个倒计时(通常为前端js实现 这个计时)的展现,一分钟事后再次点击获取新的信息
  10. 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 服务的一个理想框架。

     

  11. 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.最后就是运维工做人员的一些性能优化技术了。

     

  12. 什么是restful API ,谈谈你的理解?
    REST:Representational State Transfer 的缩写,翻译:“具象状态传输”。通常解释为“表现层状态转换”。

    REST 是设计风格而不是标准。是指客户端和服务器的交互形式。咱们须要关注的重点是如何设计
    REST 风格的网络接口。
    REST 的特色:
    1.具象的。通常指表现层,要表现的对象就是资源。好比,客户端访问服务器,获取的数据就是资
    源。好比文字、图片、音视频等。
    2.表现:资源的表现形式。txt 格式、html 格式、json 格式、jpg 格式等。浏览器经过URL 肯定资
    源的位置,可是须要在HTTP 请求头中,用Accept 和Content-Type 字段指定,这两个字段是对资源
    表现的描述。
    3.状态转换:客户端和服务器交互的过程。在这个过程当中,必定会有数据和状态的转化,这种转化
    叫作状态转换。其中,GET 表示获取资源,POST 表示新建资源,PUT 表示更新资源,DELETE 表示删
    除资源。HTTP 协议中最经常使用的就是这四种操做方式。
    RESTful 架构:java

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

     

  13. 如何设计符合RESTFUL风格的API
    1、域名:

    将api 部署在专用域名下:
    http://api.example.com
    或者将api 放在主域名下:
    http://www.example.com/api/

    2、版本:ios

    将api 部署在专用域名下:
    http://api.example.com
    或者将api 放在主域名下:
    http://www.example.com/api/

    3、路径:nginx

    路径表示API 的具体网址。每一个网址表明一种资源。资源做为网址,网址中不能有动词只能有
    名词,通常名词要与数据库的表名对应。并且名词要使用复数。
    错误示例:
    http://www.example.com/getGoods
    http://www.example.com/listOrders
    正确示例:
    #获取单个商品c++

    http://www.example.com/app/goods/1
    #获取全部商品
    http://www.example.com/app/goodsgit

    4、使用标准的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
    5、过滤信息:
    若是资源数据较多,服务器不能将全部数据一次所有返回给客户端。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
    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、错误信息:
    通常来讲,服务器返回的错误信息,以键值对的形式返回。
    {
    error: 'Invalid API KEY'
    }
    8、响应结果:

    针对不一样结果,服务器向客户端返回的结果应符合如下规范。
    #返回商品列表
    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
    9、使用连接关联相关的资源:
    在返回响应结果时提供连接其余API 的方法,使客户端很方便的获取相关联的信息。
    10、其余:
    服务器返回的数据格式,应该尽可能使用JSON,避免使用XML。

     

  14. 什么时csrf攻击原理?如何解决?

    简单来讲就是: 你访问了信任网站A,而后A 会用保存你的我的信息并返回给你的浏览器一个
    cookie,而后呢,在cookie 的过时时间以内,你去访问了恶意网站B,它给你返回一些恶意请求代码,
    要求你去访问网站A,而你的浏览器在收到这个恶意请求以后,在你不知情的状况下,会带上保存在本
    地浏览器的cookie 信息去访问网站A,而后网站A 误觉得是用户自己的操做,致使来自恶意网站C 的
    攻击代码会被执:发邮件,发消息,修改你的密码,购物,转帐,偷窥你的我的信息,致使私人信息泄
    漏和帐户财产安全收到威胁



  15. 启动django服务的方法?

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

  16. 怎样测试django 框架中的代码?

    在单元测试方面,Django 继承python 的unittest.TestCase 实现了本身的
    django.test.TestCase,编写测试用例一般从这里开始。测试代码一般位于app 的tests.py 文件中(也
    能够在models.py 中编写,通常不建议)。在Django 生成的depotapp 中,已经包含了这个文件,
    而且其中包含了一个测试

    用例的样例:
    1. python manage.py test:执行全部的测试用例
    2. python manage.py test app_name, 执行该app 的全部测试用例
    3. python manage.py test app_name.case_name: 执行指定的测试用例
    一些测试工具:unittest 或者pytest

     

  17. 有过部署经验?用的什么技术?能够知足多少压力?

    1.有部署经验,在阿里云服务器上部署的
    2.技术有:nginx + uwsgi 的方式来部署Django 项目
    3.无标准答案(例:压力测试一两千)

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

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

  19. 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 在浏览器中存活的时间。

     

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

    一、优化算法时间
    算法的时间复杂度对程序的执行效率影响最大,在Python 中能够经过选择合适的数据结构来优化
    时间复杂度,如list 和set 查找某一个元素的时间复杂度分别是O(n)和O(1)。不一样的场景有不一样的
    优化方式,总得来讲,通常有分治,分支界限,贪心,动态规划等思想。
    二、循环优化
    每种编程语言都会强调须要优化循环。当使用Python 的时候,你能够依靠大量的技巧使得循环运
    行得更快。然而,开发者常常漏掉的一个方法是:
    避免在一个循环中使用点操做。每一次你调用方法str.upper,Python 都会求该方法的值。然而,
    若是你用一个变量代替求得的值,值就变成了已知的,Python 就能够更快地执行任务。优化循环的关
    键,是要减小Python 在循环内部执行的工做量,由于Python 原生的解释器在那种状况下,真的会
    减缓执行的速度。(注意:优化循环的方法有不少,这只是其中的一个。例如,许多程序员都会说,列
    表推导是在循环中提升执行速度的最好方式。这里的关键是,优化循环是程序取得更高的执行速度的更
    好方式之一。)

    三、函数选择
    在循环的时候使用xrange 而不是range;使用xrange 能够节省大量的系统内存,由于xrange()
    在序列中每次调用只产生一个整数元素。而range()將直接返回完整的元素列表,用于循环时会有没必要

    要的开销。在python3 中xrange 再也不存在,里面range 提供一个能够遍历任意长度的范围的
    iterator。
    四、并行编程
    由于GIL 的存在,Python 很难充分利用多核CPU 的优点。可是,能够经过内置的模块
    multiprocessing 实现下面几种并行模式:
    多进程:对于CPU 密集型的程序,可使用multiprocessing 的Process,Pool 等封装好的类,
    经过多进程的方式实现并行计算。可是由于进程中的通讯成本比较大,对于进程之间须要大量数据交互
    的程序效率未必有大的提升。
    多线程:对于IO 密集型的程序,multiprocessing.dummy 模块使用multiprocessing 的接口封
    装threading,使得多线程编程也变得很是轻松(好比可使用Pool 的map 接口,简洁高效)。
    布式:multiprocessing 中的Managers 类提供了能够在不一样进程之共享数据的方式,能够在此
    基础上开发出分布式的程序。
    不一样的业务场景能够选择其中的一种或几种的组合实现程序性能的优化。
    五、使用性能分析工具
    除了上面在ipython 使用到的timeit 模块,还有cProfile。cProfile 的使用方式也很是简单:
    python-mcProfilefilename.py,filename.py 是要运行程序的文件名,能够在标准输出中看到每个
    函数被调用的次数和运行的时间,从而找到程序的性能瓶颈,而后能够有针对性地优化。
    六、set 的用法
    set 的union,intersection,difference 操做要比list 的迭代要快。所以若是涉及到求list 交
    集,并集或者差的问题能够转换为set 来操做。
    七、PyPy

    PyPy 是用RPython(CPython 的子集)实现的Python,根据官网的基准测试数据,它比CPython
    实现的Python 要快6 倍以上。快的缘由是使用了Just-in-Time(JIT)编译器,即动态编译器,与静态
    编译器(如gcc,javac 等)不一样,它是利用程序运行的过程的数据进行优化。因为历史缘由,目前pypy
    中还保留着GIL,不过正在进行的STM 项目试图将PyPy 变成没有GIL 的Python。若是python
    程序中含有C 扩展(非cffi 的方式),JIT 的优化效果会大打折扣,甚至比CPython 慢(比Numpy)。
    因此在PyPy 中最好用纯Python 或使用cffi 扩展。

  21. django中间件是如何使用的?
    中间件不用继承任何类(能够继承object),下面一个中间件大概的样子:
    1. class CommonMiddleware(object):
    2. def process_request(self, request):
    3. return None
    4.
    5. def process_response(self

    还有process_view, process_exception 和process_template_response 函数。
    1)初始化:无需任何参数,服务器响应第一个请求的时候调用一次,用于肯定是否启用当前中间件。

    1. def __init__(self):
    2. pass

    2)处理请求前:在每一个请求上,request 对象产生以后,url 匹配以前调用,返回None 或
    HttpResponse 对象。

    1. def process_request(self, request):
    2. pass

    3)处理视图前:在每一个请求上,url 匹配以后,视图函数调用以前调用,返回None 或
    HttpResponse 对象。

    1. def process_view(self, request, view_func, *view_args,**view_kwargs):
    2. pass

    4)处理响应后:视图函数调用以后,全部响应返回浏览器以前被调用,在每一个请求上调用,返回
    HttpResponse 对象。

    1. def process_response(self, request, response):
    2. pass

    5)异常处理:当视图抛出异常时调用,在每一个请求上调用,返回一个HttpResponse 对象。

    1. def process_exception(self, request,exception):
    2. pass

     

  22. 有用过Django REST framework 吗?

    Django REST framework 是一个强大而灵活的Web API 工具。使用RESTframework 的理由
    有:
    Web browsable API 对开发者有极大的好处
    包括OAuth1a 和OAuth2 的认证策略
    支持ORM 和非ORM 数据资源的序列化
    全程自定义开发——若是不想使用更增强大的功能,可仅仅使用常规的function-based views
    额外的文档和强大的社区支持

  23. Celery 分布式任务队列?

    情景:用户发起request,并等待response 返回。在本些views 中,可能须要执行一段耗时的程
    序,那么用户就会等待很长时间,形成很差的用户体验,好比发送邮件、手机验证码等。
    使用celery 后,状况就不同了。解决:将耗时的程序放到celery 中执行。
    将多个耗时的任务添加到队列queue 中,也就是用redis 实现broker 中间人,而后用多个worker 去监听队列
    里的任务去执行。

     任务task:就是一个Python 函数。
     队列queue:将须要执行的任务加入到队列中。
     工人worker:在一个新进程中,负责执行队列中的任务。
     代理人broker:负责调度,在布置环境中使用redis。

  24. Jieba分词

    Jieba 分词支持三种分词模式:
    精确模式:试图将句子最精确地切开,适合文本分析;
    全模式:把句子中全部的能够成词的词语都扫描出来, 速度很是快,可是不能解决歧义;
    搜索引擎模式:在精确模式的基础上,对长词再次切分,提升召回率,适合用于搜索引擎分词
    功能:
    分词,添加自定义词典,关键词提取,词性标注,并行分词,Tokenize:返回词语在原文的起始位
    置,ChineseAnalyzer for Whoosh 搜索引擎。

  25. ngnix 的正向代理与反向代理?

    web 开发中,部署方式大体相似。简单来讲,使用Nginx 主要是为了实现分流、转发、负载均衡,
    以及分担服务器的压力。Nginx 部署简单,内存消耗少,成本低。Nginx 既能够作正向代理,也能够
    作反向代理。

    正向代理:请求通过代理服务器从局域网发出,而后到达互联网上的服务器。
    特色:服务端并不知道真正的客户端是谁。
    反向代理:请求从互联网发出,先进入代理服务器,再转发给局域网内的服务器。
    特色:客户端并不知道真正的服务端是谁。
    区别:正向代理的对象是客户端。反向代理的对象是服务端。

  26. 简述Django 下的(内建的)缓存机制?

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

  27. 请简述浏览器是如何获取一枚网页的?

    1.在用户输入目的URL 后,浏览器先向DNS 服务器发起域名解析请求;
    2.在获取了对应的IP 后向服务器发送请求数据包;
    3.服务器接收到请求数据后查询服务器上对应的页面,并将找到的页面代码回复给客户端;
    4.客户端接收到页面源代码后,检查页面代码中引用的其余资源,并再次向服务器请求该资源;
    5.在资源接收完成后,客户端浏览器按照页面代码将页面渲染输出显示在显示器上;

  28. 对cookie 与session 的了解?他们能单独用吗?

    Session 采用的是在服务器端保持状态的方案,而Cookie 采用的是在客户端保持状态的方案。但
    是禁用Cookie 就不能获得Session。由于Session 是用Session ID 来肯定当前对话所对应的服务
    器Session,而Session ID 是经过Cookie 来传递的,禁用Cookie 至关于失去了SessionID,也
    就得不到Session。

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

    Django 和其余Web 框架的HTTP 处理的流程大体相同,Django 处理一个Request 的过程
    是首先经过中间件,而后再经过默认的URL 方式进行的。咱们能够在Middleware 这个地方把全部
    Request 拦截住,用咱们本身的方式完成处理之后直接返回Response。
    1. 加载配置
    Django 的配置都在“Project/settings.py” 中定义,能够是Django 的配置,也能够是自定义
    的配置,而且都经过django.conf.settings 访问,很是方便。

    2. 启动
    最核心动做的是经过django.core.management.commands.runfcgi 的Command 来启动,
    它运行django.core.servers.fastcgi 中的runfastcgi,runfastcgi 使用了flup 的WSGIServer 来
    启动fastcgi 。而WSGIServer 中携带了django.core.handlers.wsgi 的WSGIHandler 类的一个
    实例,经过WSGIHandler 来处理由Web 服务器(好比Apache,Lighttpd 等)传过来的请求,此
    时才是真正进入Django 的世界。

    3. 处理Request
    当有HTTP 请求来时,WSGIHandler 就开始工做了,它从BaseHandler 继承而来。
    WSGIHandler 为每一个请求建立一个WSGIRequest 实例,而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 分析”、“模板技术”和“ ORM 技术”。

    如图所示,一个HTTP 请求,首先被转化成一个HttpRequest 对象,而后该对象被传递给
    Request 中间件处理,若是该中间件返回了Response,则直接传递给Response 中间件作收尾处理。
    不然的话Request 中间件将访问URL 配置,肯定哪一个view 来处理,在肯定了哪一个view 要执行

    可是尚未执行该view 的时候,系统会把request 传递给view 中间件处理器进行处理,若是该中
    间件返回了Response,那么该Response 直接被传递给Response 中间件进行后续处理,不然将执
    行肯定的view 函数处理并返回Response,在这个过程当中若是引起了异常并抛出,会被Exception
    中间件处理器进行处理。

  30. Django 里QuerySet 的get 和filter 方法的区别?

    1) 输入参数
    get 的参数只能是model 中定义的那些字段,只支持严格匹配。
    filter 的参数能够是字段,也能够是扩展的where 查询关键字,如in,like 等

    2) 返回值
    get 返回值是一个定义的model 对象。
    filter 返回值是一个新的QuerySet 对象,而后能够对QuerySet 在进行查询返回新的QuerySet
    对象,支持链式操做,QuerySet 一个集合对象,可以使用迭代或者遍历,切片等,可是不等于list 类型
    (使用必定要注意)。
    3) 异常
    get 只有一条记录返回的时候才正常,也就说明get 的查询字段必须是主键或者惟一约束的字段。
    当返回多条记录或者是没有找到记录的时候都会抛出异常
    filter 有没有匹配的记录均可以

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

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

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

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

  33. Django 对数据查询结果排序怎么作,降序怎么作,查询大于某个字段怎么作?

    排序使用order_by()
    降序须要在排序字段名前加-
    查询字段大于某个值:使用filter(字段名_gt=值)

  34. Django 重定向你是如何实现的?用的什么状态码?

     使用HttpResponseRedirect
     redirect 和reverse
     状态码:302,301

  35. 生成迁移文件和执行迁移文件的命令是什么?

    python manage.py makemigrations
    python manage.py migrate

  36. 关系型数据库的关系包括哪些类型?

     ForeignKey:一对多,将字段定义在多的一端中。
     ManyToManyField:多对对:将字段定义在两端中。
     OneToOneField:一对一,将字段定义在任意一端中。

  37. 查询集返回列表的过滤器有哪些?

     all() :返回全部的数据
     filter():返回知足条件的数据
     exclude():返回知足条件以外的数据,至关于sql 语句中where 部分的not 关键字
     order_by():排序

  38. 判断查询集正是否有数据?
    exists():判断查询集中否有数据,若是有则返回True,没有则返回False。
  39. Django 自己提供了runserver,为何不能用来部署?

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

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

  40. apache 和nginx 的区别?

    Nginx 相对Apache 的优势:
    轻量级,一样起web 服务,比apache 占用更少的内存及资源;
    抗并发,nginx 处理请求是异步非阻塞的,支持更多的并发链接,而apache 则是阻塞型的,在高
    并发下nginx 能保持低资源低消耗高性能;
    配置简洁;
    高度模块化的设计,编写模块相对简单;
    社区活跃。
    Apache 相对Nginx 的优势:
    rewrite ,比nginx 的rewrite 强大;
    模块超多,基本想到的均可以找到;
    少bug ,nginx 的bug 相对较多;
    超稳定。

  41. varchar 与char 的区别?(2018-4-16-lxy)
    char 长度是固定的,无论你存储的数据是多少他都会都固定的长度。而varchar 则处可变长度但他
    要在总长度上加1 字符,这个用来存储位置。因此在处理速度上char 要比varchar 快速不少,可是对
    费存储空间,因此对存储不大,但在速度上有要求的可使用char 类型,反之能够用varchar 类型。

  42. 查询集两大特性?惰性执行?

    惰性执行、缓存。
    建立查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的状况包括迭代、序列化、
    与if 合用

  43. git 经常使用命令? 

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

  44. 电商网站库存问题

    通常团购,秒杀,特价之类的活动,这样会使访问量激增,不少人抢购一个商品,做为活动商品,
    库存确定是颇有限的。控制库存问题,数据库的事务功能是控制库存超卖的有效方式。
    1.在秒杀的状况下,确定不能如此频率的去读写数据库,严重影响性能问题,必须使用缓存,将需
    要秒杀的商品放入缓存中,并使用锁来处理并发状况,先将商品数量增减(加锁、解析)后在进行其余
    方面的处理,处理失败再将数据递增(加锁、解析),不然表示交易成功。
    2.这个确定不能直接操做数据库的,会挂的。直接读库写库对数据库压力太大了,要用到缓存。
    3.首先,多用户并发修改同一条记录时,确定是后提交的用户将覆盖掉前者提交的结果了。这个直
    接可使用加乐观锁的机制去解决高并发的问题。

  45. 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 才有数据。

  46. 请求头后面的?a=19  的键值对是怎么产生的?
    键是开发人员在编写代码时肯定下来的,值是根据数据生成或者用户填写的,总之是不肯定的
  47. 403错误:

    403 错误:表示资源不可用,服务器理解客户的请求,可是拒绝处理它,一般因为服务器上文件和目录
    的权限设置致使的web 访问错误。如何解决:一、把中间件注释。二、在表单内部添加{% scrf_token %}

  48. request.GET.get()取值时若是一键多值状况?

    get 是覆盖的方式获取的。getlist()能够获取多个值。
    在一个有键无值的状况下,该键名c 的值返回空。有键无值:c: getlist 返回的是列表,空列表
    在无键无值也没有默认值的状况下,返回的是None 无键无值:e:None

  49. HttpResponse 常见属性,常见方法,应答对象?

    HttpResponse 常见属性:
    content: 表示返回的内容
    charset: 表示response 采用的编码字符集,默认是utf-8
    status_code:返回的HTTP 响应状态码3XX 是对请求继续进一步处理,常见的是重定向。
    常见方法:
    init:建立httpResponse 对象完成返回内容的初始化
    set_cookie:设置Cookie 信息:格式:set_cookies('key','value',max_age=None,expires=None)
    max_age 是一个整数,表示指定秒数后过时,expires 指定过时时间,默认两个星期后过时。
    write 向响应体中写数据
    应答对象:
    方式一:render(request,"index.html") 返回一个模板
    render(request,"index.html", context) 返回一个携带动态数据的页面

    方式二:render_to_response("index.html") 返回一个模板页面
    方式三:redirect("/") 重定向
    方式四:HttpResponseRdeirect("/") 实现页面跳转功能
    方式五:HttpResponse("itcast1.0")在返回到额页面中添加字符串内容
    方式六:HttpResponseJson() 返回的页面中添加字符串内容。
    JsonResponse 建立对象时候接收字典做为参数,返回的对象是一个json 对象。
    能接收Json 格式数据的场景,都须要使用view 的JsonResponse 对象返回一个json 格式数据
    ajax 的使用场景,页面局部刷新功能。ajax 接收Json 格式的数据。
    在返回的应答报文中,能够看到JsonResponse 应答的content-Type 内容是application/json
    ajax 实现网页局部刷新功能:ajax 的get()方法获取请求数据ajax 的each()方法遍历输出这些数据

  50. 什么是反向解析?

    使用场景:模板中的超连接,视图中的重定向
    使用:在定义url 时为include 定义namespace 属性,为url 定义name 属性
    在模板中使用url 标签:{% url 'namespace_value:name_value'%}
    在视图中使用reverse 函数:redirect(reverse('namespce_value:name_value’))
    根据正则表达式动态生成地址,减轻后期维护成本。
    注意反向解析传参数,主要是在咱们的反向解析的规则后面天界了两个参数,两个参数之间使用空格隔
    开:<a href="{% url 'booktest:fan2' 2 3 %}">位置参数</a>

  51. ngo 日志管理

    import logging
    logger=logging.getLogger(__name__) # 为loggers 中定义的名称
    logger.info("some info ...)
    可用函数有:logger.debug() logger.info() logger.warning() logger.error()
    Django 文件管理:对于jdango 老说,项目中的css,js,图片都属于静态文件,咱们通常会将静态
    文件放到一个单独的目录中,以方便管理,在html 页面调用时,也须要指定静态文件的路径。静态文
    件能够放在项目根目录下,也能够放在应用的目录下,因为这些静态文件在项目中是通用的,因此推荐
    放在项目的根目录下。
    在生产中,只要和静态文件相关的,全部访问,基本上没有django 什么事,通常都是由nignx 软
    件代劳了,为何?由于nginx 就是干这个的。

    

三.Tornado

1. Tornado 的核是什么? (2018-4-16-lxy)Tornado 的核心是ioloop 和iostream 这两个模块,前者提供了一个高效的I/O 事件循环,后者则封装了一个无阻塞的socket 。经过向ioloop 中添加网络I/O 事件,利用无阻塞的socket ,再搭配相应的回调函数,即可达到求之不得的高效异步执行。

相关文章
相关标签/搜索