<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
如果採用前後端分離的架構開發, 後端幾乎不負責任何展現介面的工作,只負責對資料進行管理 。 資料的管理,主要就是:響應前端的請求, 對資料資源的 增加、修改、刪除、列出 。
介面檔案明確說明了,這是針對 管理員使用者 的 請求。
前面我們已經為 銷售員
使用者 專門建立了一個應用 sales
來處理相關的 請求。
所以,我們可以 再為 管理員
使用者 專門建立一個應用 mgr
來處理相關的 請求 進入根目錄,執行:
python manage.py startapp mgr
此時我們會看見,目錄下已將建立了一個mgr的資料夾:
前面,我們都是在views.py 裡面定義函數,處理 http請求的。 但是可以想象, 以後,這個mgr應用要處理很多型別的http請求。 都用這個views.py
就會讓這個檔案非常的龐大, 不好維護。所以,我們可以用不同的 py 檔案處理不同型別的http請求。 比如,這裡我們可以新增一個檔案 customer.py
, 專門處理 使用者端對 customer
資料的操作。將來如果使用者端有對其他型別資料的操作, 比如 order
資料, 我們就可以新增 orders.py
來處理。 從介面檔案,我們可以發現對資源的增刪改查 操作, 都是同一個URL,都是 /api/mgr/medicine 。
而且我們發現,不同的操作請求,使用不同的 HTTP 請求方法 ,比如 新增是POST, 查詢是 GET, 修改是 PUT, 刪除是 DELETE。且請求的引數中都有 action 參數列明這次請求的操作具體是什麼。 注意: Django 的 url路由
功能 不支援 根據 HTTP 請求的方法 和請求體裡面的引數 進行路由。 就是不能像下面這樣,來根據請求 是 post 還是 get 來 路由:
path('customers/', 'app.views.list_customer', method='get'), path('customers/', 'app.views.add_customer', method='post'),
那麼大家想想該怎麼辦?
一種方式是:自己編寫一個函數, 來 根據 http請求的型別 和請求體裡面的引數 分發(或者說路由)給 不同的函數進行處理。
我們可以 在 customer.py
中定義如下 dispatcher
函數:
def dispatcher(request): # 將請求引數統一放入request 的 params 屬性中,方便後續處理 # GET請求 引數在url中,同過request 物件的 GET屬性獲取 if request.method == 'GET': request.params = request.GET # POST/PUT/DELETE 請求 引數 從 request 物件的 body 屬性中獲取 elif request.method in ['POST','PUT','DELETE']: # 根據介面,POST/PUT/DELETE 請求的訊息體都是 json格式 request.params = json.loads(request.body) # 根據不同的action分派給不同的函數進行處理 action = request.params['action'] if action == 'list_customer': return listcustomers(request) elif action == 'add_customer': return addcustomer(request) elif action == 'modify_customer': return modifycustomer(request) elif action == 'del_customer': return deletecustomer(request) else: return JsonResponse({'ret': 1, 'msg': '不支援該型別http請求'})
首先建立一個custome.py檔案:
該函數 把 請求訊息中的引數統一放入到 request請求物件的params 屬性中。params 屬性 被 做成一個 dict 型別 , 方便後面的處理常式來獲取訊息中的引數。 然後 dispatch函數再根據 請求的 型別 和 action 引數的值 決定由那個函數具體處理該請求訊息。比如 action 引數
為 ‘add_customer’
的 請求 就由 addcustomer 函數 進行處理。 當然在檔案的開頭,我們需要 先匯入 JsonResponse
和 json
的定義,像下面這樣:
from django.http import JsonResponse import json
接下來,根據 API 介面 ,我們發現 凡是 API 請求url為 /api/mgr/customers
的,都屬於 客戶 相關的API, 都應該交由 我們上面定義的dispatch函數進行分派處理。那麼我們需要在Django的url路由檔案中加入對應的路由。
我們應該在 總路由檔案 bysms/urls.py 中定義瞭如下部分:
# 凡是 url 以 api/mgr 開頭的, # 都根據 mgr.urls 裡面的 子路由表進行路由 path('api/mgr/', include('mgr.urls')),
在 mgr 目錄下面新增 urls.py 路由檔案, 並 加入如下宣告即可, 如下所示:
from django.urls import path from mgr import customer urlpatterns = [ path('customers', customer.dispatcher), ]
這樣,就表示 凡是 API 請求url為 /api/mgr/customers
的,都交由 我們上面定義的dispatch
函數進行分派處理。
通常資料資源的 增查改刪 裡面的 查 就是 檢視,對應的就是列出資料資源。
根據介面檔案,列出客戶資料介面,後端返回的資料格式如下:
{ "ret": 0, "retlist": [ { "address": "江蘇省常州武進市白雲街44號", "id": 1, "name": "武進市 袁騰飛", "phonenumber": "13886666666" }, { "address": "北京海淀區", "id": 4, "name": "北京海淀區代理 蔡國慶", "phonenumber": "13990123456" } ] }
這裡我們無需 將資料庫中獲取的資料 轉化為 供瀏覽器展示的HTML。 在前後端分離的開發架構中,如何展示資料,那是前端的事情。 我們後端只需要根據介面檔案, 返回原始資料就行。 我們可以使用如下的函數來返回資料庫的所有的 客戶資料資訊:
def listcustomers(request): # 返回一個 QuerySet 物件 ,包含所有的表記錄 qs = Customer.objects.values() # 將 QuerySet 物件 轉化為 list 型別 # 否則不能 被 轉化為 JSON 字串 retlist = list(qs) return JsonResponse({'ret': 0, 'retlist': retlist})
當然在檔案的開頭,我們需要 先匯入 Customer 定義,像下面這樣:
# 匯入 Customer from common.models import Customer
可以發現,無需轉化資料為HTML, 後端的程式碼任務也大大減輕。
通常資料資源的 增查改刪 裡面的 增 就是 新增,對應的就是新增資料資源。 根據介面檔案,新增客戶資料介面,前端提供的客戶資料格式如下:
{ "action":"add_customer", "data":{ "name":"武漢市橋西醫院", "phonenumber":"13345679934", "address":"武漢市橋西醫院北路" } }
我們可以使用如下的函數來處理:
def addcustomer(request): info = request.params['data'] # 從請求訊息中 獲取要新增客戶的資訊 # 並且插入到資料庫中 # 返回值 就是對應插入記錄的物件 record = Customer.objects.create(name=info['name'] , phonenumber=info['phonenumber'] , address=info['address']) return JsonResponse({'ret': 0, 'id':record.id})
Customer.objects.create
方法就可以新增一條Customer
表裡面的記錄。
根據介面檔案,新增客戶 請求是個Post請求
POST /網站名/api/mgr/signin HTTP/1.1 Content-Type: application/x-www-form-urlencoded
注意,預設建立的專案, Django 會啟用一個 CSRF (跨站請求偽造) 安全防護機制。 在這種情況下, 所有的Post、PUT 型別的 請求都必須在HTTP請求頭中攜帶用於校驗的資料。 為了簡單起見,我們先臨時取消掉CSRF的 校驗機制
,等以後有需要再開啟。 要臨時取消掉CSRF的 校驗機制,非常簡單,只需要在 專案的組態檔 bysms/settings.py
中 MIDDLEWARE
設定項 裡 註釋掉 ‘django.middleware.csrf.CsrfViewMiddleware’
即可。
資料資源的 增查改刪 裡面的 改 就是 改動,對應的就是修改資料資源。 根據介面檔案,修改客戶資料介面,前端提供的資料格式如下:
{ "action":"modify_customer", "id": 6, "newdata":{ "name":"武漢市橋北醫院", "phonenumber":"13345678888", "address":"武漢市橋北醫院北路" } }
我們可以使用如下的函數來處理:
def modifycustomer(request): # 從請求訊息中 獲取修改客戶的資訊 # 找到該客戶,並且進行修改操作 customerid = request.params['id'] newdata = request.params['newdata'] try: # 根據 id 從資料庫中找到相應的客戶記錄 customer = Customer.objects.get(id=customerid) except Customer.DoesNotExist: return { 'ret': 1, 'msg': f'id 為`{customerid}`的客戶不存在' } if 'name' in newdata: customer.name = newdata['name'] if 'phonenumber' in newdata: customer.phonenumber = newdata['phonenumber'] if 'address' in newdata: customer.address = newdata['address'] # 注意,一定要執行save才能將修改資訊儲存到資料庫 customer.save() return JsonResponse({'ret': 0})
資料資源的 增查改刪 裡面的 刪 就是 刪除,對應的就是刪除資料資源。 根據介面檔案,刪除客戶資料介面,前端只需要提供要刪除的客戶的ID。
資料格式如下:
{ "action":"del_customer", "id": 6 }
我們可以使用如下的函數來處理:
def deletecustomer(request): customerid = request.params['id'] try: # 根據 id 從資料庫中找到相應的客戶記錄 customer = Customer.objects.get(id=customerid) except Customer.DoesNotExist: return { 'ret': 1, 'msg': f'id 為`{customerid}`的客戶不存在' } # delete 方法就將該記錄從資料庫中刪除了 customer.delete() return JsonResponse({'ret': 0})
最終我們的產品 前端和後端系統會整合在一起成為一個完整的系統。 部署到生產環境(生產環境就是正式的線上運營環境)執行的架構往往比較複雜。我們在後面有專門的章節講述 一個比較完整的線上環境 如何搭建。
現在,請開啟 bysms/urls.py
檔案,在末尾 新增一個:
+ static("/", document_root="./z_dist")
並新增如下宣告
# 靜態檔案服務 from django.conf.urls.static import static
最終,內容如下:
from django.contrib import admin # 匯入一個include函數 from django.urls import path, include # 靜態檔案服務 from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), # 凡是 url 以 sales/ 開頭的, # 都根據 sales.urls 裡面的 子路由表進行路由 path('sales/', include('sales.urls')), # 凡是 url 以 api/mgr 開頭的, # 都根據 mgr.urls 裡面的 子路由表進行路由 path('api/mgr/', include('mgr.urls')), ] + static("/", document_root="./z_dist")
最後的+ static("/", document_root="./z_dist")
就是在url 路由中加入 前端靜態檔案的查詢路徑。 這樣如果 http請求的url 不是以 admin/ sales/ api/mgr/ 開頭, Django 就會認為是要存取 z_dist目錄下面的靜態檔案。
好了,現在我們 執行如下命令,啟動Django 開發伺服器:
python manage.py runserver 0.0.0.0:8080
然後我們開啟瀏覽器,輸入如下網址:
http://127.0.0.1:8080/mgr/index.html#/
新增使用者:
這是前端開發的 客戶管理介面,可以在介面上進行客戶的 增查改刪操作, 這些操作會觸發API 請求傳送給我們的後端服務。 大家可以操作一下看看, 後端是否能夠正確的響應。
到此這篇關於Python Web後端開發中的增查改刪處理的文章就介紹到這了,更多相關Python 增查改刪處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45