Django Rest Framwork
阿新 • • 發佈:2020-11-30
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: 內部實現了增刪改查功能,無需自己寫