django CBV 设计模式

本文介绍了Django中的Class-Based Views(CBV)设计模式,对比了传统的Function-Based Views(FBV)。CBV利用类来处理HTTP请求,强调代码复用和结构清晰。详细阐述了CBV中View类的dispatch方法,它是如何根据HTTP方法分发到对应的get、post等处理方法的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views) 就是在视图里使用类处理请求。

视图函数中代码

from django.http import JsonResponse, QueryDict
from django.shortcuts import render

# Create your views here.
from django.views import View
from .models import *

class BookAPI(View):
    def get(self, req):
        print(req.method)
        return JsonResponse({'code': 200, 'msg': 'successful'})

    def post(self, req):
        params = req.POST
        title = params.get('title')
        content = params.get('content')
        price = params.get('price')

        poem = Poem.objects.create(
            title=title,
            content=content,
            price=price,
        )
        return JsonResponse({'title': poem.title})

    def put(self, req):
        params = QueryDict(req.body)
        id = int(params.get('id'))
        title = params.get('title', )
        book = Poem.objects.get(pk=id)
        book.title = params.get('title', book.title)
        book.content = params.get('content', book.content)
        book.price = params.get('price', book.price)
        book.save()
        return JsonResponse({'code': 200, 'title': book.title})

    def delete(self, req):
        params = QueryDict(req.body)
        id = int(params.get('id'))
        book = Poem.objects.get(pk=id)
        title = book.title
        book.delete()

        return JsonResponse({'code': 204, 'title': title})

models模型 Poem

class Poem(models.Model):
    title = models.CharField(
        max_length=20,
        null=False,
    )
    content = models.CharField(
        max_length=100,
        null=True,
    )
    price = models.DecimalField(
        max_digits=8,
        decimal_places=2,
    )

urls中代码

from django.conf.urls import url
from .views import *

urlpatterns = [
    url(r'^book$',BookAPI.as_view()),
]

然后将urls添加进项目urls中即可

    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^myapp/',include('myapp.urls')),
]

注:
class BookAPI(View): View类中as_view()方法会调用类中dispatch方法。dispatch方法会将 浏览器请求根据 method 分配 相应 get post put delete 方法

def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn’t exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn’t on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值