天天看點

DjangofestFramework---DRF

Django基礎上的架構。

rest:面向資源

[如 請求書籍清單,添加書籍,請求書籍詳情]

restful:滿足rest的應用 。【面向資源的應用】

restful api:restful風格的資料接口【api :資料接口】

【面向資源應用中包含的資料接口】【api: 面向資源去設計一個api,可以是一個路由/網址】

restful api的構成:https://api.zzy.com/v1/books

協定:https

域名: 一個用于部署伺服器的電腦 最好包含"/api"【表示是專門部署api的】

版本:攜帶API版本 【如"/v1"】

路徑: 虛拟位址 【如"/books" 往往與資料庫中的表格名對應】

對于資源的具體操作類型,由HTTP動詞表示

GET[SELEC(sql指令)]:從伺服器取出資源

POST[CREATE]:從伺服器建立一個資源

PUT[UPDATE]:…更新資源【用戶端提供改變後的所有資源字段】

PATCH[UPDATE]:…更新資源【用戶端提供改變的字段】

DELETE[DELETE]:…删除資源

OPTIONS: 關于該資源可以進行的操作【用戶端可進行的】

HEAD:擷取資源的中繼資料

如:GET/zoos/ID : 擷取某個指定動物園的資訊

需要使用的 :RestFulAPI 設計的API:

如:

https://api.zzy.com/v1/books/bookid

【GET擷取書資訊,PUT,PATCH修改書資訊,DELETE删除書資訊】【n.都在路由裡,v.都在方法裡】

過濾資訊Filtering:在API中提供參數,過濾傳回結果

?limit=10 :指定傳回記錄的數量

-----------建立一個未使用DRF實作前後端分離的Django--------------------(建立django架構時也可使用前文直接建立Django project)

采用Django的MVT模型:

M全拼為Model,與MVC中的M功能相同,負責和資料庫互動,進行資料處理。

V全拼為View,與MVC中的C功能相同,接收請求,進行業務處理,傳回應答。

T全拼為Template,與MVC中的V功能相同,負責封裝構造要傳回的html。

DjangofestFramework---DRF

Terminal: pip install django

django-admin startproject nodrfpro[建立項目]

nodrfpro: manage.py 指令子產品

wsgi.py 伺服器發過來的消息經由其進行中轉

urls.py 所有的路徑位址

settings.py 配置檔案

asgi.py 作用同wsgi,django3 出現

Termianl: cd nodrfpro

py manage.py startapp shop [建立應用 shop檔案夾]

shop : migrations 遷移檔案目錄

_init_.py 子產品

admin.py 注冊背景管理

apps.py 應用的配置

models.py 應用的模型類

tests.py 單元測試子產品

views.py 視圖的編寫

shop.models.py:
from django.db import models

# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=20, verbose_name="分類名")
#當使用print輸出對象時,列印從此方法中return的字元串
def __str__(self):
    return self.name

class Good(models.Model):
name = models.CharField(max_length=20, verbose_name="商品名字")
#follow的屬性允許為空
desc = models.CharField(max_length=100,null=True,blank=True,verbose_name="商品描述")
#分類與商品之間存在 一對多的關系
#在序列化關聯模型時,一定要聲明 related_name
#一找多:related_name:無:c1.good_set.all(),有:c1.goods.all()
category = models.ForeignKey(Category, on_delete=models.CASCADE,
                             verbose_name="分類", related_name='goods')
def __str__(self):
    return self.name

#接着Terminal實作shop的資料遷移--->至dp.sqlite3 建立此處的兩個模型
----------------------------	
nodrfpro.settings.py  新增
INSTALLED_APPS = ['shop',]
------------------------------
Terminal 建立dp.sqlite3
py manage.py makemigrations 
------------------------
Terminal 遷移資料
py manage.py migrate
           

以上M建立完成

nodrfpro.urls.py:

//通過path導入了另外一個應用,應用中注冊了一系列路由(.urls中),

//V與T可以就此使用Django中自帶的

path(‘admin/’, admin.site.urls),

建立超級管理者進入背景

py manage.py createsuperuser

為了看到并管理自己的模型類:[admin.py中注冊模型類]

shop.admin.py:
from django.contrib import admin
from .models import *
# Register your models here.

admin.site.register(Category)
admin.site.register(Good)
------------------
在背景管理中新增資料後,自己設定路由以獲得資料的顯示
------------------
nodrfpro.urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('', include('shop.urls', namespace='shop')),
]                          #在shop中建立urls.py
#命名空間使得可以在不同的app的urls中使用相同的name值而不會導緻URL反解錯誤
#參考https://www.cnblogs.com/huang-yc/p/9651162.html
------------
shop.urls.py:
from django.conf.urls import url
from . import views
#因為在nodrfpro.urls中使用了namespace命名空間 = 'shop'
app_name = 'shop'

urlpatterns = [
#使用到正規表達式時,為了減少對不必要的\的轉義,通常使用r字首,第一個參數是regex
#以下代表一個空字元串
url(r'^$', views.index, name='index')
]
#app的url中name設定友善全局的指向,可搭配app_name使用
#參考https://www.cnblogs.com/rexcheny/p/9635879.html
--------------------------
shop.views.py:
from django.shortcuts import render
import  json
from django.http import  HttpResponse,JsonResponse
from .models import *
#Django自帶的序列化功能
from django.core import  serializers

def index(request):

categorys = Category.objects.all()
result = serializers.serialize("json",categorys)
#如果以json或xml的形式傳回資料,則可以實作前後端分離開發
#return JsonResponse(result, safe = False)
#同上, 但輸出中文
return HttpResponse(json.dumps({'status':0,'data':result}, ensure_ascii=False), content_type='application/json')

#如果使用Django模闆就是前後端不分離
#因為模闆是 templates 目錄下的html檔案,是以牽扯到模闆就會前後端不分離[因為把後端的資料直接傳過去了{{...}},并且可以頁面顯示]
#return render(request,'模闆名字', 傳遞參數)
#return HttpResponse("首頁")
---------------------------------------------------
           

url路由是你的web服務對外暴露的api。

DRF:

pip install djangorestframework
#使用時 vene.Lib.rest_framework[使用rest_framework]
##直到對project的根urls的編寫可參考https://www.django-rest-framework.org/
---------------------------------------------------------------
shop.serializers.py:
from rest_framework import serializers
from .models import *

# 添加序列化工具

class CategorySerializer(serializers.ModelSerializer):
'''
編寫針對Category的序列化類
本類指明了Category的序列化細節
需要繼承ModelSerializer才可以針對模型進行序列化
在Meta類中model指明序列化的模型
        fields指明序列化的字段
'''
#‘goods’[變量名] 一定要和related_name的值一緻
#StringRelatedField() 可以傳回關聯模型中的__str__傳回值,many=True代表多個對象[一個分類中對應多個商品,是以為True,対一方時可以不寫]
#goods = serializers.StringRelatedField(many=True)
#goods = serializers.PrimaryKeyRelatedField(many=True,read_only=True)
#view-name 預設為 '要找的模型名-detail'
goods = serializers.HyperlinkedRelatedField(read_only=True,many=True,view_name='good-detail')

class Meta:
    model = Category
    #__all__代表模型中的所有字段
    #fields = '__all__'
    #fields 指明序列化哪些字段
    fields = ["name", 'goods']

class GoodSerializer(serializers.ModelSerializer):

#在序列化時指定字段, 在[多方] 使用source = 模型名.字段名,read_only=True 表示不能更改
category = serializers.CharField(source='category.name',read_only=True)
class Meta:
    model = Good
    fields = ['name', 'desc', 'category']
---------------------------------------
shop.views.py:
from rest_framework import viewsets
from .models import *
from .serializers import *

class CategoryViewSets(viewsets.ModelViewSet):
'''
分類視圖
繼承ModelViewSet之後擁有GET POST PUT PATCH DELETE 等HTTP動作操作
queryset 指明 需要操作的模型清單
serializer_class 指明序列化類
'''
queryset = Category.objects.all()
serializer_class = CategorySerializer
----------------------
至此'M'-->models.py,'V'-->views.py 編寫完成,‘T’不需編寫
開始注冊路由views
------------------
nodrfpro.urls.py:
from django.contrib import admin
from django.urls import path, include, re_path
from shop.views import *   #需要将上層的nodrfpro檔案夾右鍵-make directory as-sources root,才能找到該下層檔案
#引入DRF自帶的路由類
from rest_framework import routers

router = routers.DefaultRouter()
#可以通過router預設路由注冊資源
router.register('categorys',CategoryViewSets)

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

path('api/v1/',include(router.urls)),

#為了在DRF路由調試界面能夠使用使用者相關功能需要引入以下路由
#顯示使用者的資訊,可登入和登出,使用者資訊同admin的superuser
path('api-auth/',include('rest_framework.urls')),]
-----------------------------
           

#同理,在shop.serializers.py和shop.views.py中建立對應Good的類,

并在nodrfpro.urls.py中 通過預設路由注冊Good的V資源即可添加good資訊的路由

另:自定義序列化類,指定模型序列化類

參考https://www.bilibili.com/video/BV1tZ4y1T77U?p=6

Django中的請求,響應

Django架構:

1、請求類型:WSGIRequest

2、提取請求中的參數使用:request.GET,request.POST,request.FILES

3、響應類型:

HttpResponse,JsonResponse,HttpResponseRedirect

DRF架構:

【from rest_framework.decorators import api_view

@api_view([‘GET’])】

1、請求類型:

rest_framework.request.Request,其實是針對WSGIRequest的封裝

2、提取請求中的參數使用:

GET 請求使用:request.query_params

其餘(POST,PUT,PATCH,DELETE) 使用:request.data

3、響應類型:

【from rest_framework.response import Response】

Response