一、DRF框架介紹
1、web應用開發模式
1.1、前后端不分離
1.2、前后端分離
2、RESTful介紹
RESTful是目前最流行的API設計風格 , REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。
1、每一個URI代表1種資源;
2、客戶端使用GET、POST、PUT、DELETE4個表示操作方式的動詞對服務端資源進行操作:
GET 用來獲取資源POST 用來新建資源PUT 用來更新資源(整體更新)PATCH:用來更新資源(局部更新)DELETE 用來刪除資源
3、通過操作資源的表現形式來操作資源;
4、資源的形式是XML或者json;
5、客戶端與服務端之間的交互在請求之間是無狀態的,從客戶端到服務端的每個請求都必須包含
理解請求所必需的信息。
3、RESTful API設計風格
3.1、HTTP動詞
對于資源的具體操作類型,由HTTP動詞表示。常用的HTTP動詞有下面四個(括號里是對應的SQL命
令)。
GET(SELECT):從服務器取出資源(一項或多項)。
POST(CREATE):在服務器新建一個資源。
PUT(UPDATE):在服務器更新資源(客戶端提供改變后的完整資源)。
DELETE(DELETE):從服務器刪除資源。
3.2、url路徑
3.2.1 url路徑盡量用名詞表示,而不用動詞
不推薦:
http://api.baidu.com/getProjects
http://api.baidu.com/deleteEnvs
推薦
http:/api.baidu.com/Projects
http:/api.baidu.com/Envs
路徑中的project表示操作的資源
3.2.2 不管是單一資源,還是所有資源,路徑中名詞盡量用復數
不推薦
# 獲取單個數據:
GET方法: http://api.baidu.com/Env/1
# 獲取所有數據:
GET方法: http://api.baidu.com/allEnvs
推薦
# 獲取單個數據:
GET方法: http://api.baidu.com/Envs/1
# 獲取所有數據:
GET方法: http://api.baidu.com/Envs
3.3、過濾參數
如果接口需要通過條件過濾返回結果 ,那么過濾的條件參數,應作為查詢字符串參數傳遞。
例如:
?limit=10:指定返回記錄的數量
?offset=10:指定返回記錄的開始位置。
?page=2&size=100:指定第幾頁,以及每頁的記錄數。
?sortby=name&order=asc:指定返回結果按照哪個屬性排序,以及排序順序。
3.4、返回狀態碼
客戶端的每一次請求,服務器都必須給出回應。回應包括 HTTP 狀態碼和數據兩部分。
HTTP 狀態碼就是一個三位數,分成五個類別。
1xx :相關信息2xx :操作成功3xx :重定向4xx :客戶端錯誤5xx :服務器錯誤
這五大類總共包含100多種狀態碼,覆蓋了絕大部分可能遇到的情況。每一種狀態碼都有標準的(或者約定的)解釋,客戶端只需查看狀態碼,就可以判斷出發生了什么情況,所以服務器應該返回盡可能精確的狀態碼。
API 不需要 1xx 狀態碼,下面介紹其他四類狀態碼的精確含義。
3.4.1 2XX狀態碼
200 狀態碼表示操作成功,restful Api設計風格中,不同的方法可以返回更精確的狀態碼。
GET: 200 OK
POST: 201 Created
PUT: 200 OK
PATCH: 200 OK
DELETE: 204 No Content
上面代碼中, POST 返回 201 狀態碼,表示生成了新的資源; DELETE 返回 204 狀態碼,表示資源已經不存在。
注意點:202 Accepted 狀態碼表示服務器已經收到請求,但還未進行處理,會在未來再處理,通常
用于異步操作。發生錯誤時,不應該使用200狀態碼
3.4.2 4XX狀態碼
4xx 狀態碼表示客戶端錯誤,主要有下面幾種。
400 Bad Request :服務器不理解客戶端的請求,未做任何處理。
401 Unauthorized :用戶未提供身份驗證憑據,或者沒有通過身份驗證。
403 Forbidden :用戶通過了身份驗證,但是不具有訪問資源所需的權限。
404 Not Found :所請求的資源不存在,或不可用。
405 Method Not Allowed :用戶已經通過身份驗證,但是所用的 HTTP 方法不在他的權限之
內。
410 Gone :所請求的資源已從這個地址轉移,不再可用。
415 Unsupported Media Type :客戶端要求的返回格式不支持。比如,API 只能返回 JSON 格
式,但是客戶端要求返回 XML 格式。
422 Unprocessable Entity :客戶端上傳的附件無法處理,導致請求失敗。
429 Too Many Requests :客戶端的請求次數超過限額。
3.4.3 5XX 狀態碼
5xx 狀態碼表示服務端錯誤。一般來說,API 不會向用戶透露服務器的詳細信息,所以只要兩個狀態碼就夠了
500 Internal Server Error :客戶端請求有效,服務器處理時發生了意外。
503 Service Unavailable :服務器無法處理請求,一般用于網站維護狀態
3.5、返回內容
服務器返回的數據格式,應該盡量使用JSON
針對不同操作,服務器向用戶返回的結果應該符合以下規范。
GET /collection:返回資源對象的列表(數組)
GET /collection/1:返回單個資源對象
POST /collection:返回新生成的資源對象
PUT /collection/1:返回完整的資源對象
DELETE /collection/1:返回一個空文檔
4、DRF框架介紹
Django REST framework 框架是一個用于構建Web API 的強大而又靈活的工具。
通常簡稱為DRF框架 或 REST framework。
DRF框架是建立在Django框架基礎之上,由Tom Christie大牛二次開發的開源項目。
特點:
提供了定義序列化器Serializer的方法,可以快速根據 Django ORM 或者其它庫自動序列化/反序列化;
提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫;
豐富的定制層級:函數視圖、類視圖、視圖集合到自動生成 API,滿足各種需要;
多種身份認證和權限認證方式的支持;
內置了限流系統;
直觀的 API web 界面;
可擴展性,插件豐富
DRF(Django REST framework )框架是建立在Django框架基礎之上,是一個用于構建Web API 的強大而又靈活的工具,通常簡稱為DRF框架 或 REST framework。
5、安裝和使用
5.1 安裝DRF
pip install djangorestframework
5.2 注冊rest_framework應用
我們利用在Django框架學習中創建的demo工程,在settings.py的INSTALLED_APPS中添
加’rest_framework’。
INSTALLED_APPS = [
...
'rest_framework',
]
6、Django開發RESTful接口的步驟
1、定義模型類
2、定義路由
3、定義視圖
7、DRF開發RESTful接口步驟
1、定義模型類
2、定義序列化器
作用:進行序列化操作,將ORM對象 轉換為json數據進行反序列化,將json數據轉換為ORM對象
3、定義路由
4、定義視圖
二、序列化器
序列化器的作用:
1、進行數據的校驗2、 對數據對象進行轉換
1、序列化器的定義
Django REST framework中的序列化器通過類來定義,必須繼承rest_framework.serializers.Serializer ,序列化器中的字段和模型類中的字段類型保持一致。
模型類如下:
class UserInfo(models.Model):
name = models.CharField(max_length=20, verbose_name='用戶名')
pwd = models.CharField(max_length=18, verbose_name='密碼')
email = models.EmailField(max_length=40, verbose_name='郵箱')
age = models.IntegerField(verbose_name='年齡', default=18)
序列化器的定義:
class UserInfoSerializer(serializers.Serializer):
"""用戶信息序列化器"""
name = serializers.CharField(help_text='用戶信息', max_length=18,
required=True)
pwd = serializers.CharField(help_text='密碼', min_length=6,
max_length=18, required=True)
email = serializers.EmailField(help_text='郵箱', required=True)
age = serializers.IntegerField(help_text='年齡', max_value=200,
min_value=0)
2、字段類型與選項介紹
常用字段類型:
選項參數:
通用參數:
3、序列化操作
3.1、環境準備
1、創建項目
django-admin startproject drfdemo1
2、創建應用
python manage.py startapp app1
3、修改setting中的配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 注冊drf 和新建的應用
"rest_framework",
"app1"
]
4、 model.py 中定義模型類
class UserInfo(models.Model):
name = models.CharField(max_length=20, verbose_name='用戶名')
pwd = models.CharField(max_length=18, verbose_name='密碼')
email = models.EmailField(max_length=40, verbose_name='郵箱')
age = models.IntegerField(verbose_name='年齡', default=18)
def __str__(self):
return self.name
5、定義序列化器類
在應用中新建文件 serializer.py
在文件 serializer.py 中定義序列化器
from rest_framework import serializers
class UserInfoSerializer(serializers.Serializer):
"""用戶信息序列化器"""
name = serializers.CharField(help_text='用戶信息', max_length=18,
required=True)
pwd = serializers.CharField(help_text='密碼', min_length=6,
max_length=18, required=True)
email = serializers.EmailField(help_text='郵箱', required=True)
age = serializers.IntegerField(help_text='年齡', max_value=200,
min_value=0)
6、激活模型類生成遷移文件、執行遷移文件
# 命令1:生成遷移文件
python manage.py makemigrations
# 命令2:執行遷移文件
python manage.py migrate
7、練習數據準備
# 進行交互環境添加測試數據:python manage.py shell
UserInfo.objects.create(name='張三',pwd='123456',email='123@qq.com',age=19)
UserInfo.objects.create(name='李
四',pwd='123456q',email='1223@qq.com',age=19)
UserInfo.objects.create(name='王
五',pwd='123456q',email='12234@qq.com',age=19)
3.2、序列化操作
序列化 : 將python對象 —> 轉換為json格式數據
定義好Serializer類后,如果要通過序列化器類類進行序列化,需要先創建Serializer對象了。
Serializer的參數為:
Serializer(instance=None, data={empty}, **kwarg)
1)用于序列化時,將模型類對象傳入instance參數2)用于反序列化時,將要被反序列化的數據傳入data參數
3.2.1、單個數據序列化
進入django交互環境
python manage.py shell
案例
# 通過模型類查詢一條用戶信息
>>> obj = UserInfo.objects.get(id=1)
# 使用查詢到的用戶信息,創建一個序列化對象
>>> us = UserInfoSerializer(obj)
>>> us.data
{'name': '張三', 'pwd': '123456', 'email': '123@qq.com', 'age': 19}
3.2.2、查詢集序列化
>>> obs = UserInfo.objects.all()
>>> us = UserInfoSerializer(obs,many=True)
>>> us.data
[OrderedDict([('name', '張三'), ('pwd', '123456'), ('email', '123@qq.com'),
('age', 19)]), OrderedDict([('name', '李四'), ('pwd', '123456q'), ('email',
'1223@qq.com'), ('age', 19)]), OrderedDict([('name', '王五'), ('pwd', '123456q'),
('email', '12234@qq.com'), ('age', 19)])]
對多個數據進行序列化加參數:many=True
3.2.3、將序列化得到的數據轉換為json
from rest_framework.renderers import JSONRenderer
# 查詢用戶對象
obj = UserInfo.objects.get(id=1)
# 創建序列化對對象
u = UserInfoSerializer(obj)
# 將得到的字段,轉換為json數據
JSONRenderer().render(u.data)
3.3、關聯對象嵌套序列化
3.3.1、數據準備
定義模型類
# 模型Addr關聯userinfo,
class Addr(models.Model):
user = models.ForeignKey('UserInfo', verbose_name='所屬用戶',
on_delete=models.CASCADE)
mobile = models.CharField(verbose_name='手機號', max_length=18)
city = models.CharField(verbose_name='城市', max_length=10)
info = models.CharField(verbose_name='詳細地址', max_length=200)
def __str__(self):
return self.info
重新生成遷移文件,并執行
# 命令1:生成遷移文件
python manage.py makemigrations
# 命令2:執行遷移文件
python manage.py migrate
添加練習數據
# 通過 python manage.py shell 進入交互環境,添加如下數據
obj = UserInfo.objects.get(id=1)
Addr.objects.create(user=obj,mobile='18898789878',city='長沙',info='湖南省長
沙市岳麓區')
Addr.objects.create(user=obj,mobile='18888889999',city='長沙',info='湖南省長
沙市開福區')
定義序列化器
class AddrSerializer(serializers.Serializer):
"""地址序列化器"""
mobile = serializers.CharField(help_text='手機號', max_length=18)
city = serializers.CharField(help_text='城市', max_length=10)
info = serializers.CharField(help_text='詳細地址', max_length=200)
# 關聯字段序列化
user = serializers.PrimaryKeyRelatedField()
3.3.2、關聯字段序列化的方式
1、PrimaryKeyRelatedField
返回關聯字段的id
user = serializers.PrimaryKeyRelatedField()
2、StringRelatedField
返回關聯字段模型類 str 方法返回的內容
user = serializers.StringRelatedField()
3、使用關聯對象的序列化器
返回關聯對象序列化器返回的所有字段
# 關聯模型類的序列化器
user = UserInfoSerializer()
4、SlugRelatedField
指定返回關聯對象 某個具體字段
# 返回關聯對象的name字段
user = serializers.SlugRelatedField(read_only=True,slug_field='name')
3.4、反序列化操作
反序列化 —> 將json格式數據 轉換為python對象
在進行反序列化操作是,會先對象數據進行驗證,驗證通過的情況下再進行保存。
反序列化時,初始化序列化器對象,將要被反序列化的數據傳入data參數
3.4.1、數據驗證
調用is_valid()方法進行驗證,驗證成功返回True,否則返回False;
驗證成功,可以通過序列化器對象的validated_data屬性獲取數據;
user1 = {"name":"張三","pwd":"123456","email":"12345453@qq.com","age":18}
ser = UserInfoSerializer(data=user1)
#進行數據校驗
ser.is_valid()
#獲取validated_data數據
OrderedDict([('name', '張三'), ('pwd', '123456'), ('email', '12345453@qq.com'), ('age',18)])
注意:is_valid()會根據序列化器中字段對應的約束來進行校驗
3.4.2、常用校驗字段說明
1、字段長度和是否校驗的參數
字段選項參數前面都列出來了,常用的幾個字段:
max_length:字段的長度校驗
min_length:字段的長度校驗
required=False:不需要校驗字段是否為空
2、控制序列化和反序列化的字段
read_only = Ture:只參與序列號返回(即序列化),不參與反序列化校驗(即反序列化)
write_only = True :只參與反序列化校驗,不參與序列號返回
3.4.3、序列化器保存數據
驗證通過后,如需保存數據,直接調用序列化器對象的save方法即可,save方法會自動觸發序列化器中對應的方法來保存數據
# 反序列化
ser = UserInfoSerializer(data=data)
# 校驗數據
ser.is_valid()
# 保存數據
ser.save()
注意點:
保存:sava會調用序列化器中定義 create 方法
更新:sava會調用序列化器中定義 update 方法
3.5、模型序列化器
為了方便我們定義序列化器,DRF為我們提供了ModelSerializer模型類序列化器來幫助我們快速創建一個Serializer類。
ModelSerializer與常規的Serializer相同,但提供了:
基于模型類自動生成一系列字段;
基于模型類自動為Serializer生成validators,比如unique_together;
包含默認的create()和update()的實現;
3.5.1、模型序列化器的使用
定義模型序列化器類,直接繼承于serializers.ModelSerializer即可
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = '__all__'
指定模型類和需要序列化得字段
model 指明參照哪個模型類
fields 指明為模型類的哪些字段生成
3.5.2、指定字段
1、fields
fields = all 代表模型類中得所有字段都進行序列化。
也可以通過fields指定具體字段:
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
# fields = '__all__' # 所有字段
fields = ('id','age','pwd') # 指定序列化得字段
2、exclude
使用exclude可以明確排除掉哪些字段
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
exclude = ('id',) # id字段不參與序列化
3、 read_only_fields
通過read_only_fields可以指明只讀的字段
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = '__all__'
read_only_fields = ('id',)
3.5.3、修改字段的參數選項
使用extra_kwargs參數為ModelSerializer添加或修改原有的選項參數
class UserInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserInfo
fields = '__all__'
extra_kwargs = {
'pwd': {'min_value': 0, 'required': True},
}
3.6、序列化器保存數據案例
前提是模型類要實現create方法和update方法。
使用序列化器新增數據:
data = {"name":"張三","pwd":"9999999","email":"12345453@qq.com","age":18}
ser = UserInfoSerializer(data=data)
# 校驗數據
ser.is_valid()
# 保存數據
ser.save()
使用序列化器修改數據:
# 查詢對象
user = UserInfo.objects.get(id = 1)
data = {"name":"張三","pwd":"9999999","email":"12345453@qq.com","age":18}
# 創建序列化器
ser = UserInfoSerializer(instance =user ,data=data)
# 校驗數據
ser.is_valid()
# 保存數據
ser.save()
3.7、利用序列化器實現增刪查改的接口
視圖
from django.http import HttpResponse, JsonResponse
from rest_framework.parsers import JSONParser
from .models import UserInfo
from .serializers import UserInfoSerializer
# Create your views here.
def user_list(request):if request.method == 'GET':# 返回用戶列表users = UserInfo.objects.all()serializer = UserInfoSerializer(users, many=True)return JsonResponse(serializer.data, safe=False)elif request.method == 'POST':# 添加用戶信息data = JSONParser().parse(request)serializer = UserInfoSerializer(data=data)if serializer.is_valid():serializer.save()return JsonResponse(serializer.data, status=201)return JsonResponse(serializer.errors, status=400)
def user_detail(request, id):
"""
獲取單個用戶、修改用戶信息、刪除用戶信息
"""
try:user = UserInfo.objects.get(id=id)
except UserInfo.DoesNotExist:return HttpResponse(status=404)
if request.method == 'GET':serializer = UserInfoSerializer(user)return JsonResponse(serializer.data)
elif request.method == 'PUT':data = JSONParser().parse(request)serializer = UserInfoSerializer(user, data=data)if serializer.is_valid():serializer.save()return JsonResponse(serializer.data)return JsonResponse(serializer.errors, status=400)
elif request.method == 'DELETE':user.delete()return HttpResponse(status=204)
路由
from django.urls import path
from app1 import views
urlpatterns = [
path('user/', views.user_list),
path('user/<int:id>/', views.user_detail),
]
3.8、自定義驗證方法
定義校驗方法:
#驗證方法名的規范:validate_字段名
class UserInfoSerializer(serializers.Serializer):def validate_pwd(self,value):"""校驗邏輯"""
通過validators字段指定驗證函數:
def length_validate(value):if not(10<len(value)<20):raise serializers.ValidationError("字段的長度不在10-20之間")
class UserInfoSerializer(serializers.Serializer):pwd = serializers.CharField(validators=length_validate)
三、請求和響應
1、DRF定義視圖函數
案例
from rest_framework.decorators import api_view
from rest_framework.views import APIView
from rest_framework.response import Response
@api_view(['GET', 'POST'])
def user_list(request):return Response(data={'message':"OK"})
# Django的request
# request.GET # 獲取get請求傳遞的查詢參數
# requests.POST # 獲取post請求傳遞的表單參數
# put patch post請求傳遞的請求體參數(json格式的),Django中并未提供直接獲取的方法
params = request.body.denode()
import json
params = json.loads(params)
2、DRF的Request對象
REST framework 傳入視圖的request對象不再是Django默認的HttpRequest對象,而是REST
framework提供的擴展了HttpRequest類的Request類的對象。無論前端發送的哪種格式的數據,我們
都可以以統一的方式讀取數據。
1、request.data屬性
request.data 獲取請求體數據。
支持 POST , PUT, PATCH 方法傳遞的請求體參數
不僅支持表單類型數據,也支持JSON數據,還支持文件數據的獲取
2、request.query_params屬性
request.query_params獲取查詢字符串參數的,Django的 request.GET 的作用一樣
3、DRF的Response對象
rest_framework.response.Response
REST framework提供了一個響應類 Response ,使用該類構造響應對象時,響應的具體數據內容會被轉換(render渲染)成符合前端需求的類型。
Response(data, status=None, template_name=None, headers=None, content_type=None)
data 不能是復雜結構的數據,如Django的模型類對象,對于這樣的數據我們可以使用 Serializer 序
列化器序列化處理后(轉為了Python字典類型)再傳遞給 data 參數。
3.1 Response參數說明
data : 為響應準備的序列化處理后的數據;
status : 狀態碼,默認200;
template_name : 模板名稱,如果使用 HTMLRenderer 時需指明;
headers : 用于存放響應頭信息的字典;
content_type : 響應數據的Content-Type,通常此參數無需傳遞,REST framework會根據前端
所需類型數據來設置該參數
4、響應狀態碼
在視圖中使用數字 HTTP 狀態代碼并不總是能帶來明顯的閱讀效果,而且如果您輸入了錯誤代碼,很容易察覺不到。REST 框架為每個狀態代碼(如模塊中)提供更明確的標識符。 HTTP_400_BAD_REQUEST
from rest_framework import status
status.HTTP_200_OK
5、API 視圖的裝飾器
REST 框架提供了兩個可用于編寫 API 視圖的包裝器。
用于處理基于函數的視圖的裝飾器。 @api_view
用于處理基于類的視圖的類。 APIView
下面我們通過 @api_view 這個裝飾器來實現增刪查改接口
5.1、使用DRF視圖函數完成增刪查改
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework import status
from .serializers import UserInfoSerializer
from .models import UserInfo
# Create your views here.
@api_view(['GET', 'POST'])
def user_list(request):# 判斷請求方法:if request.method == 'GET':# 查詢所有的用戶信息users = UserInfo.objects.all()# 創建序列化器對象ser = UserInfoSerializer(users, many=True)result = {"data": ser.data, 'code': 200, "message": "OK"}return Response(result, status=status.HTTP_200_OK)elif request.method == 'POST':# 獲取請求過來的json參數params = request.data# 創建序列化器ser = UserInfoSerializer(data=params)# 校驗請求參數if ser.is_valid():# 校驗通過,則添加數據到數據庫ser.save()return Response({'code': 201, "data": ser.data, "message": "OK"},
status=status.HTTP_201_CREATED)else:return Response({'code': 400, "message": ser.errors},
status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
def user_detail(request, id):try:obj = UserInfo.objects.get(id=id)except Exception as e:return Response('404,訪問的資源不存在', status=status.HTTP_200_OK)if request.method == 'GET':# 獲取單個資源 并返回ser = UserInfoSerializer(obj)return Response({'code': 200, "data": ser.data, "message": "OK"},
status=status.HTTP_200_OK)elif request.method == 'DELETE':# 刪除資源obj.delete()return Response(status=status.HTTP_204_NO_CONTENT)elif request.method == 'PUT':ser = UserInfoSerializer(instance=obj, data=request.data)if ser.is_valid():ser.save()return Response({'code': 200, "data": ser.data, "message": "OK"},
status=status.HTTP_200_OK)else:return Response({'code': 400, "message": ser.errors},
status=status.HTTP_400_BAD_REQUEST)
6、使用DRF給url添加后綴
1、修改視圖函數
在視圖函數后面添加參數 format ,并設置默認值為空
@api_view(['GET', 'POST'])
def user_list(request,format=None):pass
@api_view(['GET', 'PUT', 'DELETE'])
def user_detail(request, id,format=None):pass
2、修改路由配置
from django.urls import path
from . import views
from rest_framework.urlpatterns import format_suffix_patterns
urlpatterns = [
path('users/', views.user_list),
path('users/<int:id>/', views.user_detail)
]
urlpatterns = format_suffix_patterns(urlpatterns)
3、效果
訪問:http://127.0.0.1:8000/app1/users.json,返回json數據
訪問 http://127.0.0.1:8000/app1/users.api 訪問DRF自帶的接口調試頁面
7、類視圖APIView
DRF中對Django的類視圖做了更好的封裝,在Django的View的基礎上做了更多的功能擴展。接下來一起來學習Django提供的類視圖 rest_framework.views.APIView 。
7.1、 APIView 與 View 的區別:
傳入到視圖方法中的是REST framework的 Request 對象;
視圖方法可以返回REST framework的 Response 對象;
任何 APIException 異常都會被捕獲到,并且處理成合適的響應信息;
擴展了身份認證、權限檢查、流量控制這三個功能。
7.2、擴展的功能(后面講):
authentication_classes :身份認證
permissoin_classes :權限檢查
throttle_classes : 限流
7.3、基于APIView實現增刪查改
修改視圖
from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .serializers import UserInfoSerializer
from .models import UserInfo
class UserListView(APIView):def get(self, request, format=None):users = UserInfo.objects.all()# 創建序列化器對象ser = UserInfoSerializer(users, many=True)result = {"data": ser.data, 'code': 200, "message": "OK"}return Response(result, status=status.HTTP_200_OK)def post(self, request, format=None):params = request.data# 創建序列化器ser = UserInfoSerializer(data=params)# 校驗請求參數if ser.is_valid():# 校驗通過,則添加數據到數據庫ser.save()return Response({'code': 201, "data": ser.data, "message": "OK"},
status=status.HTTP_201_CREATED)else:return Response({'code': 400, "message": ser.errors},
status=status.HTTP_400_BAD_REQUEST)
class UserDetailView(APIView):def get_object(self, id):try:return UserInfo.objects.get(id=id)except UserInfo.DoesNotExist:raise Http404def get(self, request, id, format=None):obj = self.get_object(id)ser = UserInfoSerializer(obj)data = {'code': 200, "data": ser.data, "message": "OK"}return Response(data, status=status.HTTP_200_OK)def put(self, request, id, format=None):obj = self.get_object(id)ser = UserInfoSerializer(instance=obj, data=request.data)if ser.is_valid():ser.save()data = {'code': 200, "data": ser.data, "message": "OK"}return Response(data, status=status.HTTP_200_OK)else:data = {'code': 400, "message": ser.errors}return Response(data, status=status.HTTP_400_BAD_REQUEST)def delete(self, request, id, format=None):obj = self.get_object(id)obj.delete()return Response(status=status.HTTP_204_NO_CONTENT)
修改路由配置
urlpatterns = [
path('users/', views.UserListView.as_view()),
path('users/<int:id>/', views.UserDetailView.as_view())
]