程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python Web開發(八):後端開發中的增查改刪處理

編輯:Python

本文目錄:

  • 一、創建 mgr應用目錄
  • 二、添加處理請求模塊 和 url 路由
    • 2.1定義函數
      • 1.新建customer文件,定義dispatcher函數
      • 2.總路由文件 bysms/urls.py 中定義
      • 3.mgr下添加 urls.py 路由文件
  • 三、列出客戶
  • 四、添加客戶
  • 五、臨時取消 CSRF 校驗
  • 六、修改客戶信息
  • 七、刪除客戶
  • 八、和前端集成
  • `【系列好文推薦】`

前言:
作者簡介:是Dream呀,華為雲享專家、CSDN原力計劃作者、Python領域優質創作者,專注分享Python領域原創系列文章。
熱門專欄:【零基礎學Python
本課程是針對Python入門&進階打造的一全套課程,在這裡,我將會一 一更新Python基礎語法、Python爬蟲、Web開發、 Django框架、Flask框架以及人工智能相關知識,幫助你成為Python大神,如果你喜歡的話就抓緊收藏訂閱起來吧~
如果對學習沒有自制力或者沒有一起學習交流的動力,歡迎私信我或者文末添加vx,拉你進群,群內有行業大佬幫大家解答疑問,我們一起學習,群內定期還會有抽獎活動和紅包相送嗷,快來進入我們吧~
入門須知:這片樂園從不缺乏天才,努力才是你的最終入場券!
最後,願我們都能在看不到的地方閃閃發光,一起加油進步

如果采用前後端分離的架構開發, 後端幾乎不負責任何展現界面的工作,只負責對數據進行管理 。
數據的管理,主要就是:響應前端的請求, 對數據資源的 增加、修改、刪除、列出 。

一、創建 mgr應用目錄

接口文檔明確說明了,這是針對 管理員用戶 的 請求。

前面我們已經為 銷售員用戶 專門創建了一個應用 sales 來處理相關的 請求。

所以,我們可以 再為 管理員用戶 專門創建一個應用 mgr 來處理相關的 請求
進入根目錄,執行:

python manage.py startapp mgr

此時我們會看見,目錄下已將創建了一個mgr的文件夾:

二、添加處理請求模塊 和 url 路由

前面,我們都是在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'),

那麼大家想想該怎麼辦?

2.1定義函數

一種方式是:自己編寫一個函數, 來 根據 http請求的類型 和請求體裡面的參數 分發(或者說路由)給 不同的函數進行處理。

1.新建customer文件,定義dispatcher函數

我們可以 在 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 函數 進行處理。
當然在文件的開頭,我們需要 先導入 JsonResponsejson 的定義,像下面這樣:

from django.http import JsonResponse
import json


接下來,根據 API 接口 ,我們發現 凡是 API 請求url為 /api/mgr/customers 的,都屬於 客戶 相關的API, 都應該交由 我們上面定義的dispatch函數進行分派處理。那麼我們需要在Django的url路由文件中加入對應的路由。

2.總路由文件 bysms/urls.py 中定義

我們應該在 總路由文件 bysms/urls.py 中定義了如下部分:

 # 凡是 url 以 api/mgr 開頭的,
# 都根據 mgr.urls 裡面的 子路由表進行路由
path('api/mgr/', include('mgr.urls')),

3.mgr下添加 urls.py 路由文件

在 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表裡面的記錄。

五、臨時取消 CSRF 校驗

根據接口文檔,添加客戶 請求是個Post請求

POST /網站名/api/mgr/signin HTTP/1.1
Content-Type: application/x-www-form-urlencoded

注意,缺省創建的項目, Django 會啟用一個 CSRF (跨站請求偽造) 安全防護機制。
在這種情況下, 所有的Post、PUT 類型的 請求都必須在HTTP請求頭中攜帶用於校驗的數據。
為了簡單起見,我們先臨時取消掉CSRF的 校驗機制,等以後有需要再打開。
要臨時取消掉CSRF的 校驗機制,非常簡單,只需要在 項目的配置文件 bysms/settings.pyMIDDLEWARE 配置項 裡 注釋掉 ‘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開發一:Web開發簡介
Python Web開發二:Django的安裝和運行
Python Web開發(三):HTTP請求的url路由

歡迎訂閱本專欄:零基礎學Python 系列課程是針對Python入門&進階打造的一全套課程,在這裡,我將會一 一更新Python基礎語法、Python爬蟲、Web開發、 Django框架、Flask框架以及人工智能相關知識,幫助你成為Python大神,如果你喜歡的話就抓緊收藏訂閱起來吧~
好啦,這就是今天要分享給大家的全部內容了,我們下期再見!
如果你喜歡的話,就不要吝惜你的一鍵三連了~


️️ ️ 商務合作|交流學習|粉絲福利|Python全套資料️ ️ ️ 歡迎聯系~


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved