Django-rest framework框架的安裝配置、簡介、Web API接口和Restful接口規范、基於原生django書寫滿足restful規范的接口
drf框架安裝配置
一.安裝
pip3 install djangorestframework
二.配置
# 注冊drf app
INSTALLED_APPS = [
# ...
'rest_framework',
]
三.特點
# 具體功能在具體模塊下
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.exceptions import APIException
from rest_framework.filters import OrderingFilter
from rest_framework.views import APIView
from rest_framework.pagination import PageNumberPagination
from rest_framework.settings import APISettings
# 自定義drf配置 - 在自己的settings.py
REST_FRAMEWORK = {
# 自定義修改drf的配置們
}
什么是drf框架
一、drf優點
1. Django-rest framework可以幫助我們簡化以下兩部分的代碼編寫,大大提高REST API的開發速度。
- 在序列化與反序列化時,雖然操作的數據不盡相同,但是執行的過程卻是相似的,也就是說這部分代碼是可以復用簡化編寫的。
- 在開發REST API的視圖中,雖然每個視圖具體操作的數據不同,但增、刪、改、查的實現流程基本套路化,所以這部分代碼也是可以復用簡化編寫的。
- 增:校驗請求數據 -> 執行反序列化過程 -> 保存數據庫 -> 將保存的對象序列化並返回
- 刪:判斷要刪除的數據是否存在 -> 執行數據庫刪除
- 改:判斷要修改的數據是否存在 -> 校驗請求的數據 -> 執行反序列化過程 -> 保存數據庫 -> 將保存的對象序列化並返回
- 查:查詢數據庫 -> 將數據序列化並返回
2. Django REST framework 框架是一個用於構建Web API 的強大而又靈活的工具。通常簡稱為DRF框架或REST framework。
3. DRF框架是建立在Django框架基礎之上,由Tom Christie大牛二次開發的開源項目。
二、特點
- 提供了定義序列化器Serializer的方法,可以快速根據 Django ORM 或者其它庫自動序列化/反序列化;
- 提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫;
- 豐富的定制層級:函數視圖、類視圖、視圖集合到自動生成 API,滿足各種需要;
- 多種身份認證和權限認證方式的支持;
- 內置了限流系統;
- 直觀的 API web 界面;
- 可擴展性,插件豐富
接口規范
drf框架的作用:寫接口
Web API 接口
什么是Web API接口
Web API接口就是通過網絡,規定了前后台信息交互規則的url鏈接,也就是前后台信息交互的媒介。
明確了請求方式,提供對應后台所需參數,請求url鏈接可以得到后台的響應數據。
怎么寫接口
參照某種規則(規范)書寫url鏈接,同時根據規則制定請求方式,請求數據與響應結果。
接口的四個核心部分:請求方式、請求地址、請求參數、響應結果。
Web API接口的四大特點
Web API接口和一般的url鏈接還是有區別的,Web API 接口簡單概括有下面四大特點
-
url:長得像返回數據的url鏈接
-
請求方式:get(取)、post(增)、put(整體改)、patch(局部改)、delete(刪除)
- 采用get方式請求上方接口
-
請求參數:json或xml格式的key-value類型數據
- ak:6E823f587c95f0148c19993539b99295
- region:上海
- query:肯德基
- output:json
-
響應結果:json或xml格式的數據
-
上方請求參數的output參數值決定了響應數據的格式
-
# 網絡狀態碼:200 { "status": 0, "msg": "ok", "results": [ { "name": "西游記", "img": "https://api.oldboy.com/media/img/xyj.png" } ] }
-
接口文檔的編寫:YApi 接口管理平台
接口文檔:提供給前后台開發人員與測試人員查看
YApi是去哪網大前端技術中心的一個開源可視化接口管理平台。
YApi項目可以搭建在任何本地或雲服務器上,完成后台項目開發時的接口編寫。為開發、測試等人員提供可視化的接口預覽。
YApi進行接口編寫的步驟:
- 訪問測試網站
- 創建接口項目
- 創建接口
- 編寫接口
接口測試工具:Postman
Postman是一款接口調試工具,是一款免費的可視化軟件,同時支持各種操作系統平台,是測試接口的首選工具。
Postman可以直接從官網:https://www.getpostman.com/downloads/ 下載獲得,然后進行傻瓜式安裝。
Restful 接口規范
Restful 作為目前最流行的API設計規范,一定有着它獨有的魅力:強大、簡潔、易上手。
URL設計
數據的安全保障
url鏈接一般都采用https協議進行傳輸。
注:采用https協議,可以提高數據交互過程中的安全性
接口特征表現
要用api關鍵字標識接口url:
上面兩種形式都可以
注:看到api字眼,就代表該請求url鏈接是完成前后台數據交互的。
多數據版本共存
要在url鏈接中標識數據版本
注:url鏈接中的v1、v2就是不同數據版本的體現(只有在一種數據資源有多版本的情況下)
數據即是資源
接口一般都是完成前后台數據的交互,交互的數據稱之為資源。
eg:
注:一般提倡用資源的復數形式,在url鏈接中盡量不要出現操作資源的動詞,錯誤示范:https://api.baidu.com/delete-user
特殊的接口可以出現動詞,因為這些接口一般沒有一個明確的資源,或是動詞就是接口的核心含義:
資源操作方式由請求方式決定
操作資源一般都會涉及到增刪改查,我們提供請求方式來標識增刪改查動作
eg:
- https://api.baidu.com/books - get請求:獲取所有書
- https://api.baidu.com/books/1 - get請求:獲取主鍵為1的書
- https://api.baidu.com/books - post請求:新增一本書
- https://api.baidu.com/books/1 - put請求:整體修改主鍵為1的書
- https://api.baidu.com/books/1 - patch請求:局部修改主鍵為1的書
- https://api.baidu.com/books/1 - delete請求:刪除主鍵為1的書
響應狀態碼
正常響應
響應狀態碼2xx:
- 200:常規請求
- 201:創建成功
重定向響應
響應狀態碼3xx:
- 301:永久重定向
- 302:暫時重定向
客戶端異常
響應狀態碼4xx:
- 403:請求無權限
- 404:請求路徑不存在
- 405:請求方法不存在
服務器異常
響應狀態碼5xx:
- 500:服務器異常
響應結果
響應數據要有狀態碼、狀態信息以及數據本身
{
"status":0, //狀態響應碼
"message":"ok", //狀態信息
"results":[ //響應數據
{
"name":"肯德基(羅餐廳)",
"location":{
"lat":31.415354,
"lng":121.357339
},
"address":"月羅路2380號",
"province":"上海市",
"city":"上海市",
"area":"寶山區",
"street_id":"339ed41ae1d6dc320a5cb37c",
"telephone":"(021)56761006",
"detail":1,
"uid":"339ed41ae1d6dc320a5cb37c"
}
...
]
}
需要url請求的資源需要訪問資源的請求鏈接
{
"status": 0,
"msg": "ok",
"results":[
{
"name": "肯德基",
"img": "https://image.baidu.com/kfc/001.png"
}
]
}
基於原生django書寫滿足restful規范的接口
兩個url 對應 一個視圖類 完成十大接口,用到路由分發
路由分發需要在app文件夾下也創建一個urls.py文件
項目名下的urls.py
from django.conf.urls import url, include
from django.contrib import admin
from api import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.Test.as_view()),
# 路由分發
url(r'^api/', include('api.urls')),
]
app名下的urls.py:api\urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^books/$', views.Book.as_view()), # 群查
url(r'^books/(?P<pk>\d+)/$', views.Book.as_view()), # 單查
]
上面兩個url都對應視圖函數文件內的視圖類Book
view.py
from django.http import JsonResponse
from django.views import View
from . import models
from rest_framework.views import APIView
class Book(View):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk', None)
if pk: # 單查
book_dic = models.Book.objects.filter(pk=pk).values('name', 'price').first()
results = book_dic
else: # 群查
book_query = models.Book.objects.values('name', 'price')
results = list(book_query)
if not results:
return JsonResponse({
'status': 1,
'msg': 'data error',
})
return JsonResponse({
'status': 0,
'msg': 'ok',
'results': results
})
CBV請求生命周期
as_view()方法完成路由匹配 => url請求會調用as_view()的返回值視圖函數view => 調用dispatch()方法完成請求分發 => 視圖類的具體視圖方法處理請求 => 返回給前台
