一、django-rest-framework—serializer

一、django-rest-framework基礎知識
前言:RESTful是一種web服務的架構風格。
REST 指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計
就是 RESTful
重點:restful的設計:https://blog.csdn.net/weixin_42134789/article/details/82782259

REST -- REpresentational State Transfer 直接翻譯:表現層狀態轉移。
1. REST描述的是在網絡中client和server的一種交互形式;URL定位資源,用HTTP動詞
(GET,POST,DELETE,DETC)描述操作。REST本身不實用,實用的是如何設計 
RESTful API(REST風格的網絡接口);
2.Server提供的RESTful API中,URL中只使用名詞來指定資源,原則上不使用動詞。“資源”是
REST架構或者說整個網絡處理的核心。REST架構或者說整個網絡處理的核心。
3.RESTful API 的設計以資源爲核心,每一個 URI 代表一種資源。因此,URI 不能包含動詞,只能
是名詞,且個URI結尾不能加"/",注意的是,形容詞也是可以使用的,但是儘量少用。

restful API的特點:
輕量,直接通過HTTP協議,不需要額外的協議;
面向資源,每一個URL代表一種資源,具有自解釋性;
數據描述簡單,一般通過JSON、xml做數據通信;
客戶端根據不同的請求,通過不同的HTTP方法(get、post、delete、put),對服務器資源進行操作。

Django REST framework是一套基於Django的REST框架,是一個用於構建Web API
的功能強大且靈活的工具包。

1、安裝djangorestframework
python -m pip install --upgrade pip
pip install djangorestframework

2、創建超級管理員的兩種方式

1.python manage.py createsuperuser
然後根據提示輸入用戶名等
2.python manage.py --email [email protected] --username Lcoderfit

3、什麼是序列化??
serializer:串行器:將複雜的數據結構變成json或者xml這個格式

1.什麼是序列化:序列化 (Serialization)是將對象的狀態信息轉換爲可以存儲或傳輸的形式的過程。
序列化,是指將複雜的QuerySet和Model類型轉換成Python基本數據類型,從而將這些基本數據
類型以JSON的形式響應給客戶端。

反序列化則和序列化相反,是指將Http請求中傳入的JSON數據轉換成複雜的數據類型,從而保存
在數據庫中。

二、rest_framework.serializers.HyperlinkedModelSerializer(超鏈接model串行器)
1、示例,在APP下新建serializers.py文件

class ModelUserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.UserInfo	#models.py中的類
        fields = '__all__'  # '__all__'表示把所有字段都用來生成url
        # fields = ['name', 'pwd']  # 只顯示字段
        # exclude = ['role',]	#刪除的字段

class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

2、auth:表示身份認證的意思
contrib:表示框架自帶的功能
django.contrib.auth:django自帶的身份認證模塊

#用戶類和組類
from django.contrib.auth.models import User, Group

三、序列化
snippets:片段 instance:實例 validated:已經驗證的
1、後面加上app名稱,對單獨的app進行數據遷移
python manage.py makemigrations snippets
2、

# from snippets.models import Snippet
# from snippets.serializers import SnippetSerializer
# from rest_framework.renderers import JSONRenderer
# from rest_framework.parsers import JSONParser

3.用serializer表示實例
data表示python基本數據類型
4、ModelSerializer類沒有做任何特別神奇的事情,它們只是創建序列化器類的快
捷方式,
自動確定的字段集。
create()和update()方法的簡單默認實現。
5、pip install httpie
6.path(r’^a/int:b/$’,…):用轉換器converter獲取參數。int:b第一個參數叫轉換器,
第二個參數是變量名
7、Serializers類進行序列化和反序列化的過程(以snippet這個app爲例)
模型實例或查詢集----python基本類型----json數據

from rest_framwork.renderers import JSONRenderer
from rest_framework.parsers import JSONParser

snippet=Snippet(code=...)

序列化:模型實例----serializer=SnippetSerializer(snippet)----》序列化
爲python基本類型----content=JSONRender().render(serializer.data)----》渲染爲json
數據。
反序列化:json數據:content----stream=io.BytesIO(content)----》轉換爲二進制流----
data=JSONParser().parse(stream)----》轉換爲python基本類型----
serializer=SnippetSerializer(data=data)---->將python基本類型轉換爲對象實例
反序列化之後進行數據驗證: serializer.is_valid()
經過驗證後的合法數據:serializer.validated_data
將更改執行到數據庫:serializer.save()
注意:對查詢集的序列化:serializer=SnippetSerializer(Snippet.objects.all(), many=True)

8、ModelSerializer:更方便的對model實例進行序列化操作。

class SnippetSerializer(serializer.ModelSerializer):
	class Meta:
		model = Snippet
		#fields元組中的元素對應Snippet類中的字段
		fields = ('id', 'title', 'code', 'linenos', 'language', 'style')    
重要的是要記住ModelSerializer類沒有做任何特別神奇的事情,它們只是創建序列化器類的快捷方式:

1.自動確定的字段集。
2.create()和update()方法的簡單默認實現   

打開django shell
from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(repr(serializer))

9、from django.views.decorator.csrf import csrf_exempt

三、HTTP中GET和POST的區別
1、GET/POST都是TCP鏈接

1、最直觀的區別就是GET把參數包含在URL中,POST通過request body傳遞參數。
2、GET產生一個TCP數據包;POST產生兩個TCP數據包。
3、對於GET方式的請求,瀏覽器會把http header和data一併發送出去,服務器響應200(返回數據);
而對於POST,瀏覽器先發送header,服務器響應100 continue,瀏覽器再發送data,
服務器響應200 ok(返回數據)。

2、五種HTTP方法,對應CRUD

GET:讀取(Read)
POST:新建(Create)
PUT:更新(Update)
PATCH:更新(Update),通常是部分更新
DELETE:刪除(Delete)

四、Django中的url和path
1.

from django.urls import path
from django.conf.urls import url

path('a/<int:b>/c/'):path要簡單許多,但是path不支持正則表達式
url(r'^a/(\d)/c/$'):url()支持正則表達式

2、(?P)

‘(?P<name>…)’ 命名組
‘(?P’ 代表這是一個 Python 的語法擴展 ’<…>’ 裏面是你給這個組起的名字,比如你可以給一個全部由數字組成的組叫做 ’num’ ,它的形式就是 ’(?P<num>/d+)’ 。起了名字之後,我們就可以在後面的正則式中通過名字調用這個組,它的形式是

‘(?P=name)’ 調用已匹配的命名組

要注意,再次調用的這個組是已被匹配的組,也就是說它裏面的內容是和前面命名組裏的內容是一樣的。

3、httpie:可以使用httpie測試我們的API 。Httpie是一個用Python編寫的用戶友好的
http客戶端。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章