Python全栈的知识点(4)

1.MVC     
    Model       View       Controller
    模型      视图        控制器
    Django  MTV
    Model    Template       View
    模型     模板文件      业务处理

2.web框架的本质:
    socket服务端与浏览器的通信
        1. socket服务端功能划分:
            a. 负责与浏览器收发消息(socket通信)  --> wsgiref/uWsgi/gunicorn...
            
            b. 根据用户访问不同的路径执行不同的函数
            
            c. 从HTML读取出内容,并且完成字符串的替换  --> jinja2(模板语言)
            
        2. Python中 Web框架的分类:
            
            1. 按上面三个功能划分:
                1. 框架自带a,b,c                 --> Tornado
                2. 框架自带b和c,使用第三方的a    --> Django
                3. 框架自带b,使用第三方的a和c    --> Flask
            2. 按另一个维度来划分:
                1. Django   --> 大而全(你做一个网站能用到的它都有)
                2. 其他     --> Flask 轻量级

3. Django请求生命周期?
    客户端发送请求,wsgi(socket)接受请求并处理请求初步封装,在进入Django
    进行二次封装,在经过中间件做效验和认证,比如session和csrf_token处理,由url分发请求,
    到相应视图进行业务逻辑处理,可能涉及到:ORM,和templates=》渲染,然后再经过url到中间件,
    中间件返回给wsgi,到wsgi将相应的内容返还给浏览器

4. 什么是ORM?
        ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间做一个映射
        ORM优缺点:
                优点:摆脱复杂的SQL操作,适应快速开发,让数据结果变得简单,数据库迁移成本更低
                缺点:性能较差,不适用于大型应用,复杂的SQL操作还需要通过SQL语句实现

5. orm操作
    - select_related,连表操作,相当于主动做join
    - prefeth_related,多次单表操作,先查询想要的数据,然后构造条件,如:id=[1,2,3],再次查询其他表根据id做条件。
        - only      仅仅查看列出的
        - defer     排除列出的
        - F         专门取对象中某列值的操作
        - Q         用于构造复杂查询条件
        - models.User.objects.using("db1").all()    选择链接的数据库
        - 通过ORM写偏原生SQL:
            - extra
            - raw    
            - 原生SQL

6. Cookie是什么
    保存在浏览器端的键值对,cookie不是很安全,别人可以分析存放在本地的cookie
    为什么要有Cookie?
        因为HTTP请求是无状态的
    Cookie的原理?
        服务器可以在返回响应的时候做在浏览器上写入键值对(Cookie)
        浏览器发送请求的时候会自动携带该网站保存在我浏览器的键值对(Cookie)    

7.Session是什么
    Session保存在服务端的键值对,依赖与cookie,安全指数比cookie高

8. 使用中间件做过什么?  在视图执行之前帮助我们定制一些操作(process_request, process_response)
    - 内置
        - csrf    用来效验的字符串,防止跨站攻击
        - session     “会话控制”,放在服务器的键值对
    - 自定义
        - 登录认证    不再需要在每个函数中添加装饰器
        - 权限          当用户登录时候获取当前用户所有权限并放入session,然后再次访问其他页面,
                获取当前url并在session中进行匹配。成功(True),失败(False)
        - cors         跨域中间件,设置响应头,允许你的一些跨域操作.应用:本地开始前后端分离时使用。

9. 为什么会有跨域?
    浏览器具有同源策略所有才出现跨域。
    同源策略:
        - 开放:src
        - 禁止:ajax
    解决跨域:
        - JSONP(动态创建script标签,先定义一个函数,服务端返回数据函数名加括号执行)
                        
            PS: jsonp只能发送GET请求
                
        - cors,设置响应头
            - 简单请求
            - 复杂请求
                - options请求做预检
                - PUT/POST....
                    
    在django中解决方案:
        - 中间件中设置响应头,django中的一个第三方组件:cors

10. 常见请求头
    - Content-Type     (请求体or响应体的类型)
    - User-Agent       (本机和浏览器信息)
    - referer       (可以做图片防盗链)
    - Host           (本机IP和域名,域名可以有多个)
    - cookies       (服务器保存在本地浏览器的键值对,配合session使用)

11. 常见的请求体?
    Form表单提交:
    Ajax请求:
    补充:django中获取请求体
        - request.POST 
        - request.body 

12. django组件:contenttype
    组件的作用:可以通过两个字段让表和N张表创建FK关系

13. FBV和CBV是什么?以及优缺点。   (在本质上都是一样的,通过函数处理请求)
    CBV在指定的类上面加上装饰器或在此方法上面添加装饰器 @method_decorator,并继承view
    CBV更适合做接口,响应各种method

14.django rest framework
       a.权限
        -写一个类并注册到权限类,在类的has_permission方法中编写权限逻辑
        -True     -False
       b.认证
        -写一个类并注册到认证类。在类的authticate方法中编写认证逻辑。
        -认证成功(user,auth)元组
        -raise AuthticateFaild(...)
        -None(匿名用户)
       c.访问频率限制
        -写一个类并注册到频率类,在类的allow_request/wait方法中编写pinlv逻辑
        -True    -False 如果返回False,执行wait
       d.序列化
        -对queryset序列化以及对请求数据格式效验
       e.路由
        -可以通过as_view传参数,根据请求方式不同执行相应的方法
        -可以在url中设置一个结尾,类似于:.json
       f.视图
        -帮助开发者提供了一些类,并在类中提供了多个方法供我们使用
       g.分页
        -对从数据库中获取到的数据进行分页处理: SQL-> limit offset
        -1.限制页数    -2.记录当前页最大ID、最小ID
        -3种分页:
           -根据页码:http://www.baidu.com/api/v1/student/?page=1&size=10
           -根据索引:http://www.baidu.com/api/v1/student/?offset=1&limit=10  游标位置
           -根据加密:http://www.baidu.com/api/v1/student/?page=erd8
       h.解析器
        -根据ContentType请求头解析出queryset和对象
       i.渲染器
        -根据url中传入的后缀,决定将数据如何渲染到页面上
       j.版本
        -在url中设置version参数,用户请求时传入参数。在request.version中获取,根据版本不同做不同操作

14. restful规范
      a.根据method的不同,进行不同操作(GET/POST/PUT/DELETE/PATCH)
      b.面向资源编程(任何url都是一个资源,可以对资源进行增删改查)
      c.体现版本(bootstrap3,bootstrap4)
      d.体现是API
        https://luffycity.com/api/v1/salary
        https://api.luffycity.com/v2/salary(放前面会出现2次跨域请求)
      e.使用https(基于安全考虑)
      f.响应时设置状态码(200,300,400,500)
      g.条件
        https://luffycity.com/api/v1/salary?page=1&size=10   (url限制)
      h.返回值
         1.https://luffycity.com/api/v1/salary
        GET:[返回列表]
        POST:[返回新增的数据]
         2.https://luffycity.com/api/v1/salary/1/
        GET:获取单条数据
        PUT:更新   
        PATCH:局部更新
        DELETE:删除
      i.返回错误信息{code:100001,error:"xx错误"}
      j.Hypermedia API(返回结果中提供链接)
        ret={code:1000,data:{id:1,name:"小强",depart_id:http://www.baidu.com}}

15. django rest framework的作用?
    快速搭建基于restful规范的接口。

16. django怎么弄并发的
        nginx的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的web服务中更是突出其优越的地方,
    由于其底层使用epoll异步IO模型进行处理,使其深受欢迎
17. Django的Form主要具有以下功能?
        生成HTMl标签,验证用户数据 is_vaild,HTML Form提交保留上次提交数据,初始化页面显示内容

18. Django、Tornado、Flask各自的优势
         Django:Django无socket,django的目的是简便,快速开发,并遵循MVC设计,多个组件可以很方便的以“插件”形式服务于整个框架,
                     django有许多功能强大的第三方插件。django具有很强的可扩展性。
         Tornado:它是非阻塞式服务器,而且速度相当快,得力于其非阻塞的方式和对epoll的运用,Future对象,缺点:没有session,需要自定制
         Flask:是一个微型的web框架,配合SQLALchemy来使用,jinja2模板,werkzeug接口,另外它的上下文则较为耀眼                  
       
19. django的template的注释是什么样子的
         单行:{#注释#}
         多行注释:{%comment%}

20. 什么是wsgi?
    -web服务网关接口,实现该协议的模块(socket)
    -wsgiref(性能最差)
    -werkzurg
    -uwsig   Nginx

21. uwsgi和wsgi
         wsgi:是web服务器网关接口,是pyhton应用程序或框架和web服务器之间的一种接口,其广泛使用的是django框架。
         uwsgi:是一个web服务器,它实现了wsgi协议,Nginx中HttpUwsgiModule的作用是与Uwsgi服务器进行交换

22. 常见的状态码:
    - 200            服务器成功返回网页
    - 204         请求收到,但返回信息为空
    - 301/302         重定向/和永久重定向
    - 304         客户端已经执行了GET,但文件未变化
    - 400         错误请求,如语法错误
    - 403/404        无权限访问/找不到网页
    - 500            服务器产生内部错误

23. 视图常见的继承
    from rest_framework.views import APIView # *  重写需要
    from rest_framework.generics import GenericAPIView
    from rest_framework.viewsets import GenericViewSet # as_view
    from rest_framework.viewsets import ModelViewSet # *  基本增删改查

24. 你写的类都继承过哪儿些类?
    object
    View
    Views.APIView, GenericViewSet
    ViewSetMixin,   GenericAPIView
    mixins.CreateModelMixin, mixins.RetrieveModelMixin,
    mixins.UpdateModelMixin, mixins.DestroyModelMixin,
    mixins.ListModelMixin,
25. csrf存在的原因 - 原因1: - 需要浏览器+爬虫先访问登录页面,获取token,然后再携带token去访问。 - 原因2: - 两个tab打开的同时,其中一个tab诱导你对另外一个tab提交非法数据
原文地址:https://www.cnblogs.com/Guishuzhe/p/9824933.html