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>
