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