python后端之DRF框架(上篇)

一、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())
]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91955.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91955.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91955.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

信創數據庫-DM(達夢)數據庫安裝教程

官方安裝文檔在這&#xff1a;安裝前準備 | 達夢技術文檔 本文也是基于這個來寫的&#xff0c;微調了一下。 1&#xff0c;下載安裝包 體驗版直接到官方下載即可&#xff1a;產品下載 | 達夢在線服務平臺 如果是有需要商業版等&#xff0c;需要聯系客服申請。 安裝包要選擇CPU…

docker常用命令集(6)

接前一篇文章&#xff1a;docker常用命令集&#xff08;5&#xff09; 本文內容參考&#xff1a; Docker login/logout 命令 | 菜鳥教程 Docker命令_docker login-CSDN博客 特此致謝&#xff01; 9. docker login 簡介 docker login命令用于登錄到docker注冊表&#xff08…

[LINUX操作系統]shell腳本之循環

1.編寫腳本for1.sh,使用for循環創建20賬戶&#xff0c;賬戶名前綴由用戶從鍵盤輸入&#xff0c;賬戶初始密碼由用戶輸入&#xff0c;例如:test1、test2、test3......[rootmaster ~]# vim for1.sh #!/bin/bashread -p "請輸入賬戶名稱前綴&#xff1a;" prefixread -p…

空間設計:不是餐廳的裝飾游戲

餐廳空間設計&#xff0c;是通過布局規劃與環境營造&#xff0c;將功能需求、品牌調性與顧客體驗融合的系統性工程 —— 它不僅決定顧客「坐得舒不舒服」&#xff0c;更影響「愿不愿意再來」「會不會主動分享」的消費決策。體驗感知的第一觸點&#xff1a;顧客進門 3 秒內&…

XSS-DOM 2

目錄 1 DOMPurify 1.1 漏洞源碼 1.2 加載框架 ?編輯 setTimeout 1.3 ok&#xff1f; 1.4 window和document 1.5 Overwrite&#xff08;document.x&#xff09; 1.5.1 打印cookie 1.6 Overwrite2&#xff08;document.x.y&#xff09; 1.6.1 form表單 1.7 toString…

從數據丟失到動畫流暢:React狀態同步與遠程數據加載全解析

在前端開發中&#xff0c;數據狀態管理與界面同步始終是核心挑戰。近期我在處理一個書簽管理應用時&#xff0c;遇到了遠程數據加載后無法顯示、界面更新異常&#xff0c;甚至動畫閃爍等一系列問題。經過多輪調試與優化&#xff0c;最終實現了數據的正確加載與流暢的界面交互。…

MySQL半同步復制機制詳解:AFTER_SYNC vs AFTER_COMMIT 的優劣與選擇

目錄深入分析與利弊對比1. AFTER_COMMIT (不推薦)2. AFTER_SYNC (強烈推薦&#xff0c;MySQL 8.0 默認)總結與強烈建議最佳實踐 MySQL 半同步復制主要有兩種實現方式&#xff0c;其核心區別在于主庫何時回復客戶端事務提交成功&#xff08;即何時認為事務完成&#xff09;&…

GEE實戰 | 4種非監督分類算法深度解析,附可直接運行的完整代碼

在遙感影像處理領域&#xff0c;非監督分類憑借其無需人工標注樣本的優勢&#xff0c;成為快速了解地物分布的得力助手。它能自動依據像素光譜特征的相似性完成聚類&#xff0c;這種“無師自通”的特性&#xff0c;讓地理空間分析變得更加高效。 今天&#xff0c;我們就來深入…

基于落霞歸雁思維框架的軟件需求管理實踐指南

作者&#xff1a;落霞歸雁 日期&#xff1a;2025-08-02 摘要 在 VUCA 時代&#xff0c;需求變更成本已占軟件總成本的 40% 以上。本文將“落霞歸雁”思維框架&#xff08;觀察現象 → 找規律 → 應用規律 → 實踐驗證&#xff09;引入需求工程全生命周期&#xff0c;通過 4 個階…

企業級AI Agent構建實踐:從理論到落地的完整指南

&#x1f680; 引言 隨著人工智能技術的快速發展&#xff0c;AI應用正在從簡單的工具轉變為智能伙伴。企業級AI Agent作為這一變革的核心載體&#xff0c;正在重新定義我們與軟件系統的交互方式。本文將深入探討如何構建一個真正意義上的企業級AI Agent系統。 &#x1f3af; …

電商項目_性能優化_限流-降級-熔斷

針對電商系統&#xff0c;在遇到大流量時&#xff0c;必須要考慮如何保障系統的穩定運行&#xff0c;常用的手段&#xff1a;限流&#xff0c;降級&#xff0c;拒絕服務。 一、限流 限流算法&#xff1a;計數器、滑動窗口、漏銅算法、令牌桶算法。 限流的方案 前端限流接入…

javaweb開發之Servlet筆記

第五章 Servlet 一 Servlet簡介 1.1 動態資源和靜態資源 靜態資源 無需在程序運行時通過代碼運行生成的資源,在程序運行之前就寫好的資源. 例如:html css js img ,音頻文件和視頻文件 動態資源 需要在程序運行時通過代碼運行生成的資源,在程序運行之前無法確定的數據,運行時…

sqli-labs靶場less26/a

less261.我們打開這一關來看一下&#xff0c;他提示我們空格和其他一些什么都被過濾了2.我們來嘗試繞過,按照之前的做法&#xff0c;可以看到閉合方式為單引號&#xff0c;并且過濾了--與#3.我們來嘗試繞過一下&#xff0c;發現可以以下的方式繞過&#xff0c;空格用&#xff0…

從Docker銜接到導入黑馬商城以及前端登錄顯示用戶或密碼錯誤的相關總結(個人理解,僅供參考)

目錄 一、前言 二、從Docker銜接到導入黑馬點評 三、談談端口映射及我的前端登錄顯示用戶或密碼錯誤 四、總結 一、前言 在學習24黑馬SpringCloud課程時&#xff0c;說實話Docker那一塊再到導入黑馬商城是真的有點折磨&#xff0c;個人感覺老師水平還是很強的&#xff0c;但…

控制建模matlab練習10:滯后補償器

此練習主要是&#xff1a;關于滯后補償器。 ①滯后補償器作用&#xff1b; ②不同滯后補償器的效果&#xff1b; 一、為什么使用滯后補償器 滯后補償器&#xff1a;主要用于改善系統的穩態誤差&#xff1b;滯后補償器設計思路&#xff1a;同時為系統增加一個極點和零點&#xf…

力扣-108.將有序數組轉換為二叉搜索樹

題目鏈接 108.將有序數組轉換為二叉搜索樹 class Solution {public TreeNode Traverse(int[] nums, int begin, int end) {if (end < begin)return null;int mid (begin end) / 2;TreeNode root new TreeNode(nums[mid]);root.left Traverse(nums, begin, mid - 1);ro…

`npm error code CERT_HAS_EXPIRED‘ 問題

問題: npm error code CERT_HAS_EXPIRED npm error errno CERT_HAS_EXPIRED npm error request to https://r2.cnpmjs.org/string_decoder/-/string_decoder-1.3.0.tgz failed, reason: certificate has expired npm error A complete log of this run can be found in: /home…

數據結構---概念、數據與數據之間的關系(邏輯結構、物理結構)、基本功能、數據結構內容、單向鏈表(概念、對象、應用)

數據結構在數據結構部分&#xff0c;研究數據在內存中如何存儲。數據存儲的形式有兩種&#xff1a;變量和數組&#xff08;數據結構的順序表&#xff09;。一、什么是數據結構&#xff1f;數據類型被用來組織和存儲數據。程序設計 數據結構 算法二、數據與數據之間的關系1、邏…

CMS框架漏洞

一、WordPress姿勢一1.下載vulhub靶場cd /vulhub/wordpress/pwnscriptum docker-compose up -d2.我們進入后臺&#xff0c;網址拼接/wp-admin/3.我們進入WP的模板寫入一句話木馬后門并訪問其文件即可GetShell4然后我們拼接以下路徑/wp-content/themes/twentyfifteen/404.php&am…

控制建模matlab練習07:比例積分控制-③PI控制器的應用

此練習主要是比例積分控制&#xff0c;包括三部分&#xff1a; ①系統建模&#xff1b; ②PI控制器&#xff1b; ③PI控制器的應用&#xff1b; 以下是&#xff0c;第③部分&#xff1a;PI控制器的應用。 一、比例積分控制的應用模型 1、整個系統是如圖&#xff0c;這樣一個單位…