Django REST framework 的快速入門教程
CRM-API項目搭建
序列器(Serializers)
首先,我們來定義一些序列器。我們來創建一個新的模塊(module)叫做 crm/rest_searializer.py
,這是我們用來描述數據是如何呈現的。
#從已存在的assets項目中導入數據models模塊 from crm import models from rest_framework import serializers # Serializers定義了API的表現形式. #顯示超連接,繼承serializers.HyperlinkedModelSerializer #顯示ID,繼承ModelSerializer class UserSerializer(serializers.ModelSerializer): class Meta: model = models.UserProfile #假設你想去多層的數據可加參數,深度 depth = 2 fields = (‘url‘, ‘email‘, ‘name‘, ‘is_staff‘,‘is_active‘,‘role‘) #註意:你想訪問role的對象(第三章表),你需要在定義一個類,將role的訪問權限也給它 class RoleSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = models.UserProfile fields = (‘name‘,)
需要註意的是,我們在這個案例中,使用了超鏈接關系(hyperlinked relations),借助的類是 HyperlinkedModelSerializer
。你也可以使用主鍵(primary key)和其它一些關系型(relationships),但超鏈接(hyperlinking)是非常好的RESTful設計。
視圖(Views)
現在我們最好是寫些視圖。打開 crm/rest_view.py 然後打起你的鍵盤吧~
from crm import models from rest_framework import viewsets from crm import rest_searializer # ViewSets 定義了 視圖(view) 的行為. class UserViewSet(viewsets.ModelViewSet): ‘‘‘ 註意 以下兩個字段名是固定的不可修改queryset,serializer_class ‘‘‘ queryset = models.UserProfile.objects.all() serializer_class = rest_searializer.UserSerializer class RoleViewSet(viewsets.ModelViewSet): ‘‘‘ 註意 以下兩個字段名是固定的不可修改queryset,serializer_class ‘‘‘ queryset = models.Role.objects.all() serializer_class = rest_searializer.RoleSerializer
比起傳統的做法,需要寫很多視圖,我們將所有的一般性行為(common behavior)組成一個 ViewSets 類。
如有需要,我們可很輕易的將其,拆分成數個單獨的視圖。但視圖組(viewsets)能讓視圖的邏輯結構清晰,而且簡潔。
URLs
寫url,crm/urls.py
from crm import views from rest_framework import routers from crm.rest_view import UserViewSet,RoleViewSet # Routers 提供了一種簡單途徑,自動地配置了URL。 router = routers.DefaultRouter() router.register(r‘users‘, UserViewSet)#需註冊 router.register(r‘roles‘, RoleViewSet) # 使用自動的URL路由,讓我們的API跑起來。 # 此外,我們也包括了登入可視化API的URLs。 urlpatterns = [ url(r‘^api/‘, include(router.urls)), #url(r‘^api-auth/‘, include(‘rest_framework.urls‘, namespace=‘rest_framework‘))#這個沒寫 ]
因為我們用了視圖組(viewsets)而不是多個視圖,我們可以為我們的API自動的生成URL配置,只需簡單的將視圖組(viewsets)註冊到router類中即可
同樣的,如果我們需要對API URLs進行單獨控制,我們可以使用普通基於類(class based)的視圖,並詳細的配置每個URL。
最後,我們為可視化API,添加登陸/登出視圖。這是可選的,但對於需要登陸驗證的API,以及可視化的API卻是非常的有用。
Settings
我們也需要一些全局設置。我們想要分頁(pagination),我們希望API只對管理用戶開發。設置模塊會在 crm/settings.py
中
INSTALLED_APPS = ( ... ‘rest_framework‘, ) #帶分頁 REST_FRAMEWORK = { ‘DEFAULT_PERMISSION_CLASSES‘: (‘rest_framework.permissions.IsAdminUser‘,), ‘PAGE_SIZE‘: 10 } #有關API相關的訪問權限的問題 REST_FRAMEWORK = { # 使用Django的標準`django.contrib.auth`權限管理類, # 或者為尚未認證的用戶,賦予只讀權限. ‘DEFAULT_PERMISSION_CLASSES‘: [ ‘rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly‘ ] }
測試
view視圖中調用接口
urls.py
urlpatterns = [ url(r‘api_test‘,views.api_test,name=‘api_test‘) ]
views.py
from crm import rest_searializer def api_test(request): if request.method == "POST": data = json.loads(request.POST.get(‘data‘)) serializer_obj = rest_searializer.UserSerializer(data=data) if serializer_obj.is_valid(): serializer_obj.save() return render(request,‘crm/api_test.html‘,locals())
api_test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>API測試</title> </head> <body> <form action="" method="POST">{% csrf_token %} <textarea name="data" id="" cols="30" rows="10" ></textarea> <input type="submit"> </form> {{ serializer_obj }} </body> </html>
Django REST framework 的快速入門教程