1. 程式人生 > 實用技巧 >Django Rest Framwork

Django Rest Framwork

Django和Django Rest Framwork

將資料庫的東西通過ORM的對映取出來,通過view檔案,按照template檔案排出的模板渲染成HTML。當用戶請求相應的url時,返回相應的結果,這是Django
將資料庫的東西通過ORM的對映取出來,通過view和serializers檔案繫結REST介面,當前端請求時,返回序列化好的json,這是Django REST Framwork

DRF是Django的超集,去掉了模板的部分,提供了一個REST的介面,同時也提供了滿足該介面的程式碼工作流。同時,在REST的規範下,升級了許可權和分頁等功能,增加了限流和過濾搜尋等功能

瞭解Django REST Framwork之前 先了解一些API規範(restful API)

API規範(restful API)

面向資源程式設計 把網路上所有的東西都視為資源

http://127.0.0.1:8008/api/server

# 傳送不同的請求執行不同的功能
- GET       # 獲取資料
- POST      # 新增資料
- PUT       # 修改資料
- DELETE    # 刪除資料

一個符合restful api規範的示例

@method_decorator()
from django.views import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse

@method_decorator(csrf_exempt, name='dispatch')
class ApiCase(View):

    def get(self, request, *args, **kwargs):
        data = 'xxxx'
        return JsonResponse(data)

    def post(self, request, *args, **kwargs):
        data = 'xxxx'
        return JsonResponse(data)

一、 Django REST Framework介紹

Django REST framework是基於Django實現的一個RESTful風格API框架,能夠幫助我們快速開發RESTful風格的API
官網:https://www.django-rest-framework.org/
中文文件:https://q1mi.github.io/Django-REST-framework-documentation/

二、 Django REST Framework安裝和配置

1、安裝

pip install djangorestframework

2、註冊在settings中註冊djangorestframework

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 註冊drf
    'rest_framework',
]

3、使用示例

from django.views import View
from django.http import JsonResponse

# 不使用djangorestframework示例
class UserApi(View):
    def get(self, *args, **kwargs):
        userinfo = {'username': "CatdeXin", 'sex': 'girl'}
        return JsonResponse(userinfo)


# 使用djangorestframework示例
from rest_framework.views import APIView # 替換view繼承
from rest_framework.response import Response # 替換Response

class DrfUserApi(APIView):
    def get(self, *args, **kwargs):
        userinfo = {'username': "CatdeXin", 'sex': 'girl'}
        return Response(userinfo)

什麼是drf

他是一個django的元件(app)
他可以幫助我們快速開發遵循restful規範的介面
    - csrf
    - 頁面渲染 (json放到頁面了)
    - 序列化 (直接對QuerySet序列化)

DRF序列化QuerySet

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers

from drfapi import models

# 原生django序列化QuerySet
class DrfUserView(APIView):
    def get(self, request,*args,**kwargs):
        data =  models.AutlUser.objects.all().values()
        return Response(data)

# 使用drf序列化QuerySet
class AutlUserSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.AutlUser
        fields = '__all__'

class DrfUserView(APIView):
    def get(self,request,*args,**kwargs):
        result = models.AutlUser.objects.all()
        ser = AutlUserSerializers(instance=result,many=True)
        return Response(ser.data)

內容詳細講解

csrf功能

url(r'^user/',views.DrfUserView.as_view())
# Django原始碼View簡寫
class View:
    @classonlymethod
    def as_view(cls, **initkwargs):
        def view(request, *args, **kwargs):
            return self.dispatch(request, *args, **kwargs)
        return view
    
    def dispatch(self, request, *args, **kwargs):
        pass

# drf原始碼的APIView簡寫
class APIView(View):

    @classmethod
    def as_view(cls, **initkwargs):

        view = super().as_view(**initkwargs) # 執行父類的as_view
        view.cls = cls
        view.initkwargs = initkwargs

        return csrf_exempt(view) # 剔除csrf認證

# drf裝飾的檢視函式
from rest_framework.views import APIView
from rest_framework.response import Response

class DrfUserView(APIView):
    def get(self,request,*args,**kwargs):
        return Response({'name': 'nayue','age':18})

使用Django REST Framework開發API介面

APIView

# url
urlpatterns = [
    url(r'^user/$',views.DrfUserView.as_view()),
    url(r'^user/(?P<pk>\d+)/$',views.DrfUserView.as_view()),
]

# 資料庫
class AutlUser(models.Model):
    username = models.CharField(max_length=18,verbose_name='使用者名稱')
    password = models.CharField(max_length=18,verbose_name='密碼')
    age = models.IntegerField(verbose_name='年齡')
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers

from drfapi import models

class AutlUserSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.AutlUser
        fields = '__all__'

class DrfUserView(APIView):
    # 獲取資料
    def get(self, request, *args, **kwargs):
        pk = kwargs.get('pk')
        if not pk:
            result = models.AutlUser.objects.all()
            ser = AutlUserSerializers(instance=result, many=True)

        else:
            autluser_obj = models.AutlUser.objects.filter(id=pk).first()
            ser = AutlUserSerializers(instance=autluser_obj, many=False)
        return Response(ser.data)

    # 增加資料
    def post(self, request, *args, **kwargs):
        ser = AutlUserSerializers(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({"add": "200"})

        return Response(ser.errors)

    # 刪除資料
    def delete(self, request, pk):
        models.AutlUser.objects.filter(id=pk).delete()
        return Response({"delete": "200"})

    def put(self, request, pk):
        '''
        全部更新 得攜帶所有資料
        '''
        autluser_obj = models.AutlUser.objects.filter(id=pk).first()
        if not autluser_obj:
            return Response({"put": "300"})
        # models.AutlUser.objects.filter(id=pk).update(**request.data)
        ser = AutlUserSerializers(instance=autluser_obj, data=request.data)
        if ser.is_valid(): 
            ser.save()
        return Response({"put": "200"})
    
    def patch(self, request, pk):
        '''區域性更新'''
        pass

ModelViewSet

url(r'^new/user/$',views.NewDrfUserView.as_view({'get':'list','post':'create'})),
url(r'^new/user/(?P<pk>\d+)/$',views.NewDrfUserView.as_view({'get':'retrieve',"delete":"destroy","put":"update","patch":"partial_update"})),


from rest_framework.viewsets import ModelViewSet
from rest_framework import serializers
from drfapi import models

class AutlUserSerializers(serializers.ModelSerializer):
    class Meta:
        model = models.AutlUser
        fields = '__all__'

class NewDrfUserView(ModelViewSet): # 內部封裝了常用的增刪改查功能
    queryset = models.AutlUser.objects.all()
    serializer_class = AutlUserSerializers

面試題

  • 你曾經在使用drf時,檢視都繼承過哪些類
    APIView: 沒有提供增刪改查功能,全部需要自己手動實現
    ModelViewSet: 內部實現了增刪改查功能,無需自己寫