一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - DRF之請求與響應的實現

DRF之請求與響應的實現

2021-12-13 10:42暗黑妹妹 Python

本文主要介紹了DRF請求與響應的實現,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧

1 請求和響應

1.1 請求

?
1
2
3
4
5
6
7
8
9
10
# 請求對象
# from rest_framework.request import Request
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        # 二次封裝request,將原生request作為drf request對象的 _request 屬性
        self._request = request
    def __getattr__(self,item):
     return getattr(self._request,item)
# 請求對象.data:前端以三種編碼方式傳入的數據,都可以取出來
# 請求對象..query_params 與Django標準的request.GET相同,只是更換了更正確的名稱而已。

1.2 響應

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#from rest_framework.response import Response
 def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        
#data:你要返回的數據,字典
#status:返回的狀態碼,默認是200,
 -from rest_framework import status在這個路徑下,它把所有使用到的狀態碼都定義成了常量
#template_name 渲染的模板名字(自定制模板),不需要了解
#headers:響應頭,可以往響應頭放東西,就是一個字典
#content_type:響應的編碼格式,application/json和text/html;
 
# 瀏覽器響應成瀏覽器的格式,postman響應成json格式,通過配置實現的(默認配置)
#不管是postman還是瀏覽器,都返回json格式數據
# drf有默認的配置文件---》先從項目的setting中找,找不到,采用默認的
# drf的配置信息,先從自己類中找--》項目的setting中找---》默認的找
 -局部使用:對某個視圖類有效
        -在視圖類中寫如下
        from rest_framework.renderers import JSONRenderer
        renderer_classes=[JSONRenderer,]
    -全局使用:全局的視圖類,所有請求,都有效
     -在setting.py中加入如下
        REST_FRAMEWORK = {
            'DEFAULT_RENDERER_CLASSES': (  # 默認響應渲染類
                'rest_framework.renderers.JSONRenderer'# json渲染器
                'rest_framework.renderers.BrowsableAPIRenderer'# 瀏覽API渲染器
            )
        }

2 視圖

?
1
2
3
# 兩個視圖基類
APIView
GenericAPIView

2.1 基于APIView寫接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#### views.py
from rest_framework.generics import GenericAPIView
from app01.models import Book
from app01.ser import BookSerializer
# 基于APIView寫的
class BookView(APIView):
    def get(self,request):
        book_list=Book.objects.all()
        book_ser=BookSerializer(book_list,many=True)
 
        return Response(book_ser.data)
    def post(self,request):
        book_ser = BookSerializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'校驗失敗'})
 
 
class BookDetailView(APIView):
    def get(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(book)
        return Response(book_ser.data)
 
    def put(self, request,pk):
        book = Book.objects.all().filter(pk=pk).first()
        book_ser = BookSerializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '校驗失敗'})
 
    def delete(self,request,pk):
        ret=Book.objects.filter(pk=pk).delete()
        return Response({'status': 100, 'msg': '刪除成功'})
    
#models.py
class Book(models.Model):
    name=models.CharField(max_length=32)
    price=models.DecimalField(max_digits=5,decimal_places=2)
    publish=models.CharField(max_length=32)
#ser.py
class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model=Book
        fields='__all__'
# urls.py
path('books/', views.BookView.as_view()),
re_path('books/(?P<pk>\d+)', views.BookDetailView.as_view()),

2.2 基于GenericAPIView寫的接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# views.py
class Book2View(GenericAPIView):
    #queryset要傳queryset對象,查詢了所有的圖書
    # serializer_class使用哪個序列化類來序列化這堆數據
    queryset=Book.objects
    # queryset=Book.objects.all()
    serializer_class = BookSerializer
    def get(self,request):
        book_list=self.get_queryset()
        book_ser=self.get_serializer(book_list,many=True)
 
        return Response(book_ser.data)
    def post(self,request):
        book_ser = self.get_serializer(data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status':101,'msg':'校驗失敗'})
 
 
class Book2DetailView(GenericAPIView):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(book)
        return Response(book_ser.data)
 
    def put(self, request,pk):
        book = self.get_object()
        book_ser = self.get_serializer(instance=book,data=request.data)
        if book_ser.is_valid():
            book_ser.save()
            return Response(book_ser.data)
        else:
            return Response({'status': 101, 'msg': '校驗失敗'})
 
    def delete(self,request,pk):
        ret=self.get_object().delete()
        return Response({'status': 100, 'msg': '刪除成功'})
    
 #url.py
    # 使用GenericAPIView重寫的
    path('books2/', views.Book2View.as_view()),
    re_path('books2/(?P<pk>\d+)', views.Book2DetailView.as_view()),

2.3 基于GenericAPIView和5個視圖擴展類寫的接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from rest_framework.mixins import  ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
# views.py
class Book3View(GenericAPIView,ListModelMixin,CreateModelMixin):
 
    queryset=Book.objects
    serializer_class = BookSerializer
    def get(self,request):
        return self.list(request)
 
    def post(self,request):
        return self.create(request)
 
class Book3DetailView(GenericAPIView,RetrieveModelMixin,DestroyModelMixin,UpdateModelMixin):
    queryset = Book.objects
    serializer_class = BookSerializer
    def get(self, request,pk):
        return self.retrieve(request,pk)
 
    def put(self, request,pk):
        return self.update(request,pk)
 
    def delete(self,request,pk):
        return self.destroy(request,pk)
# urls.py
    # 使用GenericAPIView+5 個視圖擴展類  重寫的
    path('books3/', views.Book3View.as_view()),
    re_path('books3/(?P<pk>\d+)', views.Book3DetailView.as_view()),

2.4 使用ModelViewSet編寫5個接口

?
1
2
3
4
5
6
7
8
9
10
# views.py
from rest_framework.viewsets import ModelViewSet
class Book5View(ModelViewSet):  #5個接口都有,但是路由有點問題
    queryset = Book.objects
    serializer_class = BookSerializer
    
# urls.py
# 使用ModelViewSet編寫5個接口
    path('books5/', views.Book5View.as_view(actions={'get':'list','post':'create'})), #當路徑匹配,又是get請求,會執行Book5View的list方法
    re_path('books5/(?P<pk>\d+)', views.Book5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),

2.5 源碼分析ViewSetMixin

?
1
2
3
4
5
6
7
8
9
10
# 重寫了as_view
# 核心代碼(所以路由中只要配置了對應關系,比如{'get':'list'}),當get請求來,就會執行list方法
for method, action in actions.items():
    #method:get
    # action:list
    handler = getattr(self, action)
    #執行完上一句,handler就變成了list的內存地址
    setattr(self, method, handler)
    #執行完上一句  對象.get=list
    #for循環執行完畢 對象.get:對著list   對象.post:對著create

2.6 繼承ViewSetMixin的視圖類

?
1
2
3
4
5
6
7
8
9
10
11
12
# views.py
from rest_framework.viewsets import ViewSetMixin
class Book6View(ViewSetMixin,APIView): #一定要放在APIVIew前
    def get_all_book(self,request):
        print("xxxx")
        book_list = Book.objects.all()
        book_ser = BookSerializer(book_list, many=True)
        return Response(book_ser.data)
    
# urls.py
    #繼承ViewSetMixin的視圖類,路由可以改寫成這樣
    path('books6/', views.Book6View.as_view(actions={'get': 'get_all_book'})),

什么是正向代理,什么是反向代理

正向代理代理的對象是客戶端,反向代理代理的對象是服務端

到此這篇關于DRF之請求與響應的實現的文章就介紹到這了,更多相關DRF 請求與響應內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/zhenghuiwen/p/13274903.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品成人网红女主播 | 欧美日韩精品在线视频 | 国产第一福利影院 | juliaann大战两个黑人 | 母性本能 | 四虎影音| 欧美大屁屁 | w7w7w7w7w免费| 99re这里只有精品在线观看 | 青青久久精品国产 | 国产剧情一区二区三区 | 九九精品视频在线免费观看 | 国产午夜亚洲精品理论片不卡 | 成年人在线免费看 | 国产精品va在线观看无 | 国产成人啪精品午夜在线观看 | 丝袜足液精子免费视频 | 边摸边吃奶边做爽视频免费 | 色老头综合网 | 日本一区二区在线不卡 | 邪恶肉肉全彩色无遮琉璃神社 | 国产精品视频2020 | 无人知晓小说姜璟免费阅读 | 亚洲欧美综合人成野草 | 国产精品视频一区二区三区 | 爽爽窝窝午夜精品一区二区 | 亚洲国产天堂久久综合网站 | 国产草逼视频 | 日本高清视频在线免费观看 | bt岛www| 男人的视频网站 | 成年性生交大片免费看 | 色5月婷婷| 日本强不卡在线观看 | www四虎影视| 无码人妻少妇色欲AV一区二区 | 变态np虐高h | 亚洲大片免费观看 | 午夜精品久久久久久中宇 | 好男人资源免费观看 | 精精国产xxxx视频在线播放器 |