码迷,mamicode.com
首页 > 其他好文 > 详细

Django REST framework

时间:2018-10-16 22:06:28      阅读:513      评论:0      收藏:0      [点我收藏+]

标签:core   click   href   val   frame   start   调用   自定义   包括   

一、起步

由于笔者水平有限,学习技术官方文档永远是首先被推荐的,推荐来自Django REST framework官网的快速教程

技术分享图片

二、序列化组件

models:

后面的代码将基于这几个表来做操作

技术分享图片
 1 class BookDetailView(APIView):
 2     """
 3     针对单条数据的序列化
 4     """
 5 
 6     def get(self,request,id):
 7 
 8         book=Book.objects.filter(pk=id).first()
 9         bs=BookModelSerializers(book,context={request: request})
10         return Response(bs.data)
11 
12     def put(self,request,id):
13         book=Book.objects.filter(pk=id).first()
14         bs=BookModelSerializers(book,data=request.data)
15         if bs.is_valid():
16             bs.save()
17             return Response(bs.data)
18         else:
19             return Response(bs.errors)
20 
21     def delete(self,request,id):
22         Book.objects.filter(pk=id).delete()
23 
24         return Response()
View Code

序列化的方法:

方法一: 硬传值

class PublishView(View):
    def get(self,request):
        # 方式一:
        publish_list = list(Publish.objects.all().values("name","email"))
        # {‘name‘: ‘苹果出版社‘, ‘email‘: ‘123@qq.com‘}{‘name‘: ‘橘子出版社‘, ‘email‘: ‘456@qq.com‘}
        return HttpResponse(publish_list)

方法二: model_to_dict(obj)

技术分享图片
 1 class PublishView(View):
 2     def get(self,request):
 3         from django.forms.models import model_to_dict
 4         publish_list = Publish.objects.all()
 5         temp = []
 6         for obj in publish_list:
 7             # temp.append({
 8             #     "name":obj.name,
 9             #     "email":obj.email
10             # })
11             temp.append(model_to_dict(obj))
12         print(temp, type(temp))
13         # [{‘name‘: ‘苹果出版社‘, ‘email‘: ‘123@qq.com‘}, {‘name‘: ‘橘子出版社‘, ‘email‘: ‘456@qq.com‘}] <class ‘list‘>
14         # [{‘id‘: 1, ‘name‘: ‘苹果出版社‘, ‘email‘: ‘123@qq.com‘}, {‘id‘: 2, ‘name‘: ‘橘子出版社‘, ‘email‘: ‘456@qq.com‘}] <class ‘list‘>
15 
16         return HttpResponse(temp)
View Code

方法三: serializers.serialize("json",publish_list)

技术分享图片
class PublishView(View):
    def get(self,request):
        from django.core import serializers
        publish_list = Publish.objects.all()
        ret = serializers.serialize("json",publish_list)
        """
        [
            {
                "model": "app01.publish",
                "pk": 1,
                "fields": {
                    "name": "苹果出版社",
                    "email": "123@qq.com"
                }
            },
            {
                "model": "app01.publish",
                "pk": 2,
                "fields": {
                    "name": "橘子出版社",
                    "email": "456@qq.com"
                }
            }
        ]
        """
        return HttpResponse(ret)
View Code

方法四:rest_framework  serializers

技术分享图片
 1 from rest_framework import serializers
 2 
 3 class PublishSerializers(serializers.Serializer):
 4     name = serializers.CharField()
 5     email = serializers.EmailField()
 6 
 7 
 8 class PublishView(View):
 9     def get(self,request):
10         # 方式四(推荐)
11         publish_list = Publish.objects.all()
12         ret = PublishSerializers(publish_list, many=True) # queryset
13         # print(ret.data)
14         # print(type(ret.data))
15         # [OrderedDict([(‘name‘, ‘苹果出版社‘), (‘email‘, ‘123@qq.com‘)]),
16         # OrderedDict([(‘name‘, ‘橘子出版社‘), (‘email‘, ‘456@qq.com‘)])]
17         # <class ‘rest_framework.utils.serializer_helpers.ReturnList‘>
18         """
19         >>>dict([("name","橘子出版社"),("email","456@qq.com")])
20         {‘name‘: ‘橘子出版社‘, ‘email‘: ‘456@qq.com‘}
21         """
22 
23         return HttpResponse(ret.data)
View Code

终结者:ModelSerializer

我们的 PublishSerializers 类中重复了很多包含在Publish模型类(model)中的信息。如果能保证我们的代码整洁,那就更好了。

就像Django提供了Form类和ModelForm类一样,REST framework包括Serializer类和ModelSerializer类。

下面我们换一个稍微复杂的有外键的模型来进行演示:

技术分享图片
 1 class BookModelSerializers(serializers.ModelSerializer):
 2     class Meta:
 3         model = Book
 4         fields = "__all__"
 5 
 6     #publish=serializers.CharField(source="publish.pk")
 7     publish=serializers.HyperlinkedIdentityField(
 8             view_name="detailpublish",
 9             lookup_field="publish_id",
10             lookup_url_kwarg="pk"
11     )
12 
13 
14 class BookView(APIView):
15     def get(self,request):
16         book_list=Book.objects.all()
17         bs=BookModelSerializers(book_list,many=True,context={request: request})
18         return Response(bs.data)
19     def post(self,request):
20         # post请求的数据
21         bs=BookModelSerializers(data=request.data)
22         if bs.is_valid():
23             print(bs.validated_data)
24             bs.save()# create方法
25             return Response(bs.data)
26         else:
27             return Response(bs.errors)
28 
29 class BookDetailView(APIView):
30     """
31     针对单条数据的序列化
32     """
33 
34     def get(self,request,id):
35 
36         book=Book.objects.filter(pk=id).first()
37         bs=BookModelSerializers(book,context={request: request})
38         return Response(bs.data)
39 
40     def put(self,request,id):
41         book=Book.objects.filter(pk=id).first()
42         bs=BookModelSerializers(book,data=request.data)
43         if bs.is_valid():
44             bs.save()
45             return Response(bs.data)
46         else:
47             return Response(bs.errors)
48 
49     def delete(self,request,id):
50         Book.objects.filter(pk=id).delete()
51 
52         return Response()
View Code

 三、APIVIEW

在CBV的基础上,视图类在继承了REST framework的 APIVIEW 后产生了新的调用方法

request的加强:

技术分享图片
1 原生request支持的操作
2 print("POST",request.POST)
3 print("body",request.body)
4 # print(request)
5 print(type(request))
6 from django.core.handlers.wsgi import WSGIRequest
7     新的request支持的操作
8 print("request.data",request.data)
9 print("request.data type",type(request.data))
View Code

 

四、认证和授权

a. 用户url传入的token认证

技术分享图片 urls.py
技术分享图片 views.py

b. 请求头认证

技术分享图片 urls.py
技术分享图片 views.py

c. 多个认证规则

技术分享图片 urls.py
技术分享图片 views.py

d. 认证和权限

技术分享图片 urls.py
技术分享图片 views.py

e. 全局使用

上述操作中均是对单独视图进行特殊配置,如果想要对全局进行配置,则需要再配置文件中写入即可。

技术分享图片 settings.py
技术分享图片 urls.py
技术分享图片 views.py

五、用户访问次数/频率限制

a. 基于用户IP限制访问频率

技术分享图片 urls.py
技术分享图片 views.py

b. 基于用户IP显示访问频率(利于Django缓存)

技术分享图片 settings.py
技术分享图片 urls.py
技术分享图片 views.py

c. view中限制请求频率

技术分享图片 settings.py
技术分享图片 urls.py
技术分享图片 views.py

d. 匿名时用IP限制+登录时用Token限制

技术分享图片 settings.py
技术分享图片 urls.py
技术分享图片 views.py

e. 全局使用

技术分享图片 settings

 

六、解析器(parser) 

根据请求头 content-type 选择对应的解析器就请求体内容进行处理。

a. 仅处理请求头content-type为application/json的请求体

技术分享图片 urls.py
技术分享图片 views.py

b. 仅处理请求头content-type为application/x-www-form-urlencoded 的请求体

技术分享图片 urls.py
技术分享图片 views.py

c. 仅处理请求头content-type为multipart/form-data的请求体

技术分享图片 urls.py
技术分享图片 views.py
技术分享图片 upload.html

d. 仅上传文件

技术分享图片 urls.py
技术分享图片 views.py
技术分享图片 upload.html

e. 同时多个Parser

当同时使用多个parser时,rest framework会根据请求头content-type自动进行比对,并使用对应parser

技术分享图片 urls.py
技术分享图片 views.py

f. 全局使用

技术分享图片 settings.py
技术分享图片 urls.py
技术分享图片 views.py

注意:个别特殊的值可以通过Django的request对象 request._request 来进行获取

 

七、分页

a. 根据页码进行分页

技术分享图片 urs.py
技术分享图片 views.py

b. 位置和个数进行分页

技术分享图片 urls.py
技术分享图片 views.py

c. 游标分页

技术分享图片 urls.py
技术分享图片 views.py

 

八、路由系统

a. 自定义路由

技术分享图片 urls.py
技术分享图片 views.py

b. 半自动路由

技术分享图片 urls.py
技术分享图片 views.py

c. 全自动路由

技术分享图片 urls.py
技术分享图片 views.py

九、视图

a. GenericViewSet

技术分享图片 urls.py
技术分享图片 views.py

b. ModelViewSet(自定义URL)

技术分享图片 urls.py
技术分享图片 views.py

c. ModelViewSet(rest framework路由)

技术分享图片 urls.py
技术分享图片 views.py

 

 
 
 

 

Django REST framework

标签:core   click   href   val   frame   start   调用   自定义   包括   

原文地址:https://www.cnblogs.com/huang-yc/p/9800552.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!