欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?Web后端開發(fā)中的增查改刪處理

 更新時間:2022年08月24日 14:08:18   作者:是Dream呀???????  
這篇文章主要介紹了Python?Web后端開發(fā)中的增查改刪處理,文章圍繞主題?展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

如果采用前后端分離的架構(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)文章

最新評論