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