Restframework從入門到精通(一):Restframework之入門
官方檔案(英文): www.django-rest-framework.org/
官方檔案(翻譯): www.sinodocs.cn/
官網檔案(未翻譯全)(推薦): q1mi.github.io/Django-REST…
restful系列部落格是在學習51cto的課程和在觀看完官方文章之後的學習總結,自己重新做了一個案例來說明
個人部落格:www.ly-blog.top/
Django Restframework是什麼
Django Restframework
是Django
中可以 幫助我們快速的開發符合RESTful
規範的介面的框架 ,RESTful
Restful規範
- GET(SELECT):查詢; 從伺服器取出資源(一項或多項)。
- POST(CREATE):新增; 在伺服器新建一個資源。
- PUT(UPDATE):覆蓋,全部更新 ; 在伺服器更新資源(客戶端提供改變後的完整資源)。
- PATCH(UPDATE):更新; 在伺服器更新資源(客戶端提供改變的屬性)。
- DELETE(DELETE):刪除; 從伺服器刪除資源。
- HEAD:獲取資源的元資料。
- OPTIONS:獲取資訊,關於資源的哪些屬性是客戶端可以改變的。
Restframework作用
-
路由
-
可以通過
as_view
傳引數,根據請求方式的不同執行響應的方法 -
可以在url中設定一個結尾類似於.json的資料形式
-
-
檢視
- 幫助開發者提供了一些類,並在類提供了很多的方法供我們使用
-
版本控制
- 在url中設定version引數,使用者請求傳入引數時,在
request.version
中獲取版本,根據版本的不同做不同的處理
- 在url中設定version引數,使用者請求傳入引數時,在
-
認證
- 寫一個類並註冊到認證類,在類的authticate方法中編寫認證邏輯
- 認證成功(user,auth)
- rase AuthticateFaild(..)
- None 繼續
- 寫一個類並註冊到認證類,在類的authticate方法中編寫認證邏輯
-
許可權
- 寫一個類並註冊的許可權類,在類的
has_permission
方法中寫許可權邏輯
- 寫一個類並註冊的許可權類,在類的
-
頻率限制
- 寫一個類並註冊的許可權類,在類的
allow_requset/wait
- 匿名
- 使用者
- 返回為
True
或者False
,False
就要執行wait
方法
- 寫一個類並註冊的許可權類,在類的
-
解析器
- 根據ContentType請求頭,選擇不同的解析器對請求體中的資料進行解析.
Content-Type : url-formedo
Content-Type :application/json
- 根據ContentType請求頭,選擇不同的解析器對請求體中的資料進行解析.
-
分頁
- 對從資料庫中取到的資料進行分頁處理. SQL---> limit offset
- 根據頁碼:www.luffycity.com/api/v1/stud…
- 根據索引:www.luffycity.com/api/v1/stud…
- 根據加密:
- 對從資料庫中取到的資料進行分頁處理. SQL---> limit offset
-
序列化
- 對
queryset
序列化以及對請求資料格式校驗
- 對
-
渲染器
- 根據url中傳入的字尾,決定在資料如何渲染到頁面上
.......簡單的總結就是,Django Restframework
可以幫助你前後端分離開發,後臺人員通過Restframework
來開發API
介面,前端人員寫前端的頁面(不論是PC還是移動端),到時候整合直接使用後端人員的介面就可以完成整個專案的開發
接下來我從把model
的資料轉換為json格式來引入Restframework
的概念
model資料轉換為json形式
在開始演示之前,要先配置好Django的基本配置:編寫好model、setting配置、從model插入資料、view檢視配置等操作,這裡我一一演示一遍
演示前配置
先建立一個空資料夾,然後建立專案,如我下圖所示
然後使用pycharm
開啟專案,配置好資料庫、插入Book
(我拿來演示的app)到INSTALLED_APPS
,以下是我的配置
setting.py
INSTALLED_APPS = [
'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','Book','rest_framework',]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser',],'PAGE_SIZE': 10
}
......
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql','NAME': 'restful_demo','USER': 'root','PASSWORD': '','HOST': '127.0.0.1','PORT': '3306',}
}
複製程式碼
根目錄__init__
檔案
在我的restful_test(專案根目錄)
資料夾裡面的的__init__.py
檔案,因為是python3版本, 所以要配置一下mysql
import pymysql
pymysql.install_as_MySQLdb()
複製程式碼
建立model模型欄位
在我建立的Book資料夾裡面的model.py新增我要演示的欄位
class Publish(models.Model):
name=models.CharField(max_length=20,verbose_name="出版社名稱",unique=True)
address=models.CharField(max_length=128,verbose_name="地址")
def __str__(self):
return self.name
class Meta:
verbose_name="出版社"
verbose_name_plural=verbose_name
複製程式碼
然後對生成遷移檔案和寫入資料庫
python manage.py makemigrations
->python manage.py migrate
建立管理員為model新增資料
python manage.py createsuperuser
建立好管理員的使用者名稱和密碼
然後在admin.py
裡面註冊Book
from django.contrib import admin
from .models import Publish
# Register your models here.
admin.site.register(Publish)
複製程式碼
這裡我新增好了三條資料
以上你要用Django shell
新增也行
到這裡演示前的準備都已經配置好了,接下來的都是配置view
檢視方法
方法一:使用字典的方式轉換為json
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic.base import View
from .models import Publish
import json
# Create your views here.
class Publish_list(View):
def get(self,request):
queryset=Publish.objects.all()
data=[]
for i in queryset:
p_tmp={
"name":i.name,"address":i.address
}
data.append(p_tmp)
return HttpResponse(json.dumps(data),content_type="application/json")
def post(self,request):
pass
複製程式碼
然後配置一下路由
urlpatterns = [
url(r'^admin/',admin.site.urls),url(r'^publish/',Publish_list.as_view())
]
複製程式碼
訪問 http://127.0.0.1:8000/publish/
可以看到model的資料已經轉換為json格式了
方法二:使用Django自帶的model_to_dict方法
方法二其實是對方法一進行優化,Django預設自帶了一個model_to_dict方法,可以幫助我們把model轉換為一個字典
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic.base import View
from .models import Publish
from django.forms.models import model_to_dict
import json
# Create your views here.
class Publish_list(View):
def get(self,request):
queryset=Publish.objects.all()
data=[]
for i in queryset:
data.append(model_to_dict(i))
return HttpResponse(json.dumps(data),content_type="application/json")
def post(self):
pass
複製程式碼
方法二得出的結果還是一毛一樣的
方法三:使用Django自帶的序列化轉換成json
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic.base import View
from .models import Publish
from django.core import serializers
# Create your views here.
class Publish_list(View):
def get(self,request):
queryset=Publish.objects.all()
data=serializers.serialize("json",queryset)
return HttpResponse(data,content_type="application/json")
def post(self):
pass
複製程式碼
總結
這個跟方法一和方法二的結果多了一個model
和pk
欄位,但是方法三比其他兩個方法更為簡潔,更少的程式碼也更容易理解
如果單單隻要提供資訊的話使用方法三是完全足夠的,從model
讀取資訊轉換為json
格式方法三完全可以勝任。開發不僅僅只是把model
轉換為API
,還要把API
轉換成model
裡面的資料
Restframework的使用
初識:自定義序列化的類
Restframework
的用法是跟Django
的form
表單的用法很相似
要先在建立一個serializers
檔案,這個檔案裡面儲存序列化的欄位
serializers .py
from rest_framework import serializers
class Publishserializer(serializers.Serializer):
id=serializers.IntegerField(read_only=True)
name= serializers.CharField(max_length=32)
address=serializers.CharField(max_length=128)
複製程式碼
以上欄位已經完成了欄位的序列化,在前面說的跟form表單驗證的方法一樣,也有個驗證的方法,如果直接把欄位序列化進去就會造成不安全的問題,如翻譯檔案所示:
所以我們要重寫一個create
和update
方法
serializers .py
from rest_framework import serializers
from .models import Publish
class Publishserializer(serializers.Serializer):
id=serializers.IntegerField(read_only=True)
name= serializers.CharField(max_length=32)
address=serializers.CharField(max_length=128)
def create(self,validated_data):
#這裡不用管validated_data是什麼,只需要按照官網的方法所示,返回**validated_data就可以保證序列化的欄位經過驗證
return Publish.objects.create(**validated_data)
def update(self,instance,validated_data):
instance.name=validated_data.get("name",instance.name)
instance.address=validated_data.get("address",instance.address)
instance.save()
return instance
複製程式碼
然後我們使用Django shell
測試一下
其中的is_vaild
方法都跟form
表單使用方法一樣,然後再重新整理網頁看看資料
如圖所示,就增加了我剛剛寫的資料
使用:在view裡面新增序列化方法
views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic.base import View
from .models import Publish
from django.core import serializers
from .serializers import Publishserializer
import json
# Create your views here.
class Publish_list(View):
def get(self,request):
queryset=Publish.objects.all()
serializer=Publishserializer(queryset,many=True) #many=True就是多個物件,要去遍歷出來
return HttpResponse(json.dumps(serializer.data),content_type="application/json")
def post(self):
pass
複製程式碼
優化:繼承model的欄位
跟form
一樣,form
可以繼承model
的欄位,serializers
當然也可以,已經在model
裡面建立的欄位,當然沒有必要重新寫一遍了,所以現在要改寫一下serializers .py
的程式碼
from rest_framework import serializers
from .models import Publish
class Publishserializer(serializers.ModelSerializer):
class Meta:
model=Publish
fields=(
"id","name","address"
)
def create(self,instance.address)
instance.save()
return instance
複製程式碼
其餘配置不變,輸入配置好的路由地址 http://127.0.0.1:8000/publish/ ,依然可以訪問到同樣的資料