RESTframework_一

RESTframework

Web應用模式

前後端不分離

這裏寫圖片描述
過程: 瀏覽器請求動態頁面 –> 後端服務器響應(查詢數據庫,渲染模板)

前端頁面看到的效果都是由後端控制,後端渲染頁面或重定向

後端控制前端的展示,前端後端的耦合性很高.

這種應用模式只適用於純網頁應用,當後端對接APP時,App可能不需要後端網頁,而只是需要數據,所有不適用,需要重新開發接口.

前後端分離

這裏寫圖片描述

在前後端分離的應用模式中,後端僅返回前端所需的數據,不再渲染HTML頁面,不再控制前端的效果.

在前後端分離的應用模式中,前端與後端的耦合度相對較低.

在前後端分離的應用模式中,我們通常將後端開發的每個視圖都稱爲一個接口,或者API,前端通過訪問接口來對數據進行增刪改查.

RESTful

RESTful 特點

get 查詢

post 增加

put 修改

delete 刪除

  • 每個URL代表一種資源
  • 客戶端和服務器之前,傳遞這種資源的耨中表現層
  • 客戶端同坐HTTP動詞,對服務器端資源進行操作,實現’表現層狀態轉化’

REST接口開發的核心任務

  • 將請求的數據(JSON格式)轉化爲模型對象
  • 操作數據庫
  • 將模型對象轉化爲響應的數據(JSON)

序列化: 將Python類型轉化爲JSON數據

反序列化: 將JSON數據轉化爲Python數據

總結

開發REST API ,視圖操作

  • 將數據庫序列化爲前端所需要的格式,並返回
  • 將前端的數據反序列化爲模型類對象,並保存到數據庫中

REST framework

特點:

  • 提供了定義序列化器Serializer的方法,可以快速根據 Django ORM 或者其它庫自動序列化/反序列化;
  • 提供豐富的類視圖,Mixin擴展類,簡化視圖的編寫
  • 豐富的定製層級:函數視圖,類視圖,視圖集合到自動生成API,滿足各種需要
  • 多種身份認證和權限認證的支持
  • 內置限流系統
  • 直觀的API web 界面
  • 可擴展性,插件豐富

創建 REST framework 工程

  1. 安裝DRF

    pip install djangorestframework

  2. 添加rest_framework應用

    setting.py

    ``` python
        INSTALLED_APPS = [
        ...
        'rest_framework',
    ]
    ```
    

序列化器

功能:

序列化操作: 將Python類型(模型類對象,模型類對象的列表)轉換成字典
反序列化操作: 將json轉換成字典

定義序列化器: 繼承自rest_framework.serializers.Serializer類

模型類

class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名稱')
    bpub_date = models.DateField(verbose_name='發佈日期', null=True)
    bread = models.IntegerField(default=0, verbose_name='閱讀量')
    bcomment = models.IntegerField(default=0, verbose_name='評論量')
    image = models.ImageField(upload_to='booktest', verbose_name='圖片', null=True

序列化器

class BookInfoSerializer(serializers.Serializer):
    """圖書數據序列化器"""
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label='名稱', max_length=20)
    bpub_date = serializers.DateField(label='發佈日期', required=False)
    bread = serializers.IntegerField(label='閱讀量', required=False)
    bcomment = serializers.IntegerField(label='評論量', required=False)
    image = serializers.ImageField(label='圖片', required=False)

視圖中使用
from django.http import HttpResponse
from books.models import BookInfo,HeroInfo
from .serializers import BookInfoSerializers,HeroInfoSerializers


def books(request):
    # # 單一對象的序列化
    # book = BookInfo.objects.get(pk=1)
    # book_serializers = BookInfoSerializers(book)
    # book_dict = book_serializers.data
    # print(book_dict)

    # 多對象的序列化
    # book_dict= BookInfoSerializers(BookInfo.objects.all(),many=True).data
    # print(book_dict)

    hero_dict = HeroInfoSerializers(HeroInfo.objects.all(),many=True).data
    print(hero_dict)


    return HttpResponse('OK')

注意:serializer不是隻能爲數據庫模型類定義,也可以爲非數據庫模型類的數據定義。serializer是獨立於數據庫之外的存在。

序列化操作

  1. 基本使用
    1) 查詢一個圖書對象
    2) 構造序列化器對象
    3) 獲取序列化數據,如果獲取的是多條數據,添加many=True 參數補充說明

    def books(request):
        # # 單一對象的序列化
        book = BookInfo.objects.get(pk=1)
        book_serializers = BookInfoSerializers(book)
        book_dict = book_serializers.data
        print(book_dict)
    
        # 多對象的序列化
        book_dict= BookInfoSerializers(BookInfo.objects.all(),many=True).data
        print(book_dict)
  2. 關聯對象嵌套序列化

    
    # 關聯對象嵌套序列化
    
    
    
    # 1.主鍵形式輸出
    
    
    # {'name': '喬峯', 'gender': True, 'comment': '降龍十八掌', 'book_id': 2, 'book': 2}
    
    
    # book = serializers.PrimaryKeyRelatedField(label='圖書',read_only=True)
    
    
    
    # 2.字符串形式輸出
    
    
    # {'name': '喬峯', 'gender': True, 'comment': '降龍十八掌', 'book_id': 2, 'book': '天龍八部'}
    
    
    # book = serializers.StringRelatedField(label='圖書',read_only=True)
    
    
    
    # 3. 以超鏈接形式輸出
    
    
    # {'name': '喬峯', 'gender': True, 'comment': '降龍十八掌', 'book_id': 2, 'book': 'http://127.0.0.1:8000/hero/2'}
    
    視圖中得序列化器添加 # hero_serializer = HeroInfoSerializers(hero,context={'request': request})
    
    # book = serializers.HyperlinkedRelatedField(label='圖書',read_only=True,view_name='books:hero')
    
    
    
    # 4.指定對象的某個屬性輸出
    
    
    # {'name': '喬峯', 'gender': True, 'comment': '降龍十八掌', 'book_id': 2, 'book': datetime.date(1995, 12, 16)}
    
    
    # book = serializers.SlugRelatedField(label='圖書',read_only=True,slug_field='pub_date')
    
    
    
    # 5.使用關聯對象的序列化器
    
    
    # {'name': '喬峯', 'gender': True, 'comment': '降龍十八掌', 'book_id': 2,'book': OrderedDict([('id', 2), ('title', '天龍八部'), ('pub_date', '1995-12-16')])}
    
    
    # book = BookInfoSerializers()
    
    
    
    # 6. 自定義輸出方案
    
    class BookRelateField(serializers.RelatedField):
    '''自定義處理圖書的字段'''
    
    def to_representation(self, value):
        return 'Book: %d-%s' % (value.id, value.title)
    
    # {'name': '喬峯', 'gender': True, 'comment': '降龍十八掌', 'book_id': 2, 'book': 'Book: 2-天龍八部'}
    
    
    # book = BookRelateField(read_only=True)
    
    

反序列化操作

  1. 驗證

    • 字段的類型
    • 必填驗證
    • 定義方法
    • 多屬性驗證
    • 定義類型
  2. 保存
    #增加:BookInfoSerializer(data=json)==>save()
    #修改:BookInfoSerializer(book,data=json)==>save()
    調用save()

要在序列化器中定義 create()或者update()

    def create(self, validated_data):
        book = BookInfo()
        book.title = validated_data.get('title')
        book.pub_date = validated_data.get('pub_date')
        book.save()
        return book
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章