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。

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