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') ) ]
相關文章
相關標籤/搜索