最近在參與的項目中須要使用到dajngo REST framework工具包進行開發,以前參與的項目幾乎都是清一色的使用原生的django(話說偶爾也會使用一下Flask,真心不怎麼喜歡這個框架),以前也有據說過這個工具包是如何的強大,奈何因爲太(lan)忙(duo)的緣由,一直沒有好好去認真學習下,這回也算是臨時抱佛腳了.前端
Django REST framework is a powerful and flexible toolkit for building Web APIs.python
Some reasons you might want to use REST framework:數據庫
中文:django
Django REST framework 是用於構建Web API 的強大而靈活的工具包。json
咱們可能想使用REST框架的一些緣由:api
萬惡的分割線=====================markdown
學習方案(學習這個工具包的前提是你早已經熟練掌握使用django)app
官方文檔網址 http://www.django-rest-framework.org/框架
快速開發官方文檔網址 http://www.django-rest-framework.org/tutorial/quickstart/ide
一.序列化(序列化,我的理解就是按照開發者的的意願獲取/更新/建立模型字段值並進行序列處理)
django基本的東西再也不贅述
示例項目目錄基本結構(項目名稱:Learning_drf/應用名稱:api):
1) 註冊應用: 項目以及應用建立完畢後,進行基本的項目配置(路由配置,settings配置),必須將app和rest_framework組件進行應用註冊.
2)建立模型,生成遷移文件,執行遷移.
3)在應用目錄下建立serializers.py文件,建立方法及功能見下圖:
說明:序列化類首先定義了一些須要被序列化/反序列化的字段,你能夠根據你的須要去選擇處理那些字段的數據, create() 和 update() 方法定義了在調用 該序列化類對象的save()方法時是如何進行建立和修改實例化對象,這裏對這兩個方法的使用進行簡單的說明:
# 視圖函數中 from rest_framework.views import APIView # 類視圖中使用,集成自該類 from rest_framework.decorators import api_view # 方法視圖中使用,是一個裝飾器,直接裝飾方法視圖 from django.contrib.auth.decorators import login_required # 原生django自帶的登陸驗證裝飾器 from rest_framework import status from rest_framework.response import Response # 直接能夠將字典數據轉換成json數據 from api.models import Snippet from api.serializers import SnippetSerializer from rest_framework.request import Request from rest_framework import exceptions @api_view(['GET', 'POST', 'PUT', 'DELETE']) # 指明容許那些請求方式進行請求
@login_required
def api_list(request): """ :param request: :return: list all snippets or create a new snippet """ if request.method == 'GET': # 向數據庫查詢數據,獲得查詢集 try: query_set = Snippet.objects.all() except Snippet.DoesNotExist: return Response(status=status.HTTP_417_EXPECTATION_FAILED) # 調用序列化類對象,返回進行了序列化的字段集合,使用serializers.data方式 獲取數據 serializers = SnippetSerializer(query_set, many=True) # 取出數據,向客戶端進行返回,Response()會將數據轉化爲json數據. return Response(serializers.data, status=status.HTTP_200_OK) # 前端提交數據,調用模型,將其保存到數據庫中 elif request.method == 'POST': # 從request對象中取出數據,將其反序列化,返回反序列化的對象 serializer = SnippetSerializer(data= request.data) # 若是反序列化的對象存在,就說明數據有效,將數據保存到數據庫中 if serializer.is_valid(): # 調用save(), 從而調用序列化對象的create()方法,建立一條數據 serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) # 修改數據 elif request.method == 'PUT': # 在rest framework 中 request對象是通過封裝的 id = request.query_params.get('id') try: query_set = Snippet.objects.get(id = id) except Snippet.DoesNotExist: return Response(status=status.HTTP_417_EXPECTATION_FAILED) serializer = SnippetSerializer(query_set,data=request.data) # 若是反序列化對象存在,就調用save()方法,從而調用update()方法 更新數據 if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) elif request.method == 'DELETE': id = request.query_params.get('id') try: query_set = Snippet.objects.get(id=id) except Snippet.DoesNotExist: return Response(status=status.HTTP_417_EXPECTATION_FAILED) # 若是須要刪除數據,直接調用delete()便可以 query_set.delete() return Response(status=status.HTTP_204_NO_CONTENT)
<<<<<<<<<<<<<<<<<<<<<<萬惡的分割線>>>>>>>>>>>>>>>>>>>>
二.路由,請求與響應
# 請求對象 # REST框架介紹了一個 請求(Request)對象,它擴展了常規的HttpResquest , # 而且,提供更靈活的請求解析。請求(Request)對象的核心功能是 request.data屬性, # 這個屬性與原生django的request.POST類似,可是它對Web APIs更加有用。 # request.POST 只處理表單數據。只對'POST'方法起做用。 # drf 的 request.data 能夠處理任意數據。對'POST','PUT','PATCH'方法起做用。
# 使用 drf 獲取GET請求的請求參數方式爲 request.query_params 返回字典
# 響應對象 # REST框架也介紹了Response對象,它是一類用未渲染內容和內容協商來決定正確的內容類型並把它返回給客戶端的模板響應(TemplateResponse) 。 # return Response(data) 根據客戶端的請求來渲染成指定的內容類型 # 狀態碼 # 老是在你的視圖中用數字的HTTP狀態碼會更加容易理解,而且若是你用其餘錯誤 # 代碼表示錯誤,就不太容易注意到了。REST框架爲每一個狀態碼(status code)提供 # 更明確的標識符,例如在狀態(status)模型中的 HTTP_400_BAD_REQUEST 就能夠表實請求錯誤 (from rest_framework import status) # 裝飾API視圖 # REST框架提供兩個裝飾器,你能夠用它們來寫API視圖。 # @api_view 裝飾器用在基於視圖的方法上。from rest_framework.decorators import api_view
# APIView 類用在基於視圖的類上. from rest_framework.views import APIView
# 路由匹配 # 在匹配到應用的urls.py文件中,匹配方式以下: from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path(r'api-auth/',include('rest_framework.urls', namespace='rest_framework')), path(r'api/', include('api.urls')), 路由到api 這個 app 的 urls.py ] # 在匹配到視圖urls.py中,匹配方式以下: from django.conf.urls import url # 用來添加格式後綴模式 from rest_framework.urlpatterns import format_suffix_patterns from api.views import api_list,snippet_detail,UserDetail, UserList urlpatterns = [ url(r'^snippet/$', api_list), url(r'^snippet/(?P<pk>[0-9]+)/$', snippet_detail), url(r'users/$', UserList.as_view()), url(r'users/(?P<pk>[0-9]+)/$', UserDetail.as_view() name="user_data"), 路由到視圖中 ]
<<<<<<<<<<<<<<<<<<<<<<萬惡的分割線>>>>>>>>>>>>>>>>>>>>
三.基於類的視圖
from rest_framework.views import APIView # 類視圖父類 from rest_framework import status # 狀態碼 from rest_framework.response import Response # 生成響應對象 from rest_framework import permissions # 進行訪問用戶的驗證 class ViewSet(APIView): # 進行用戶有效性驗證 # permission_classes = [permissions.IsAuthenticated] # 容許任何用戶進行訪問該視圖的接口,包括匿名用戶, 在某些場景中, 必須設置驗證用戶的方式,不然會拋出異常 permission_classes = [permissions.AllowAny] def get(self, request): return Response(status=status.HTTP_204_NO_CONTENT) def post(self, request): return Response(status=status.HTTP_204_NO_CONTENT)