Python?Web后端開發(fā)中的增查改刪處理
前言
如果采用前后端分離的架構(gòu)開發(fā), 后端幾乎不負(fù)責(zé)任何展現(xiàn)界面的工作,只負(fù)責(zé)對數(shù)據(jù)進(jìn)行管理 。 數(shù)據(jù)的管理,主要就是:響應(yīng)前端的請求, 對數(shù)據(jù)資源的 增加、修改、刪除、列出 。
一、創(chuàng)建 mgr應(yīng)用目錄
接口文檔明確說明了,這是針對 管理員用戶 的 請求。
前面我們已經(jīng)為 銷售員
用戶 專門創(chuàng)建了一個應(yīng)用 sales
來處理相關(guān)的 請求。
所以,我們可以 再為 管理員
用戶 專門創(chuàng)建一個應(yīng)用 mgr
來處理相關(guān)的 請求 進(jìn)入根目錄,執(zhí)行:
python manage.py startapp mgr
此時我們會看見,目錄下已將創(chuàng)建了一個mgr的文件夾:
二、添加處理請求模塊 和 url 路由
前面,我們都是在views.py 里面定義函數(shù),處理 http請求的。 但是可以想象, 以后,這個mgr應(yīng)用要處理很多類型的http請求。 都用這個views.py
就會讓這個文件非常的龐大, 不好維護(hù)。所以,我們可以用不同的 py 文件處理不同類型的http請求。 比如,這里我們可以新增一個文件 customer.py
, 專門處理 客戶端對 customer
數(shù)據(jù)的操作。將來如果客戶端有對其他類型數(shù)據(jù)的操作, 比如 order
數(shù)據(jù), 我們就可以添加 orders.py
來處理。 從接口文檔,我們可以發(fā)現(xiàn)對資源的增刪改查 操作, 都是同一個URL,都是 /api/mgr/medicine 。
而且我們發(fā)現(xiàn),不同的操作請求,使用不同的 HTTP 請求方法 ,比如 添加是POST, 查詢是 GET, 修改是 PUT, 刪除是 DELETE。且請求的參數(shù)中都有 action 參數(shù)表明這次請求的操作具體是什么。 注意: Django 的 url路由
功能 不支持 根據(jù) HTTP 請求的方法 和請求體里面的參數(shù) 進(jìn)行路由。 就是不能像下面這樣,來根據(jù)請求 是 post 還是 get 來 路由:
path('customers/', 'app.views.list_customer', method='get'), path('customers/', 'app.views.add_customer', method='post'),
那么大家想想該怎么辦?
2.1定義函數(shù)
一種方式是:自己編寫一個函數(shù), 來 根據(jù) http請求的類型 和請求體里面的參數(shù) 分發(fā)(或者說路由)給 不同的函數(shù)進(jìn)行處理。
1.新建customer文件,定義dispatcher函數(shù)
我們可以 在 customer.py
中定義如下 dispatcher
函數(shù):
def dispatcher(request): # 將請求參數(shù)統(tǒng)一放入request 的 params 屬性中,方便后續(xù)處理 # GET請求 參數(shù)在url中,同過request 對象的 GET屬性獲取 if request.method == 'GET': request.params = request.GET # POST/PUT/DELETE 請求 參數(shù) 從 request 對象的 body 屬性中獲取 elif request.method in ['POST','PUT','DELETE']: # 根據(jù)接口,POST/PUT/DELETE 請求的消息體都是 json格式 request.params = json.loads(request.body) # 根據(jù)不同的action分派給不同的函數(shù)進(jìn)行處理 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請求'})
首先創(chuàng)建一個custome.py文件:
該函數(shù) 把 請求消息中的參數(shù)統(tǒng)一放入到 request請求對象的params 屬性中。params 屬性 被 做成一個 dict 類型 , 方便后面的處理函數(shù)來獲取消息中的參數(shù)。 然后 dispatch函數(shù)再根據(jù) 請求的 類型 和 action 參數(shù)的值 決定由那個函數(shù)具體處理該請求消息。比如 action 參數(shù)
為 ‘add_customer’
的 請求 就由 addcustomer 函數(shù) 進(jìn)行處理。 當(dāng)然在文件的開頭,我們需要 先導(dǎo)入 JsonResponse
和 json
的定義,像下面這樣:
from django.http import JsonResponse import json
接下來,根據(jù) API 接口 ,我們發(fā)現(xiàn) 凡是 API 請求url為 /api/mgr/customers
的,都屬于 客戶 相關(guān)的API, 都應(yīng)該交由 我們上面定義的dispatch函數(shù)進(jìn)行分派處理。那么我們需要在Django的url路由文件中加入對應(yīng)的路由。
2.總路由文件 bysms/urls.py 中定義
我們應(yīng)該在 總路由文件 bysms/urls.py 中定義了如下部分:
# 凡是 url 以 api/mgr 開頭的, # 都根據(jù) mgr.urls 里面的 子路由表進(jìn)行路由 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
函數(shù)進(jìn)行分派處理。
三、列出客戶
通常數(shù)據(jù)資源的 增查改刪 里面的 查 就是 查看,對應(yīng)的就是列出數(shù)據(jù)資源。
根據(jù)接口文檔,列出客戶數(shù)據(jù)接口,后端返回的數(shù)據(jù)格式如下:
{ "ret": 0, "retlist": [ { "address": "江蘇省常州武進(jìn)市白云街44號", "id": 1, "name": "武進(jìn)市 袁騰飛", "phonenumber": "13886666666" }, { "address": "北京海淀區(qū)", "id": 4, "name": "北京海淀區(qū)代理 蔡國慶", "phonenumber": "13990123456" } ] }
這里我們無需 將數(shù)據(jù)庫中獲取的數(shù)據(jù) 轉(zhuǎn)化為 供瀏覽器展示的HTML。 在前后端分離的開發(fā)架構(gòu)中,如何展示數(shù)據(jù),那是前端的事情。 我們后端只需要根據(jù)接口文檔, 返回原始數(shù)據(jù)就行。 我們可以使用如下的函數(shù)來返回數(shù)據(jù)庫的所有的 客戶數(shù)據(jù)信息:
def listcustomers(request): # 返回一個 QuerySet 對象 ,包含所有的表記錄 qs = Customer.objects.values() # 將 QuerySet 對象 轉(zhuǎn)化為 list 類型 # 否則不能 被 轉(zhuǎn)化為 JSON 字符串 retlist = list(qs) return JsonResponse({'ret': 0, 'retlist': retlist})
當(dāng)然在文件的開頭,我們需要 先導(dǎo)入 Customer 定義,像下面這樣:
# 導(dǎo)入 Customer from common.models import Customer
可以發(fā)現(xiàn),無需轉(zhuǎn)化數(shù)據(jù)為HTML, 后端的代碼任務(wù)也大大減輕。
四、添加客戶
通常數(shù)據(jù)資源的 增查改刪 里面的 增 就是 添加,對應(yīng)的就是添加數(shù)據(jù)資源。 根據(jù)接口文檔,添加客戶數(shù)據(jù)接口,前端提供的客戶數(shù)據(jù)格式如下:
{ "action":"add_customer", "data":{ "name":"武漢市橋西醫(yī)院", "phonenumber":"13345679934", "address":"武漢市橋西醫(yī)院北路" } }
我們可以使用如下的函數(shù)來處理:
def addcustomer(request): info = request.params['data'] # 從請求消息中 獲取要添加客戶的信息 # 并且插入到數(shù)據(jù)庫中 # 返回值 就是對應(yīng)插入記錄的對象 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 校驗
根據(jù)接口文檔,添加客戶 請求是個Post請求
POST /網(wǎng)站名/api/mgr/signin HTTP/1.1 Content-Type: application/x-www-form-urlencoded
注意,缺省創(chuàng)建的項目, Django 會啟用一個 CSRF (跨站請求偽造) 安全防護(hù)機(jī)制。 在這種情況下, 所有的Post、PUT 類型的 請求都必須在HTTP請求頭中攜帶用于校驗的數(shù)據(jù)。 為了簡單起見,我們先臨時取消掉CSRF的 校驗機(jī)制
,等以后有需要再打開。 要臨時取消掉CSRF的 校驗機(jī)制,非常簡單,只需要在 項目的配置文件 bysms/settings.py
中 MIDDLEWARE
配置項 里 注釋掉 ‘django.middleware.csrf.CsrfViewMiddleware’
即可。
六、修改客戶信息
數(shù)據(jù)資源的 增查改刪 里面的 改 就是 改動,對應(yīng)的就是修改數(shù)據(jù)資源。 根據(jù)接口文檔,修改客戶數(shù)據(jù)接口,前端提供的數(shù)據(jù)格式如下:
{ "action":"modify_customer", "id": 6, "newdata":{ "name":"武漢市橋北醫(yī)院", "phonenumber":"13345678888", "address":"武漢市橋北醫(yī)院北路" } }
我們可以使用如下的函數(shù)來處理:
def modifycustomer(request): # 從請求消息中 獲取修改客戶的信息 # 找到該客戶,并且進(jìn)行修改操作 customerid = request.params['id'] newdata = request.params['newdata'] try: # 根據(jù) id 從數(shù)據(jù)庫中找到相應(yīng)的客戶記錄 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'] # 注意,一定要執(zhí)行save才能將修改信息保存到數(shù)據(jù)庫 customer.save() return JsonResponse({'ret': 0})
七、刪除客戶
數(shù)據(jù)資源的 增查改刪 里面的 刪 就是 刪除,對應(yīng)的就是刪除數(shù)據(jù)資源。 根據(jù)接口文檔,刪除客戶數(shù)據(jù)接口,前端只需要提供要刪除的客戶的ID。
數(shù)據(jù)格式如下:
{ "action":"del_customer", "id": 6 }
我們可以使用如下的函數(shù)來處理:
def deletecustomer(request): customerid = request.params['id'] try: # 根據(jù) id 從數(shù)據(jù)庫中找到相應(yīng)的客戶記錄 customer = Customer.objects.get(id=customerid) except Customer.DoesNotExist: return { 'ret': 1, 'msg': f'id 為`{customerid}`的客戶不存在' } # delete 方法就將該記錄從數(shù)據(jù)庫中刪除了 customer.delete() return JsonResponse({'ret': 0})
八、和前端集成
最終我們的產(chǎn)品 前端和后端系統(tǒng)會集成在一起成為一個完整的系統(tǒng)。 部署到生產(chǎn)環(huán)境(生產(chǎn)環(huán)境就是正式的線上運營環(huán)境)運行的架構(gòu)往往比較復(fù)雜。我們在后面有專門的章節(jié)講述 一個比較完整的線上環(huán)境 如何搭建。
現(xiàn)在,請打開 bysms/urls.py
文件,在末尾 添加一個:
+ static("/", document_root="./z_dist")
并添加如下聲明
# 靜態(tài)文件服務(wù) from django.conf.urls.static import static
最終,內(nèi)容如下:
from django.contrib import admin # 導(dǎo)入一個include函數(shù) from django.urls import path, include # 靜態(tài)文件服務(wù) from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), # 凡是 url 以 sales/ 開頭的, # 都根據(jù) sales.urls 里面的 子路由表進(jìn)行路由 path('sales/', include('sales.urls')), # 凡是 url 以 api/mgr 開頭的, # 都根據(jù) mgr.urls 里面的 子路由表進(jìn)行路由 path('api/mgr/', include('mgr.urls')), ] + static("/", document_root="./z_dist")
最后的+ static("/", document_root="./z_dist")
就是在url 路由中加入 前端靜態(tài)文件的查找路徑。 這樣如果 http請求的url 不是以 admin/ sales/ api/mgr/ 開頭, Django 就會認(rèn)為是要訪問 z_dist目錄下面的靜態(tài)文件。
好了,現(xiàn)在我們 運行如下命令,啟動Django 開發(fā)服務(wù)器:
python manage.py runserver 0.0.0.0:8080
然后我們打開瀏覽器,輸入如下網(wǎng)址:
http://127.0.0.1:8080/mgr/index.html#/
添加用戶:
這是前端開發(fā)的 客戶管理界面,可以在界面上進(jìn)行客戶的 增查改刪操作, 這些操作會觸發(fā)API 請求發(fā)送給我們的后端服務(wù)。 大家可以操作一下看看, 后端是否能夠正確的響應(yīng)。
到此這篇關(guān)于Python Web后端開發(fā)中的增查改刪處理的文章就介紹到這了,更多相關(guān)Python 增查改刪處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用字典和列表實現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Python如何利用字典和列表實現(xiàn)一個簡易的學(xué)生信息管理系統(tǒng),文中詳細(xì)注釋,方便理解,需要的可以參考一下2022-06-06python實現(xiàn)調(diào)用其他python腳本的方法
python實現(xiàn)調(diào)用其他python腳本的方法,是一個比較實用的技巧,需要的朋友可以參考下2014-10-10在pycharm中使用matplotlib.pyplot 繪圖時報錯的解決
這篇文章主要介紹了在pycharm中使用matplotlib.pyplot 繪圖時報錯的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06python 實現(xiàn)selenium斷言和驗證的方法
今天小編就為大家分享一篇python 實現(xiàn)selenium斷言和驗證的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02python實現(xiàn)簡單學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python簡單的學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04