FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类

网友投稿 657 2022-11-21

FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类

FBV(function base views) 顾名思义基于函数的视图类 CBV(class base views)基于类的视图类

一. 概念 FBV(function base views) 顾名思义基于函数的视图类

CBV(class base views)基于类的视图类

至于区别呢? 我觉得只是写法上的不一样, 实现的结果都是一样的, 我比较喜欢用CBV模式, 因为在Django中内部帮我做了请求方式的判断, 无需用户实现方法判断逻辑, 来看看代码的区别吧

二. 实现代码1.FBV  fbv就是在url中一个路径对应一个函数. 在工程下的url中写如下代码

from api import views urlpatterns = [ path('admin/', admin.site.urls), path('', include('api.urls')), url(r'^test/', views.test_fbv)]

然后在api的views中写如下测试函数:

def test_fbv(request): if(request.method == 'POST'): return HttpResponse("post") if (request.method == 'PUT'): return HttpResponse("put") if (request.method == 'GET'): return HttpResponse("get")

然后运行整个整个工程, 命令行输入python manage.py runserver

因为我的是linux系统, 就选用restclient这个插件进行api的测试

点完send后再看看 返回什么数据, 在response中可以 看到get

可以看到和我们想象的结果一样, 那我们在试试其他的请求方式, 比如put, post等 和我们代码写的一样, 这里我就不截图了

基于方法的视图

REST framework 也允许使用基于函数的视图。它提供了一套简单的装饰器来包装你的函数视图,以确保它们接收 ​​Request​​​(而不是 ​​Django HttpRequest​​​)实例并允许它们返回 ​​Response​​​(而不是 ​​Django HttpResponse​​),并允许你配置该请求的处理方式。

@api_view()

用法:​​@api_view(HTTP 方法列表,举个例子,编写一个简单的视图,手动返回一些数据。

from rest_framework.decorators import api_view@api_view()def hello_world(request): return Response({"message": "Hello, world!"})

默认情况下,只有 ​​GET​​​ 方法会被接受。其他方法将以 ​​"405 Method Not Allowed"​​ 进行响应。要使用其他方法,请指定视图允许的方法,如下所示:

@api_view(['GET', 'POST'])def hello_world(request): if request.method == 'POST': return Response({"message": "Got some data!", "data": request.data}) return Response({"message": "Hello, world!"})

API 策略装饰器 (policy decorators)

为了覆盖默认设置,REST framework 提供了一系列可以添加到视图中的附加装饰器。这些必须在 ​​@api_view​​ 装饰器之后(下方)。

例如,要创建一个使用 ​​throttle​​​ 来确保它每天只能由特定用户调用一次的视图,请使用 ​​@throttle_classes​​​ 装饰器,传递一个 ​​throttle​​ 类列表:

from rest_framework.decorators import api_view, throttle_classesfrom rest_framework.throttling import UserRateThrottleclass OncePerDayUserThrottle(UserRateThrottle): rate = '1/day'@api_view(['GET'])@throttle_classes([OncePerDayUserThrottle])def view(request): return Response({"message": "Hello for today! See you tomorrow!"})

这些装饰器对应于 ​​APIView​​上设置的策略属性

可用的装饰器有:

​​@renderer_classes(...)​​

​​@parser_classes(...)​​

​​@authentication_classes(...)​​

​​@throttle_classes(...)​​

​​@permission_classes(...)​​

每个装饰器都有一个参数,它必须是一个类列表或者一个类元组。

2. CBV CBV就是在url中一个路径对应一个类

在上述工程下的urls下添加如下代码

urlpatterns = [ path('admin/', admin.site.urls), path('', include('api.urls')), url(r'^test_FBV/', views.test_FBV), url(r'^test_CBV/', views.test_CBV.as_view())]

注意当用cbv模式写url时类后面一定要用as_view()方法, 这是规定格式

然后在api下的views文件中写如以下逻辑代码

from django.views import View class test_CBV(View): # 以get形式访问会执行get函数,一般情况下获取数据 def get(self, *args, **kwargs): return HttpResponse('get') # 以post形式访问的话会执行post函数,一般情况下发送数据 def post(self, *args, **kwargs): return HttpResponse('post')

这里做几点说明:

1.cbv模式下的视图类一定要继承Views类

2. 然后重定向get, post, put请求方法等, 实现不同的请求方法实现不同的逻辑代码, api验证这部分我就不说了, 直接用restclient测试就可以了

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:jpa多条件查询重写Specification的toPredicate方法
下一篇:【Python + Selenium】之JS定位总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~