《Django By Example》第十二章(終章) 中文 翻譯 (個人學習,渣翻)

epub格式下載 感謝@Cluas

鏈接: https://pan.baidu.com/s/1kVGavLd 密碼: raxg

全文鏈接

第一章 創建一個blog應用
第二章 使用高級特性來增強你的blog
第三章 擴展你的blog應用
第四章上 創建一個社交網站
第四章下 創建一個社交網站
第五章 在你的網站中分享內容
第六章 跟蹤用戶動作
第七章 建立一個在線商店
第八章 管理付款和訂單
第九章上 擴展你的商店
第九章下 擴展你的商店
第十章上 創建一個在線學習平臺
第十章下 創建一個在線學習平臺
第十一章 緩存內容
第十二章 構建一個API

書籍出處:https://www.packtpub.com/web-development/django-example
原作者:Antonio Melé

(譯者注:第十二章,全書最后一章,終于到這章了。)

第十二章

構建一個API

在上一章中,你構建了一個學生注冊系統和課程報名。你創建了用來展示課程內容的視圖以及如何使用Django的緩存框架。在這章中,你將學習如何做到以下幾點:

  • 構建一個 RESTful API
  • 用API視圖操作認證和權限
  • 創建API視圖放置和路由

構建一個RESTful API

你可能想要創建一個接口給其他的服務來與你的web應用交互。通過構建一個API,你可以允許第三方來消費信息以及程序化的操作你的應用程序。

你可以通過很多方法構成你的API,但是我們最鼓勵你遵循REST原則。REST體系結構來自Representational State Transfer。RESTful API是基于資源的(resource-based)。你的模型代表資源和HTTP方法例如GET,POST,PUT,以及DELETE是被用來取回,創建,更新,以及刪除對象的。HTTP響應代碼也可以在上下文中使用。不同的HTTP響應代碼的返回用來指示HTTP請求的結果,例如,2XX響應代碼用來表示成功,4XX表示錯誤,等等。

在RESTful API中最通用的交換數據是JSON和XML。我們將要為我們的項目構建一個JSON序列化的REST API。我們的API會提供以下功能:

  • 獲取科目
  • 獲取可用的課程
  • 獲取課程內容
  • 課程報名

我們可以通過創建定制視圖從Django開始構建一個API。當然,有很多第三方的模塊可以給你的項目簡單的創建一個API,其中最有名的就是Django Rest Framework。

安裝Django Rest Framework

Django Rest Framework允許你為你的項目方便的構建REST APIs。你可以通過訪問 http://www.django-rest-framework.org 找到所有REST Framework信息。

打開shell然后通過以下命令安裝這個框架:

pip install djangorestframework=3.2.3

編輯educa項目的settings.py文件,在INSTALLED_APPS設置中添加rest_framework來激活這個應用,如下所示:

INSTALLED_APPS = (
       # ...
       'rest_framework',
   )

之后,添加如下代碼到settings.py文件中:

REST_FRAMEWORK = {
       'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
       ]
}

你可以使用REST_FRAMEWORK設置為你的API提供一個指定的配置。REST Framework提供了一個廣泛的設置去配置默認的行為。DEFAULT_PERMISSION_CLASSES配置指定了去讀取,創建,更新或者刪除對象的默認權限。我們設置DjangoModelPermissionsOrAnonReadOnly作為唯一的默認權限類。這個類依賴與Django的權限系統允許用戶去創建,更新,或者刪除對象,同時提供只讀的訪問給陌生人用戶。你會在之后學習更多關于權限的方面。

如果要找到一個完整的REST框架可用設置列表,你可以訪問 http://www.django-rest-framework.org/api-guide/settings/

定義序列化器

設置好REST Framework之后,我們需要指定我們的數據將會如何序列化。輸出的數據必須被序列化成指定的格式,并且輸出的數據將會給進程去序列化。REST框架提供了以下類來給單個對象去構建序列化:

  • Serializer:給一般的Python類實例提供序列化。
  • ModelSerializer:給模型實例提供序列化。
  • HyperlinkedModelSerializer:類似與ModelSerializer,但是代表與鏈接而不是主鍵的對象關系。

讓我們構建我們的第一個序列化器。在courses應用目錄下創建以下文件結構:

api/
    __init__.py
    serializers.py

我們將會在api目錄中構建所有的API功能為了保持一切都有良好的組織。編輯serializeers.py文件,然后添加以下代碼:

from rest_framework import serializers
from ..models import Subject

class SubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        fields = ('id', 'title', 'slug')

以上是給Subject模型使用的序列化器。序列化器以一種類似的方式被定義給Django
FromModelForm類。Meta類允許你去指定模型序列化以及給序列化包含的字段。所有的模型字段都會被包含如果你沒有設置一個fields屬性。

讓我們嘗試我們的序列化器。打開命令行通過`python manage.py shell*開始Django shell。運行以下代碼:

from courses.models import Subject
from courses.api.serializers import SubjectSerializer
subject = Subject.objects.latest('id')
serializer = SubjectSerializer(subject)
serializer.data

在上面的例子中,我們拿到了一個Subject對象,創建了一個SubjectSerializer的實例,并且訪問序列化的數據。你會得到以下輸出:

{'slug': 'music', 'id': 4, 'title': 'Music'}

如你所見,模型數據被轉換成了Python的數據類型。

了解解析器和渲染器

在你在一個HTTP響應中返回序列化數據之前,這個序列化數據必須使用指定的格式進行渲染。同樣的,當你拿到一個HTTP請求,在你使用這個數據操作之前你必須解析傳入的數據并且反序列化這個數據。REST Framework包含渲染器和解析器來執行以上操作。

讓我們看下如何解析傳入的數據。給予一個JSON字符串輸入,你可以使用REST康佳提供的JSONParser類來轉變它成為一個Python對象。在Python shell中執行以下代碼:

from io import BytesIO
from rest_framework.parsers import JSONParser
data = b'{"id":4,"title":"Music","slug":"music"}'
JSONParser().parse(BytesIO(data))

你將會拿到以下輸出:

{'id': 4, 'title': 'Music', 'slug': 'music'}

REST Framework還包含Renderer類,該類允許你去格式化API響應。框架會查明通過的內容使用的是哪種渲染器。它對響應進行檢查,根據請求的Accept頭去預判內容的類型。除此以外,渲染器可以通過URL的格式后綴進行預判。舉個例子,訪問將會出發JSONRenderer為了返回一個JSON響應。

回到shell中,然后執行以下代碼去從提供的序列化器例子中渲染serializer對象:

from rest_framework.renderers import JSONRenderer
JSONRenderer().render(serializer.data)

你會看到以下輸出:

b'{"id":4,"title":"Music","slug":"music"}'

我們使用JSONRenderer去渲染序列化數據為JSON。默認的,REST Framework使用兩種不同的渲染器:JSONRendererBrowsableAPIRenderer。后者提供一個web接口可以方便的瀏覽你的API。你可以通過REST_FRAMEWORK設置的DEFAULT_RENDERER_CLASSES選項改變默認的渲染器類。

你可以找到更多關于渲染器和解析器的信息通過訪問 http://www.django-rest-framework.org/api-guide/renderers/ 以及 http://www.django-rest- framework.org/api-guide/parsers/

構建列表和詳情視圖

REST Framework自帶一組通用視圖和mixins,你可以用來構建你自己的API。它們提供了獲取,創建,更新以及刪除模型對象的功能。你可以看到所有REST Framework提供的通用mixins和視圖,通過訪問 http://www.django-rest-framework.org/api-guide/generic-views/

讓我們創建列表和詳情視圖去取回Subject對象們。在courses/api/目錄下創建一個新的文件并命名為views.py。添加如下代碼:

from rest_framework import generics
from ..models import Subject
from .serializers import SubjectSerializer

class SubjectListView(generics.ListAPIView):
    queryset = Subject.objects.all()
    serializer_class = SubjectSerializer

class SubjectDetailView(generics.RetrieveAPIView):
    queryset = Subject.objects.all()
    serializer_class = SubjectSerializer

在這串代碼中,我們使用REST Framework提供的ListAPIViewRetrieveAPIView視圖。我們給給予的關鍵值包含了一個pk URL參數給詳情視圖去取回對象。兩個視圖都有以下屬性:

  • queryset:基礎查詢集用來取回對象。
  • serializer_class:這個類用來序列化對象。

讓我們給我們的視圖添加URL模式。在courses/api/目錄下創建新的文件并命名為urls.py并使之看上去如下所示:

from django.conf.urls import url
from . import views

urlpatterns = [
       url(r'^subjects/$',
           views.SubjectListView.as_view(),
           name='subject_list'),
       url(r'^subjects/(?P<pk>\d+)/$',
           views.SubjectDetailView.as_view(),
           name='subject_detail'),
]

編輯educa項目的主urls.py文件并且包含以下API模式:

urlpatterns = [
    # ...
    url(r'^api/', include('courses.api.urls', namespace='api')),
]

我們給我們的API URLs使用api命名空間。確保你的服務器已經通過命令python manange.py runserver啟動。打開shell然后通過cURL獲取URL http://127.0.0.1:8000/api/subjects/ 如下所示:

$ curl http://127.0.0.1:8000/api/subjects/

你會獲取類似以下的響應:

[{"id":2,"title":"Mathematics","slug":"mathematics"},{"id":4,"title":"Music","slug":"music"},{"id":3,"title":"Physics","slug":"physics"},{"id":1,"title":"Programming","slug":"programming"}]

這個HTTP響應包含JSON格式的一個Subject對象列。如果你的操作系統沒有安裝過cURL,你可還可以使用其他的工具去發送定制HTTP請求例如一個瀏覽器擴展 Postman ,這個擴展你可以在 https://www.getpostman.com 找到。

在你的瀏覽器中打開 http://127.0.0.1:8000/api/subjects/ 。你會看到如下所示的REST Framework的可瀏覽API:

django-12-1

這個HTML界面由BrowsableAPIRenderer渲染器提供。它展示了結果頭和內容并且允許執行請求。你還可以在URL包含一個Subject對象的id來訪問該對象的API詳情視圖。在你的瀏覽器中打開 http://127.0.0.1:8000/api/subjects/1/ 。你將會看到一個單獨的渲染成JSON格式的Subject對象。

創建嵌套的序列化

我們將要給Course模型創建一個序列化。編輯api/serializers.py文件并添加以下代碼:

from ..models import Course

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ('id', 'subject', 'title', 'slug', 'voerview',
                  'created', 'owner', 'modules')

讓我們看下一個Course對象是如何被序列化的。打開shell,運行python manage.py shell,然后運行以下代碼:

from rest_framework.renderers import JSONRenderer
from courses.models import Course
from courses.api.serializers import CourseSerializer
course = Course.objects.latest('id')
serializer = CourseSerializer(course)
JSONRenderer().render(serializer.data)

你將會通過我們包含在CourseSerializer中的字段獲取到一個JSON對象。你可以看到modules管理器的被關聯對象唄序列化成一列關鍵值,如下所示:

"modules": [17, 18, 19, 20, 21, 22]

我們想要包含個多的信息關于每一個模塊,所以我們需要序列化Module對象以及嵌套它們。修改api/serializers.py文件提供的代碼,使之看上去如下所示:

from rest_framework import serializers
from ..models import Course, Module
   
class ModuleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Module
        fields = ('order', 'title', 'description')

class CourseSerializer(serializers.ModelSerializer):
    modules = ModuleSerializer(many=True, read_only=True)
    class Meta:
        model = Course
        fields = ('id', 'subject', 'title', 'slug', 'overview',
                    'created', 'owner', 'modules')

我們給Module模型定義了一個ModuleSerializer去提供序列化。之后我們添加一個modules屬性給CourseSerializer去嵌套ModuleSerializer序列化器。我們設置many=True去表明我們正在序列化多個對象。read_only參數表明這個字段是只讀的并且不可以被包含在任何輸入中去創建或者升級對象。

打開shell并且再次創建一個CourseSerializer的實例。使用JSONRenderer渲染序列化器的data屬性。這一次,被排列的模塊會被通過嵌套的ModuleSerializer序列化器給序列化,如下所示:

"modules": [
        {
           "order": 0,
           "title": "Django overview",
           "description": "A brief overview about the Web Framework."
        }, 
        {
            "order": 1,
            "title": "Installing Django",
            "description": "How to install Django."
        },
        ... 
]

你可以找到更多關于序列化器的內容,通過訪問 http://www.django-rest-framework.org/api-guide/serializers/

構建定制視圖

REST Framework提供一個APIView類,這個類基于Django的View類構建API功能。APIView類與View在使用REST Framework的定制Request以及Response對象時不同,并且操作APIException例外的返回合適的HTTP響應。它還有一個內建的驗證和認證系統去管理視圖的訪問。

我們將要創建一個視圖給用戶去對課程進行報名。編輯api/views.py文件并且添加以下代碼:

from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from rest_framework.response import Response
from ..models import Course

class CourseEnrollView(APIView):
    def post(self, request, pk, format=None):
        course = get_object_or_404(Course, pk=pk)
        course.students.add(request.user)
        return Response({'enrolled': True})

CourseEnrollView視圖操縱用戶對課程進行報名。以上代碼解釋如下:

  • 我們創建了一個定制視圖,是APIView的子類。
  • 我們給POST操作定義了一個post()方法。其他的HTTP方法都不允許放這個這個視圖。
  • 我們預計一個pkURL參數會博涵一個課程的ID。我們通過給予的pk參數獲取這個課程,并且如果這個不存在的話就拋出一個404異常。
  • 我們添加當前用戶給Course對象的students多對多關系并放回一個成功響應。

編輯api/urls.py文件并且給CourseEnrollView視圖添加以下URL模式:

url(r'^courses/(?P<pk>\d+)/enroll/$',
       views.CourseEnrollView.as_view(),
       name='course_enroll'),

理論上,我們現在可以執行一個POST請求去給當前用戶對一個課程進行報名。但是,我們需要辨認這個用戶并且阻止為認證的用戶來訪問這個視圖。讓我們看下API認證和權限是如何工作的。

操縱認證

REST Framework提供認證類去辨別用戶執行的請求。如果認證成功,這個框架會在request.user中設置認證的User對象。如果沒有用戶被認證,一個Django的AnonymousUser實例會被代替。

REST Framework提供以下認證后臺:

  • BasicAuthentication:HTTP基礎認證。用戶和密碼會被編譯為Base64并被客戶端設置在Authorization HTTP頭中。你可以學習更多關于它的內容,通過訪問 https://en.wikipedia.org/wiki/Basic_access_authentication
  • TokenAuthentication:基于token的認證。一個Token模型被用來存儲用戶tokens。用來認證的Authorization HTTP頭里面擁有包含token的用戶。
  • SessionAuthentication:使用Djnago的會話后臺(session backend)來認證。這個后臺從你的網站前端來執行認證AJAX請求給API是非常有用的。

你可以創建一個通過繼承REST Framework提供的BaseAuthentication類的子類以及重寫authenticate()方法來構建一個定制的認證后臺。

你可以在每個視圖的基礎上設置認證,或者通過DEFAULT_AUTHENTICATION_CLASSES設置為全局認證。

認證只能失敗用戶正在執行的請求。它無法允許或者組織視圖的訪問。你必須使用權限去限制視圖的訪問。

你可以找到關于認證的所有信息,通過訪問 http://www.django-rest- framework.org/api-guide/authentication/

讓我們給我們的視圖添加BasicAuthentication。編輯courses應用的api/views.py文件,然后給CourseEnrollView添加一個authentication_classes屬性,如下所示:

from rest_framework.authentication import BasicAuthentication

class CourseEnrollView(APIView):
    authentication_classes = (BasicAuthentication,)
    # ...

用戶將會被設置在HTTP請求中的Authorization頭里面的證書進行識別。

給視圖添加權限

REST Framework包含一個權限系統去限制視圖的訪問。一些REST Framework的內置權限如下所示:

  • AllowAny:無限制的訪問,無論當前用戶是否通過認證。
  • IsAuthenticated:只允許通過認證的用戶。
  • IsAuthenticatedOrReadOnly:通過認證的用戶擁有完整的權限。陌生用戶只允許去還行可讀的方法,例如GET, HEAD或者OPETIONS。
  • DjangoModelPermissions:權限與django.contrib.auth進行了捆綁。視圖需要一個queryset屬性。只有分配了模型權限的并經過認證的用戶才能獲得權限。
  • DjangoObjectPermissions:基于每個對象基礎上的Django權限。

如果用戶沒有權限,他們通常會獲得以下某個HTTP錯誤:

  • HTTP 401:無認證。
  • HTTP 403:沒有權限。

你可以獲得更多的關于權限的信息,通過訪問 http://www.django-rest- framework.org/api-guide/permissions/

編輯courses應用的api/views.py文件然后給CourseEnrollView添加一個permission_classes屬性,如下所示:

from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated

class CourseEnrollView(APIView):
    authentication_classes = (BasicAuthentication,)
    permission_classes = (IsAuthenticated,)
    # ...

我們包含了IsAuthenticated權限。這個權限將會組織陌生用戶訪問這個視圖。現在,我們可以之sing一個POST請求給我們的新的API方法。

確保開發服務器正在運行。打開shell然后運行以下命令:

curl -i –X POST http://127.0.0.1:8000/api/courses/1/enroll/

你將會得到以下響應:

HTTP/1.0 401 UNAUTHORIZED
...
{"detail": "Authentication credentials were not provided."}

如我們所預料的,我們得到了一個401 HTTP code,因為我們沒有認證過。讓我們帶上我們的一個用戶進行下基礎認證。運行以下命令:

curl -i -X POST -u student:password http://127.0.0.1:8000/api/courses/1/enroll/

使用一個已經存在的用戶的證書替換student:password。你會得到以下響應:

HTTP/1.0 200 OK
...
{"enrolled": true}

你可以額訪問管理站點然后檢查到上面命令中的用戶已經完成了課程的報名。

創建視圖設置和路由

ViewSets允許你去定義你的API的交互并且讓REST Framework通過一個Router對象動態的構建URLs。通過使用視圖設置,你可以避免給多個視圖重復編寫相同的邏輯。視圖設置包含典型的創建,獲取,更新,刪除選項操作,它們是 list(),create(),retrieve(),update(),partial_update()以及destroy()

讓我們給Course模型創建一個視圖設置。編輯api/views.py文件然后添加以下代碼:

from rest_framework import viewsets
from .serializers import CourseSerializer

class CourseViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

我們創建了一個繼承ReadOnlyModelViewSet類的子類,被繼承的類提供了只讀的操作 list()retrieve(),前者用來排列對象,后者用來取回一個單獨的對象。編輯api/urls.py文件并且給我們的視圖設置創建一個路由,如下所示:

from django.conf.urls import url, include
from rest_framework import routers
from . import views

router = routers.DefaultRouter()
router.register('courses', views.CourseViewSet)

urlpatterns = [
    # ...
    url(r'^', include(router.urls)),
]

我們創建兩個一個DefaultRouter對象并且通過courses前綴注冊了我們的視圖設置。這個路由負責給我們的視圖動態的生成URLs。

在你的瀏覽器中打開 http://127.0.0.1:8000/api/ 。你會看到路由排列除了所有的視圖設置在它的基礎URL中,如下圖所示:

django-12-2

你可以訪問 http://127.0.0.1:8000/api/courses/ 去獲取課程的列表。

你可以學習到跟多關于視圖設置的內容,通過訪問 http://www.django-rest-framework.org/api-guide/viewsets/ 。你也可以找到更多關于路由的信息,通過訪問 http://www.django-rest-framework.org/api-guide/routers/

給視圖設置添加額外的操作

你可以給視圖設置添加額外的操作。讓我們修改我們之前的CourseEnrollView視圖成為一個定制的視圖設置操作。編輯api/views.py文件然后修改CourseViewSet類如下所示:

from rest_framework.decorators import detail_route

class CourseViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer
    @detail_route(methods=['post'],
                authentication_classes=[BasicAuthentication],
                permission_classes=[IsAuthenticated])
    def enroll(self, request, *args, **kwargs):
        course = self.get_object()
        course.students.add(request.user)
        return Response({'enrolled': True})

我們添加了一個定制enroll()方法相當于給這個視圖設置的一個額外的操作。以上的代碼解釋如下:

  • 我們使用框架的detail_route裝飾器去指定這個類是一個在一個單獨對象上被執行的操作。
  • 這個裝飾器允許我們給這個操作添加定制屬性。我們指定這個視圖只允許POST方法,并且設置了認證和權限類。
  • 我們使用self.get_object()去獲取Course對象。
  • 我們給students添加當前用戶的多對多關系并且返回一個定制的成功響應。

編輯api/urls.py文件并移除以下URL,因為我們不再需要它們:

url(r'^courses/(?P<pk>[\d]+)/enroll/$',
       views.CourseEnrollView.as_view(),
       name='course_enroll'),

之后編輯api/views.py文件并且移除CourseEnrollView類。

這個用來在課程中報名的URL現在已經是由路由動態的生成。這個URL保持不變,因為它使用我們的操作名enroll動態的進行構建。

創建定制權限

我們想要學生可以訪問他們報名過的課程的內容。只有在這個課程中報名過的學生才能訪問這個課程的內容。最好的方法就是通過一個定制的權限類。Django提供了一個BasePermission類允許你去定制以下功能:

  • has_permission():視圖級的權限檢查。
  • has_object_permission():實例級的權限檢查。

以上方法會返回True來允許訪問,相反就會返回False。在courses/api/中創建一個新的文件并命名為permissions.py。添加以下代碼:

from rest_framework.permissions import BasePermission

class IsEnrolled(BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj.students.filter(id=request.user.id).exists()

我們創建了一個繼承BasePermission類的子類,并且重寫了has_object_permission()。我們檢查執行請求的用戶是否存在Course對象的students關系。我們下一步將要使用IsEnrolled權限。

序列化課程內容

我們需要序列化課程內容。Content模型包含一個通用的外鍵允許我們去關聯不同的內容模型對象。然而,我們給上一章中給所有的內容模型添加了一個公用的render()方法。我們可以使用這個方法去提供渲染過的內容給我們的API。

編輯courses應用的api/serializers.py文件并且添加以下代碼:

from ..models import Content

class ItemRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        return value.render()
        
class ContentSerializer(serializers.ModelSerializer):
    item = ItemRelatedField(read_only=True)
    class Meta:
        model = Content
        fields = ('order', 'item')

在以上代碼中,我們通過子類化REST Framework提供的RealtedField序列化器字段定義了一個定制字段并且重寫了to_representation()方法。我們給Content模型定義了ContentSerializer序列化器并且使用定制字段給item生成外鍵。

我們需要一個替代序列化器給Module模型來包含它的內容,以及一個擴展的Course序列化器。編輯api/serializers.py文件并且添加以下代碼:

   class ModuleWithContentsSerializer(serializers.ModelSerializer):
       contents = ContentSerializer(many=True)
       class Meta:
           model = Module
           fields = ('order', 'title', 'description', 'contents')
           
   class CourseWithContentsSerializer(serializers.ModelSerializer):
       modules = ModuleWithContentsSerializer(many=True)
       class Meta:
           model = Course
           fields = ('id', 'subject', 'title', 'slug',
                     'overview', 'created', 'owner', 'modules')           

讓我們創建一個視圖來模仿retrieve()操作的行為但是包含課程內容。編輯api/views.py文件添加以下方法給CourseViewSet類:

   from .permissions import IsEnrolled
   from .serializers import CourseWithContentsSerializer
   
   class CourseViewSet(viewsets.ReadOnlyModelViewSet):
       # ...
       @detail_route(methods=['get'],
                     serializer_class=CourseWithContentsSerializer,
                     authentication_classes=[BasicAuthentication],
                     permission_classes=[IsAuthenticated,
                                         IsEnrolled])
       def contents(self, request, *args, **kwargs):
           return self.retrieve(request, *args, **kwargs)

以上的方法解釋如下:

  • 我們使用detail_route裝飾器去指定這個操作是在一個單獨的對象上進行執行。
  • 我們指定只有GET方法允許訪問這個操作。
  • 我們使用新的CourseWithContentsSerializer序列化器類來包含渲染過的課程內容。
  • 我們使用IsAuthenticated和我們的定制IsEnrolled權限。只要做到了這點,我們可以確保只有在這個課程中報名的用戶才能訪問這個課程的內容。
  • 我們使用存在的retrieve()操作去返回課程對象。

在你的瀏覽器中打開 http://127.0.0.1:8000/api/courses/1/contents/ 。如果你使用正確的證書訪問這個視圖,你會看到這個課程的每一個模塊都包含給渲染過的課程內容的HTML,如下所示:

   {
   "order": 0,
   "title": "Installing Django",
   "description": "",
   "contents": [
        {
        "order": 0,
        "item": "<p>Take a look at the following video for installing Django:</p>\n"
        }, 
        {
        "order": 1,
        "item": "\n<iframe width=\"480\" height=\"360\" src=\"http://www.youtube.com/embed/bgV39DlmZ2U?wmode=opaque\" frameborder=\"0\" allowfullscreen></iframe>\n\n"
        } 
    ]
    }   

你已經構建了一個簡單的API允許其他服務器來程序化的訪問課程應用。REST Framework還允許你通過ModelViewSet視圖設置去管理創建以及編輯對象。我們已經覆蓋了Django Rest Framework的主要部分,但是你可以找到該框架更多的特性,通過查看它的文檔,地址在 http://www.django-rest-framework.org/

總結

在這章中,你創建了一個RESTful API給其他的服務器去與你的web應用交互。

一個額外的章節第十三章,Going Live需要在線下載:https://www.packtpub.com/sites/default/files/downloads/Django_By_Example_GoingLive.pdf 。第十三章將會教你如何使用uWSGI以及NGINX去構建一個生產環境。你還將學習到如何去導入一個定制中間件以及創建定制管理命令。

你已經到達這本書的結尾。恭喜你!你已經學習到了通過Django構建一個成功的web應用所需的技能。這本書指導你通過其他的技術與Django集合去開發了幾個現實生活能用到的項目。現在你已經準備好去創建你自己的Django項目了,無論是一個簡單的樣品還是一個一個強大的wen應用。

祝你下一次Django的冒險好運!

譯者總結

完結撒花!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2016年12月7日開始翻譯第一章到今天2017年3月29日終于全書翻譯完成!

對我而言真的是一次非常大膽的嘗試,但終于堅持下來了!!!!!!!!

要相信自己做的到!

請允許我多打幾個感嘆號表達我的心情!

感謝所有支持和鼓勵的人!

精校工作也正在不斷的進行中,請大家原諒一開始的渣翻!

其實還有很多很多想說的話,但是不知道說什么好!就這樣吧!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容