1. 程式人生 > 程式設計 >Restframework從入門到精通(一):Restframework之入門

Restframework從入門到精通(一):Restframework之入門

官方檔案(英文): www.django-rest-framework.org/

官方檔案(翻譯): www.sinodocs.cn/

官網檔案(未翻譯全)(推薦): q1mi.github.io/Django-REST…

參考檔案: www.cnblogs.com/chenxuming/…

restful系列部落格是在學習51cto的課程和在觀看完官方文章之後的學習總結,自己重新做了一個案例來說明

個人部落格:www.ly-blog.top/

Django Restframework是什麼

Django RestframeworkDjango中可以 幫助我們快速的開發符合RESTful規範的介面的框架 ,RESTful

是如今開發基本都會採用的規範

Restful規範

  • GET(SELECT):查詢; 從伺服器取出資源(一項或多項)。
  • POST(CREATE):新增; 在伺服器新建一個資源。
  • PUT(UPDATE):覆蓋,全部更新 ; 在伺服器更新資源(客戶端提供改變後的完整資源)。
  • PATCH(UPDATE):更新; 在伺服器更新資源(客戶端提供改變的屬性)。
  • DELETE(DELETE):刪除; 從伺服器刪除資源。
  • HEAD:獲取資源的元資料。
  • OPTIONS:獲取資訊,關於資源的哪些屬性是客戶端可以改變的。

Restframework作用

  • 路由

    • 可以通過as_view傳引數,根據請求方式的不同執行響應的方法

    • 可以在url中設定一個結尾類似於.json的資料形式

  • 檢視

    • 幫助開發者提供了一些類,並在類提供了很多的方法供我們使用
  • 版本控制

    • 在url中設定version引數,使用者請求傳入引數時,在request.version中獲取版本,根據版本的不同做不同的處理
  • 認證

    • 寫一個類並註冊到認證類,在類的authticate方法中編寫認證邏輯
      • 認證成功(user,auth)
      • rase AuthticateFaild(..)
      • None 繼續
  • 許可權

    • 寫一個類並註冊的許可權類,在類的has_permission方法中寫許可權邏輯
  • 頻率限制

    • 寫一個類並註冊的許可權類,在類的allow_requset/wait
      方法中寫許可權邏輯
      • 匿名
      • 使用者
      • 返回為True或者FalseFalse就要執行wait方法
  • 解析器

    • 根據ContentType請求頭,選擇不同的解析器對請求體中的資料進行解析.
      • Content-Type : url-formedo
      • Content-Type :application/json
  • 分頁

  • 序列化

    • 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)
複製程式碼

這裡我新增好了三條資料

Book資料

以上你要用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
複製程式碼

總結

這個跟方法一和方法二的結果多了一個modelpk欄位,但是方法三比其他兩個方法更為簡潔,更少的程式碼也更容易理解

如果單單隻要提供資訊的話使用方法三是完全足夠的,從model讀取資訊轉換為json格式方法三完全可以勝任。開發不僅僅只是把model轉換為API,還要把API轉換成model裡面的資料

Restframework的使用

初識:自定義序列化的類

Restframework的用法是跟Djangoform表單的用法很相似

要先在建立一個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表單驗證的方法一樣,也有個驗證的方法,如果直接把欄位序列化進去就會造成不安全的問題,如翻譯檔案所示:

翻譯檔案

所以我們要重寫一個createupdate方法

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/ ,依然可以訪問到同樣的資料