上圖爲項目完整的目錄結構前端
須要先安裝須要使用到包python
pip install django pip install djangorestframework
先來建立一個新項目數據庫
django-admin startproject restful cd restful # 建立一個應用 python manage.py startapp rest_app
要想使用rest_framework 須要在django項目下的settings配置文件中的INSTALLED_APPS配置中添加以下配置:
django
INSTALLED_APPS = ( ... 'rest_framework', 'rest_app.apps.Test_appConfig', ) # 若是您的django版本小於1.9,須要把rest_app.apps.Test_appConfig更換完rest_app
自定義一個遊戲信息表api
class Game(models.Model): name = models.CharField(verbose_name='遊戲名',max_length=64) company = models.CharField(verbose_name='公司',max_length=64) turnover = models.IntegerField(verbose_name='營業額') def __str__(self): return self.name
# python manage.py makemigrations
# python manage.py migrate # 生成數據庫
# python manage.py createsuperuser # 建立管理員
在建立數據庫後,利用django admin 後臺添加幾條數據以備後用restful
講一下什麼是serializer:app
serializer 類是用來序列化經過繼承該類,能夠把數據按照自定義的格式進行序列化。能夠重寫父類的方法對數據進行操做。函數
#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = '40kuai' from rest_framework import serializers from test_app import models # 定義一個關於剛纔新建Game表的一個序列化類,用來驗證和序列化Game表數據 class Test_app_serializer(serializers.Serializer): # 繼承serializers.Serializer類 name = serializers.CharField(max_length=64) company = serializers.CharField(max_length=64) turnover = serializers.IntegerField() # 定義的create方法來實現新建數據,在子類中不重寫改方法會raise NotImplementedError('`create()` must be implemented.') def create(self, validated_data): return models.Game.objects.create(**validated_data) def update(self, instance, validated_data): # 同上,不重寫會raise 異常 instance.game = validated_data.get('name', instance.name) instance.company = validated_data.get('company', instance.company) instance.turnover = validated_data.get('turnover', instance.turnover) return instance
serializer類 的使用方法和django的From表單的驗證類似。首先是要定義你要進行驗證的字段,須要按照Game表中對數據的格式要求來定義每一個字段,Serializer類也會按照自定義的字段來序列化相應的字段,post
create 和 update方法在用戶進行建立,修改數據時會用到,在父類中這兩個方法是要求重寫的(沒有強制要求)。注:父類中使用的是raise 方法來實現重寫功能。url
這裏的路由函數是把全部的路由放到了test_app的urls.py 下,具體配置以下:
# /restful/restful/urls.py
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/', include('test_app.urls')),# 指向test_app下的urls.py ]
# /restful/test_app/urls.py
from django.conf.urls import url from django.contrib import admin from test_app import views urlpatterns = [ url(r'^game_list/',views.game_list), # 顯示全部相關信息(GET)和建立新數據(POST) url(r'^game_info/(\d+)/', views.game_info), # 顯示單條數據(GET)以及對數據進行修改(POST) ]
路由就這麼點,沒什麼可講的,下面纔是重點,開始說下視圖函數,視圖函數,視圖函數,視圖函數,視圖函數
from django.shortcuts import render from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt # 忽略post請求時的csrf問題 from test_app import serializer from test_app import models from rest_framework.renderers import JSONRenderer # restful提供的序列化類 from rest_framework.parsers import JSONParser # restful提供的反序列化類 # Create your views here. @csrf_exempt def game_list(request): if request.method == 'GET': game = models.Game.objects.all() # 獲取數據庫中全部數據 game_serializer = serializer.Test_app_serializer(instance=game, many=True) # 經過自定義的serializer實例化數據,many參數爲True表示處理多條數據 return HttpResponse(JSONRenderer().render(game_serializer.data)) # 序列化serializer實例的數據 elif request.method == 'POST': data = JSONParser().parse(request) # 經過JsonParser類反序列化POST過來的數據 game_serializer = serializer.Test_app_serializer(data=data) # 經過反序列化後的數據建立serializer實例 print(game_serializer) if game_serializer.is_valid(): # 經過is_valid()方法判斷數據類型是否正確,這點和Django的From類似 game_serializer.save() # 驗證經過保存數據,這裏的game_serializer是自定義serializer的create函數返回的對象,進行保存 return HttpResponse(JSONRenderer().render(game_serializer.data)) # 序列化數據返回前端 else: # 驗證不經過,輸出對應的報錯信息 print("驗證不經過") return HttpResponse(JSONRenderer().render(game_serializer.errors)) # 註釋同上 @csrf_exempt def game_info(request, game_id): game_obj = models.Game.objects.get(id=game_id) if request.method == 'GET': game_serializer = serializer.Test_app_serializer(instance=game_obj) data = JSONRenderer().render(game_serializer.data) return HttpResponse(data) elif request.method == 'POST': data = JSONParser().parse(request) game_serializer = serializer.Test_app_serializer(instance=game_obj, data=data) if game_serializer.is_valid(): game_serializer.save() return HttpResponse(JSONRenderer().render(game_serializer.data)) else: return HttpResponse(JSONRenderer().render(game_serializer.errors))