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提交非法数据