知識點
- Restful API介紹
- Django Restful Framework介紹
- 實例學習
簡介
Rest
Rest(Representational State Transfer)表現層狀態轉化
是一種架構風格:
- 從資源角度來觀察整個網絡
- 每個URL代表一種資源
- 客戶端通過四個http動詞對后端進行操作
Http動詞
- get 獲取資源
- post 新建一個資源
- put 更新資源
- delete 刪除資源
Http動詞舉例
- get /poems
- post /poems
- get poems/id
- put poems/id
- delete poems/id
狀態碼
服務器向客戶端返回的狀態碼和信息提示:
200 OK - [GET]:服務器成功返回用戶請求的數據
201 CREATED - [POST/PUT]:用戶新建或修改數據成功。
400 INVALID REQUEST - [POST/PUT]:用戶發出的請求有錯誤
更多可以參考:10 Status Code Definitions
Django REST framework
一套構建restful API有效和便利的框架
安裝:pip install djangorestframework
參考文檔
Django REST framework的各種技巧【目錄索引】
代碼地址:Spareibs的Github
實驗操作
簡單實現Pome的get方法和post方法
定義一個serializers.ModelSerializer的子類并設置元數據 【serializers.py】
from rest_framework import serializers
from .models import Poem
class PoemSerializer(serializers.ModelSerializer):
class Meta:
# 制定元數據的model和fields
model = Poem
fields = ['author', 'title', 'type']
定義視圖函數的操作【views.py】
from rest_framework import status
from rest_framework.response import Response
from .serializers import PoemSerializer
from .models import Poem
class PoemListView(APIView):
def get(self, request, format=None):
poems = Poem.objects.all()
serializer = PoemSerializer(poems, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = PoemSerializer(data=request.data, many=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
定義路由策略【urls.py】
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^poems/$', views.PoemListView.as_view(), name="poem_list"),
]
使用裝飾器
定義視圖函數的操作【views.py】
@api_view(['GET', 'PUT', 'DELETE'])
def poem_detail(request, pk):
try:
poem = Poem.objects.get(pk=pk)
except Poem.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = PoemSerializer(poem)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = PoemSerializer(Poem, request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
poem.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
定義路由策略【urls.py】
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^poem/(?P<pk>[0-9]+)$', views.poem_detail, name="poem_list"),
]