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

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

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

前言

如果采用前后端分離的架構(gòu)開(kāi)發(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)為 銷(xiāo)售員用戶 專(zhuān)門(mén)創(chuàng)建了一個(gè)應(yīng)用 sales 來(lái)處理相關(guān)的 請(qǐng)求。

所以,我們可以 再為 管理員用戶 專(zhuān)門(mén)創(chuàng)建一個(gè)應(yīng)用 mgr 來(lái)處理相關(guān)的 請(qǐng)求 進(jìn)入根目錄,執(zhí)行:

python manage.py startapp mgr 

此時(shí)我們會(huì)看見(jiàn),目錄下已將創(chuàng)建了一個(gè)mgr的文件夾:

二、添加處理請(qǐng)求模塊 和 url 路由

前面,我們都是在views.py 里面定義函數(shù),處理 http請(qǐng)求的。 但是可以想象, 以后,這個(gè)mgr應(yīng)用要處理很多類(lèi)型的http請(qǐng)求。 都用這個(gè)views.py 就會(huì)讓這個(gè)文件非常的龐大, 不好維護(hù)。所以,我們可以用不同的 py 文件處理不同類(lèi)型的http請(qǐng)求。 比如,這里我們可以新增一個(gè)文件 customer.py, 專(zhuān)門(mén)處理 客戶端對(duì) customer 數(shù)據(jù)的操作。將來(lái)如果客戶端有對(duì)其他類(lèi)型數(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, 查詢(xún)是 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ù)

一種方式是:自己編寫(xiě)一個(gè)函數(shù), 來(lái) 根據(jù) http請(qǐng)求的類(lèi)型 和請(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': '不支持該類(lèi)型http請(qǐng)求'})

首先創(chuàng)建一個(gè)custome.py文件:

該函數(shù) 把 請(qǐng)求消息中的參數(shù)統(tǒng)一放入到 request請(qǐng)求對(duì)象的params 屬性中。params 屬性 被 做成一個(gè) dict 類(lèi)型 , 方便后面的處理函數(shù)來(lái)獲取消息中的參數(shù)。 然后 dispatch函數(shù)再根據(jù) 請(qǐng)求的 類(lèi)型 和 action 參數(shù)的值 決定由那個(gè)函數(shù)具體處理該請(qǐng)求消息。比如 action 參數(shù) 為 ‘add_customer’ 的 請(qǐng)求 就由 addcustomer 函數(shù) 進(jìn)行處理。 當(dāng)然在文件的開(kāi)頭,我們需要 先導(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  開(kāi)頭的,
    # 都根據(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。 在前后端分離的開(kāi)發(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 類(lèi)型
    # 否則不能 被 轉(zhuǎn)化為 JSON 字符串
    retlist = list(qs)

    return JsonResponse({'ret': 0, 'retlist': retlist})

當(dāng)然在文件的開(kāi)頭,我們需要 先導(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 類(lèi)型的 請(qǐng)求都必須在HTTP請(qǐng)求頭中攜帶用于校驗(yàn)的數(shù)據(jù)。 為了簡(jiǎn)單起見(jiàn),我們先臨時(shí)取消掉CSRF的 校驗(yàn)機(jī)制,等以后有需要再打開(kāi)。 要臨時(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è)诤竺嬗袑?zhuān)門(mén)的章節(jié)講述 一個(gè)比較完整的線上環(huán)境 如何搭建。

現(xiàn)在,請(qǐng)打開(kāi) 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/  開(kāi)頭的,
    # 都根據(jù) sales.urls 里面的 子路由表進(jìn)行路由
    path('sales/', include('sales.urls')),
    # 凡是 url 以 api/mgr  開(kāi)頭的,
    # 都根據(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/ 開(kāi)頭, Django 就會(huì)認(rèn)為是要訪問(wèn) z_dist目錄下面的靜態(tài)文件。

好了,現(xiàn)在我們 運(yùn)行如下命令,啟動(dòng)Django 開(kāi)發(fā)服務(wù)器:

python manage.py runserver 0.0.0.0:8080

然后我們打開(kāi)瀏覽器,輸入如下網(wǎng)址:

http://127.0.0.1:8080/mgr/index.html#/

添加用戶:

這是前端開(kāi)發(fā)的 客戶管理界面,可以在界面上進(jìn)行客戶的 增查改刪操作, 這些操作會(huì)觸發(fā)API 請(qǐng)求發(fā)送給我們的后端服務(wù)。 大家可以操作一下看看, 后端是否能夠正確的響應(yīng)。

到此這篇關(guān)于Python Web后端開(kāi)發(fā)中的增查改刪處理的文章就介紹到這了,更多相關(guān)Python 增查改刪處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論