django-rest-framework,是一套基于Django 的 REST 框架,是一個強大靈活的構(gòu)建 Web API 的工具包。本文介紹一下 django-rest-framework 的簡單使用。示例代碼地址:https://github.com/jhhnjhhn/drf-test
環(huán)境
Python (3.6.2)
Django (1.11.5)
djangorestframework (3.6.4)
使用
1、創(chuàng)建項目
mkdir drf-test
cd drf-test
django-admin.py startproject drfTest
cd drfTest/
python manage.py startapp api
2、修改配置文件
編輯 drtTest/setting.py 文件,在 INSTALLED_APPS 添加新應(yīng)用。
INSTALLED_APPS = (
...
'rest_framework',
'api.apps.ApiConfig',
)
3、創(chuàng)建模型和數(shù)據(jù)庫
打開 drtTest/models.py 文件,創(chuàng)建一個簡單 Product 模型,字段包括 created、name、describe、price、isDelete。
class Product(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100, default='')
describe = models.CharField(max_length=500, default='')
price = models.FloatField()
isDelete = models.BooleanField(default=False)
class Meta:
ordering = ('created',)
模型遷移,并同步數(shù)據(jù)庫。
python manage.py makemigrations api
python manage.py migrate
4、創(chuàng)建序列化器
序列化器可以把模型轉(zhuǎn)換成需要返回的 json、xml 類型數(shù)據(jù)。在 api 文件下創(chuàng)建 serializers.py 文件。
from rest_framework import serializers
from snippets.models import Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('id', 'created', 'name', 'describe', 'price', 'isDelete')
5、url配置
創(chuàng)建 api/urls.py 文件,用 Router 自動處理 url 和 view 的連接。
from django.conf.urls import url, include
from api import views
# api url 配置
urlpatterns = [
]
在 drtTest/urls.py 中鏈接 api 應(yīng)用程序的 url。
from django.conf.urls import url, include
from api import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('api.urls')),
]
6、編寫視圖
編寫視圖有很多種方式,下面使用比較簡單的兩種:
1.使用 APIView
from rest_framework.views import APIView
from django.http import JsonResponse
# Create your views here.
class GetMessageView(APIView):
# get 請求
def get(self, request):
# 獲取參數(shù)數(shù)據(jù)
get = request.GET
# 獲取參數(shù) a
a = get.get('a')
print(a)
# 返回信息
d = {
'status': 1,
'message': 'success',
}
return JsonResponse(d)
api/urls.py 中配置 url
urlpatterns = [
url(r'^test/$', views.GetMessageView.as_view()),
]
終端輸入命令,開啟服務(wù)。
python manage.py runserver
打開瀏覽器訪問 http://127.0.0.1:8000/test/?a=100 接口返回
{"status": 1, "message": "success"}
終端輸出
100
[15/Sep/2017 02:39:55] "GET /test/?a=100 HTTP/1.1" 200 35
2.使用 viewsets
from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import detail_route, list_route
from api.serializers import ProductSerializer
from api.models import Product
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
@detail_route()
def changeName(self, request, *args, **kwargs):
get = request.GET
product = self.get_object()
product.name = get.get('newName')
product.save()
return Response(product.name)
@list_route()
def filterProducts(self, request):
products = Product.objects.filter(id__in=range(3))
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
api/urls.py 配置 url,使用 Router 自動處理 url 和 view 的連接。
from rest_framework.routers import DefaultRouter
from api.views import ProductViewSet
router = DefaultRouter()
router.register(r'product', views.ProductViewSet)
# api url 配置
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^test/$', views.GetMessageView.as_view()),
]
終端輸入命令,開啟服務(wù)。
python manage.py runserver
測試
獲取產(chǎn)品列表: http://127.0.0.1:8000/product,沒有的話在頁面底部添加幾條
通過產(chǎn)品 id 獲取單個產(chǎn)品: http://127.0.0.1:8000/product/2/
修改產(chǎn)品名稱: http://127.0.0.1:8000/product/2/changeName/?newName=qwer
獲取 id 為 0-3 的產(chǎn)品: http://127.0.0.1:8000/product/filterProducts/