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 界面;
可擴展性,插件豐富
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須要如下依賴:
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.
在settings.py的INSTALLED_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用於序列化與反序列化。
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)
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.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')), }
# 序列化器 的反序列化階段 # 全局自定義驗證方法 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
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.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')) ]
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("閱讀量小於評論量,數據太假了")
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)
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__'
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
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') ) ]