Rest_framework 和路由配置(一)

簡介

Django REST framework是一個創建在Django基礎之上的Web 應用開發框架,能夠快速的開發REST API接口應用。前端

Rest_framework 核心思想: 縮減代碼。python

中文文檔:https://q1mi.github.io/Django-REST-framework-documentation/#django-rest-frameworkmysql

github: https://github.com/encode/django-rest-framework/tree/mastergit

特色github

  • 提供了定義序列化器Serializer的方法,能夠快速根據 Django ORM 或者其它庫自動序列化/反序列化;web

  • 提供了豐富的類視圖、Mixin擴展類,簡化視圖的編寫;sql

  • 豐富的定製層級:函數視圖、類視圖、視圖集合到自動生成 API,知足各類須要;數據庫

  • 多種身份認證和權限認證方式的支持;[jwt]django

  • 內置了限流系統;api

  • 直觀的 API web 界面;

  • 可擴展性,插件豐富

非drf 實現簡單接口

1.建立django 項目
django
-admin startproject drf 2. 建立子應用目錄booktest,在項目根目錄下執行如下命令 python manage.py startapp booktest 建立一個數據庫,drf create database drf charset=utf8; grant all privileges on book.* to root@localhost identified by '123456'; flush privileges; 3. 配置數據庫信息 3.1 在主應用drf目錄下的drf/__init__.py添加如下代碼: import pymysql pymysql.install_as_MySQLdb() 3.2 在項目配置文件中,settings中修改數據連接信息。 DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'drf', 'USER': 'root', 'PASSWORD': '123456', 'HOST': '127.0.0.1', 'PORT': '3306', }, }

路由配置:

1. 視圖    booktest  應用中的views.py  

from django.shortcuts import render

from django.http import JsonResponse

from django.views import View

# Create your views here.


class BookAPI(View):

    def get(self,request):


        return JsonResponse({"name":"deng"})

 2.分路由         booktest  應用中的urls.py  

from django.urls import path

from .views import BookAPI

urlpatterns = [

    path(r'books/',BookAPI.as_view())
]

 

3. 主路由      主應用drf  中的url.py   

from django.contrib import admin
from django.urls import path,re_path,include

urlpatterns = {
    path('admin/', admin.site.urls),
    path('api/',include('booktest.urls') )

}

 

 

 

  訪問接口結果:

drf 實現簡單接口

1.環境安裝與配置

DRF須要如下依賴:

  • Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)

  • Django (1.10, 1.11, 2.0)

DRF是以Django擴展應用的方式提供的,因此咱們能夠直接利用已有的Django環境而無需重新建立。

(若沒有Django環境,須要先建立環境安裝Django)

 

1.安裝

pip install djangorestframework

2. 終端建立建立django 項目

  在終端執行如下命令建立django項目,比較純淨, 建議用此方法建立項目,而不是用pycharm 建立。

django-admin  startproject  drf

3. 添加rest_framework應用

  在settings.pyINSTALLED_APPS中添加'rest_framework'。

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework'
]

接下來就可使用DRF進行開發了。在項目中若是使用rest_framework框架實現API接口,主要有如下三個步驟:

  • 將請求的數據(如JSON格式)轉換爲模型類對象

  • 操做數據庫

  • 將模型類對象轉換爲響應的數據(如JSON格式)

在booktest應用目錄中新建serializers.py用於保存該應用的序列化器。

建立一個BookInfoSerializer用於序列化與反序列化。

建立序列化器   

1.底層的方式實現的序列化

serializers.py  :

from rest_framework import serializers

# 序列化器 序列化
class BookSerializer(serializers.Serializer):
# 自定義序列化的字段
id = serializers.IntegerField(label='主鍵ID',read_only=True)#read_only=True只給用戶看不讓輸入和修改
title= serializers.CharField(label='書名',max_length=32)

pub_date = serializers.DateField()

bread = serializers.IntegerField(min_value=0)
bcomment = serializers.IntegerField(min_value=0)

2. 編寫視圖

book 應用下的視圖   view.py :

# 序列化器 序列化階段

from django.http import JsonResponse
from django.views import View

from book.models import Book # 導入模型類
from book.serializers import BookSerializer # 導入序列化器類


class BookView(View):

# 展現全部數據
def get(self,request):

# 1 操做數據庫

books = Book.objects.all()

# 2 .序列化
'''
建立序列化器對象
參數1:instance 要序列化的模型數據 (數據庫中的數據)
參數2: data 要反序列化器的字典數據 (前端傳來的數據)
參數3:many 是否要序列化多個模型數據,多條數據many=True 默認False 一條
參數4: context 序列化器使用的上下文,字典類型數據,能夠經過context把視圖中的數據傳遞給序列化器內部使用
'''
serializer = BookSerializer(instance=books,many=True) # 此處須要many=True 否則會報錯
# 經過 serializer.data 獲取序列化完成之後的數據
# print(serializer.data)
#3. 返回響應
return JsonResponse(serializer.data,safe=False)

3. 配置路由

      3.1在booktest應用的urls.py中定義路由信息。

from django.urls import path


from .views import BookView

urlpatterns=[
path('book/',BookView.as_view())
]

  3.2 總路由中  drf主應用中 url.py :

from django.contrib import admin
from django.urls import path,re_path,include


urlpatterns = {
    path('admin/', admin.site.urls),
    path('api/', include('book.urls')),

}

2.底層的方式實現的反序列化

serializers.py  :

# 序列化器 的反序列化階段
# 全局自定義驗證方法
def check_title(data):
    if data=='金梅':
        raise serializers.ValidationError('金梅是禁書!')

    return data   #自定義驗證方法必定要返回數據

class Book2Serializer(serializers.Serializer):
    #自定義要反序列化的字段
    id = serializers.IntegerField(label='主鍵ID', read_only=True)  # read_only=True只給用戶看不讓輸入和修改
    title = serializers.CharField(label='書名', max_length=32,required=True,min_length=1,validators=[check_title]) # validators 參數用來裝全局自定義驗證方法
    pub_date = serializers.DateField()
    bread = serializers.IntegerField(min_value=0)
    bcomment = serializers.IntegerField(min_value=0)
    # required = False 反序列化時,當前字段能夠不填
    # 自定義驗證方法  ,驗證單個字段能夠多個方法
    # 格式: def validate_字段名(self,data): # data當前字段對應的值

    def validate_title(self, data):
        if data=='金梅':
            raise serializers.ValidationError('金梅是禁書!')
        return data  # 必定要返回數據

    # 自定義驗證對個方法 ,驗證多個或全部字段,只能出現一次
    def validate(self, data):# data 這個是全部字段內容 ,字典類型

        bread = data.get('bread')
        bcomment = data.get('bcomment')
        if bcomment>bread:
            raise serializers.ValidationError('數據不真實!')

        return data


    def create(self, validated_data):
        # 保存數據,把字典轉化成模型
        # validated_data 客戶端提交過來的數據,並通過驗證的數據
        instance = Book.objects.create(
            title=validated_data.get('title'),
            pub_date=validated_data.get('pub_date'),
            bread = validated_data.get('bread'),
            bcomment=validated_data.get('bcomment')
        )
        return instance

    def update(self, instance, validated_data):

        # 更新一條數據
        instance.title = validated_data.get('title')
        instance.pub_date = validated_data.get('pub_date')
        instance.bread = validated_data.get('bread')
        instance.bcomment = validated_data.get('bcomment')

        # 調用orm 進行保存
        instance.save()
        # 返回模型對象
        return instance

2. 編寫視圖

book 應用下的視圖   view.py :

from django.http import JsonResponse
from django.views import View

from book.models import Book # 導入模型類
from book.serializers import BookSerializer # 導入序列化器類

from book.serializers import Book2Serializer
class BookView(View):# 反序列化

    def post(self,request):

        # 添加一本書
        #1 接收數據
        data = request.POST
        # 反序列化
        from book.serializers import Book2Serializer
        serializer = Book2Serializer(data=data)
        # 2 驗證數據
        serializer.is_valid(raise_exception=True)
        ## raise_exception=True 把驗證的錯誤信息返回給客戶端,同時阻止程序繼續往下執行
        # # is_valid調用驗證方式: 字段選項validators->自定義驗證方法[單字段]->自定義驗證方法[多字段]
        # 驗證成功後的數據
        # print(serializer.validated_data)
        # 3. 轉換數據成模型,同步到數據庫中
        serializer.save()
        ## save會自動調用序列化器類裏面聲明的create/update方法,返回值是當前新增/更新的模型對象

        # 4 響應數據
        return JsonResponse(serializer.data)


    def put(self,request,pk):
        # 更新一條數據
        # 1 根據主鍵獲取指定圖書信息
        instance = Book.objects.get(pk=pk)
        # 2. 獲取put 數據
        from django.http import QueryDict
        data = QueryDict(request.body)

        # 3.使用序列化器 反序列化
        # partial=True 接下里在反序列化中容許部分數據更新
        serializer = Book2Serializer(instance=instance,data=data,partial=True)

        # 4 驗證數據
        serializer.is_valid(raise_exception=True)
        # save之因此能夠自動識別,何時執行create ,何時執行update
        # 主要是看建立序列化器對象時,是否有傳入instance參數,
        # 有instance參數,則save會調用序列化器內部的update方法
        # 沒有instance參數,則save會調用序列化器內部的create方法

        #5 保存數據
        serializer.save()

        return JsonResponse(serializer.data)

3. 配置路由

      3.1在booktest應用的urls.py中定義路由信息。

from django.urls import path,re_path

from book.views import BookView
urlpatterns=[
    #path("book/",BookView.as_view()),
 re_path("book/(?P<pk>\d+)/",BookView.as_view()),

]

3.2 總路由中  drf主應用中 url.py :

from django.contrib import admin
from django.urls import path,include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/',include('book.urls'))
]

模型序列化器

1. serializers.py  :

 3 模型序列化器 # 1. 能夠幫咱們自動完成字段的聲明[主要是從模型中的字段聲明裏面提取過來]
# 2. 模型序列化器也能夠幫咱們聲明瞭create和update方法的代碼
from rest_framework import serializers
from book.models import Book
class BookModelSerializer(serializers.ModelSerializer):
    # 模型序列化器也能夠自定義驗證字段[當某些數據不存在於數據庫時,可是須要前端提交過來的,能夠進行自定義,
    # 例如,驗證碼,確認密碼]

    class Meta:
        model=Book
        fields = ["id","title"]
        # 能夠給模型序列化器裏面指定的字段設置限制選項
        extra_kwargs = {
            "bread":{"min_length":0,"required":True},
        }

    # 自定義驗證方法[驗證單個字段,能夠有多個方法]
    # def validate_<字段名>(self,data): # data當前字段對應的值
    def validate_btitle(self,data):
        # 例如,圖書名不能是紅樓夢
        if data=="紅樓夢":
            # 拋出錯誤
            raise serializers.ValidationError("紅樓夢是禁書~")
        # 驗證方法中,把數據值必須返回給字段,不然字段值爲空
        return data

    # 自定義驗證方法[驗證多個或者全部字段,只能出現一次]
    def validate(self,data): # data 這個是全部字段的內容,字典類型
        bread = data.get("bread")
        bcomment = data.get("bcomment")

        if bread>=bcomment:
            return data
        raise serializers.ValidationError("閱讀量小於評論量,數據太假了")

2. 視圖編寫

3 模型序列化器
# 1. 能夠幫咱們自動完成字段的聲明[主要是從模型中的字段聲明裏面提取過來]
# 2. 模型序列化器也能夠幫咱們聲明瞭create和update方法的代碼
######################################################
from django.views import View
from django.http import JsonResponse
from .serializers import BookModelSerializer
class Book3View(View):
    def post(self,request):
        """添加一本圖書"""
        # 接受數據
        data = request.POST
        # 反序列化
        serializer = BookModelSerializer(data=data)
        serializer.is_valid(raise_exception=True)
        result = serializer.save()
        # 響應數據
        return JsonResponse(serializer.data)

    def put(self,request,pk):
        """更新一個圖書"""
        book = Book.objects.get(pk=pk)

        # 獲取put提交的數據
        data = QueryDict(request.body)

        serializer = BookModelSerializer(instance=book,data=data,partial=True)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        # 響應數據
        return JsonResponse(serializer.data)

3. 路由

from django.urls import path, re_path
from . import views
urlpatterns = [
   
    path("books3/",views.Book3View.as_view()),
]

 

使用序列化器的簡單版

1.建立序列化器 ,在app 1下 新建一個serializer.py 文件

from rest_framework import serializers

from booktest.models import BookInfo

class BookInfoSerializer(serializers.ModelSerializer):

    # 當前序列化器在序列化和反序列的類  序列化器類
    class Meta:
        model = BookInfo

        fields='__all__'
  • model 指明該序列化器處理的數據字段從模型類BookInfo參考生成

  • fields 指明該序列化器包含模型類中的哪些字段,'all'指明包含全部字段

2. 編寫視圖   app1       view.py

from django.shortcuts import render

from booktest.models import BookInfo
from .serializers import BookInfoSerializer
from rest_framework.viewsets import ModelViewSet

class BookInfoAPIView(ModelViewSet):

    queryset = BookInfo.objects.all()

    # 當前視圖類使用序列化器類是誰
    serializer_class = BookInfoSerializer
  • queryset 指明該視圖集在查詢數據時使用的查詢集

  • serializer_class 指明該視圖在進行序列化或反序列化時使用的序列化器。

3. 定義路由

在app1 應用的urls.py中定義路由信息。

from rest_framework.routers import DefaultRouter

from .views import BookInfoAPIView

urlpatterns=[

]

# 建立路由對象
routers = DefaultRouter()

# 經過路由對象對視圖進行路由生成
routers.register('books',BookInfoAPIView)# books爲路徑

urlpatterns += routers.urls

把上面的urls 添加到總路由中去:

from django.contrib import admin
from django.urls import path, re_path, include

urlpatterns = [
    path('admin/', admin.site.urls),
 
    path('api/',include('app1.urls') )

]
相關文章
相關標籤/搜索