Django REST framework 使用簡記


 

  最近在參與的項目中需要使用到dajngo REST framework工具包進行開發,之前參與的項目幾乎都是清一色的使用原生的django(話說偶爾也會使用一下Flask,真心不怎么喜歡這個框架),之前也有聽說過這個工具包是如何的強大,奈何由於太(lan)忙(duo)的原因,一直沒有好好去認真學習下,這回也算是臨時抱佛腳了.

Django rest framework介紹(純屬從其他博客粘貼復制過來的) 

Django REST framework is a powerful and flexible toolkit for building Web APIs.

Some reasons you might want to use REST framework:

中文:

Django REST framework 是用於構建Web API 的強大而靈活的工具包。

我們可能想使用REST框架的一些原因:

  • Web瀏覽API對於開發人員來說是一個巨大的可用性。
  • 認證策略包括OAuth1a和OAuth2的包。
  • 支持ORM和非ORM數據源的序列化。
  • 如果你不需要更強大的功能,就可以使用常規的基於功能的視圖。
  • 廣泛的文檔和良好的社區支持。
  • 包括Mozilla、Red Hat、Heroku和Eventbrite在內的國際知名公司使用和信任。

 

開發環境配置  

  • python
  • pip install django
  • pip install djangorestframework
  • pip install markdown
  • pip install django-filter                                                                                    

 萬惡的分割線=====================

學習方案(學習這個工具包的前提是你早已經熟練掌握使用django)

官方文檔網址 http://www.django-rest-framework.org/

快速開發官方文檔網址 http://www.django-rest-framework.org/tutorial/quickstart/

  • 序列化
  • 請求與響應
  • 基於視圖的類
  • 授權與權限
  • 關系與超鏈接
  • 視圖集與路由

一.序列化(序列化,個人理解就是按照開發者的的意願獲取/更新/創建模型字段值並進行序列處理)

  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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM