1.DRF
(1) APIView流程
(2) 序列化组件
serizer=序列化类(queryset,many=True)
serizer=序列化类(model_obj,many=Flase)
serizer.data # [{},{}] {}
serizer.error
serizer.is_valid()
serizer.save()
(3) 视图
1 独立写逻辑
2 mixin混合类封装
3 mixin混合类进一步封装
4 基于ModelViewSet封装
(4) 认证,权限,频率
查找类似于permission_classes这样的实例变量
局部查找 — 全局查找 — 默认
(5) 解析器
Django默认解析urlencoded
DRF:urlencoded,json
(6) url路由器
(7) 响应器
(8) 分页
一 表结构
补充知识点:
# 笨方法:
>>> coupon=Coupon.objects.filter(name="海尔空调折扣券").first()
>>> coupon
<Coupon: Coupon object>
>>> coupon
<Coupon: Coupon object>
>>> coupon.content_type_id
9
>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.filter(pk=9)
<QuerySet [<ContentType: electrics>]>
>>> ContentType.objects.filter(pk=9).first()
<ContentType: electrics>
>>> ContentType.objects.filter(pk=9).first().model
'electrics'
>>> ContentType.objects.filter(pk=9).first().model_class()
<class 'app01.models.Electrics'>
>>> ContentType.objects.filter(pk=9).first().model_class().objects.filter(pk=coupon.object_id)
<QuerySet [<Electrics: Electrics object>]>
>>> ContentType.objects.filter(pk=9).first().model_class().objects.filter(pk=coupon.object_id).first().name
'海尔空调'
```
## 2.Django's Generic Relations
```python
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Activity(models.Model):
FAVORITE = 'F'
LIKE = 'L'
UP_VOTE = 'U'
DOWN_VOTE = 'D'
ACTIVITY_TYPES = (
(FAVORITE, 'Favorite'),
(LIKE, 'Like'),
(UP_VOTE, 'Up Vote'),
(DOWN_VOTE, 'Down Vote'),
)
user = models.ForeignKey(User)
activity_type = models.CharField(max_length=1, choices=ACTIVITY_TYPES)
date = models.DateTimeField(auto_now_add=True)
# Below the mandatory fields for generic relation
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
3.简单跨域/复杂跨域
3.1 CORS
简介
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
3.2 两种请求
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
只要同时满足以下两大条件,就属于简单请求。
复制代码
(1) 请求方法是以下三种方法之一:
HEAD
GET
POST
(2)HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
复制代码
凡是不同时满足上面两个条件,就属于非简单请求。
浏览器对这两种请求的处理,是不一样的。
复制代码
-
简单请求和非简单请求的区别?
简单请求:一次请求
非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。 -
关于“预检”
- 请求方式:OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
=> 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
Access-Control-Request-Method
=> 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
Access-Control-Request-Headers
复制代码
支持跨域,简单请求
服务器设置响应头:Access-Control-Allow-Origin = ‘域名’ 或 ‘*’
支持跨域,复杂请求
由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。
“预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method
“预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers