在 Web 开发中,FBV(Function-Based Views)和 CBV(Class-Based Views)是两种常见的视图设计模式,用于处理 HTTP 请求并生成相应的响应。下面是它们的简要解释:
Function-Based Views (FBV)
在 Function-Based Views 中,每个视图都是一个简单的 Python 函数,该函数接收一个 HTTP 请求作为参数,并返回一个 HTTP 响应。开发者可以直接编写函数来处理请求逻辑,包括数据处理、业务逻辑和生成响应等。
优点:
- 相对简单,易于理解和编写。
- 灵活性高,可以直接使用 Python 函数的各种特性。
缺点:
- 可能导致视图函数变得庞大,难以维护。
- 不够结构化,难以复用和扩展。
Class-Based Views (CBV)
在 Class-Based Views 中,视图是基于类的,每个视图对应于一个类。这些类提供了一些内置的方法来处理不同的 HTTP 请求方法(如 GET、POST 等),开发者可以通过继承和重写这些方法来实现视图的功能。
优点:
- 结构化清晰,代码复用性高。
- 可以利用类的继承和方法重写来实现通用功能,减少重复代码。
缺点:
- 学习曲线较陡,相对复杂。
- 可能需要更多的代码量来实现相同的功能。
如何选择:
- 如果项目简单且功能不复杂,可以选择使用 FBV,快速开发。
- 如果项目较大且功能复杂,推荐使用 CBV,可以更好地组织代码和实现复杂功能。
在 Django 和 Flask 等 Web 框架中,都支持这两种视图设计模式,开发者可以根据项目需求和个人偏好选择合适的视图方式来实现功能。
代码实例
urls.py中:
urlpatterns = [
path('user_auth/', views.user_auth), # FBV
path('user/', views.UserView.as_view()), # CBV
path('info/', views.InfoView.as_view()), # rest-framework CBV和CBV在这里是一样的
]
views中:
from django.views import View
#FBV
def user_auth(request):
if request.method == "GET":
return JsonResponse({"code":200,"message":"GET"})
if request.method == "POST":
return JsonResponse({"code":200,"message":"POST"})
if request.method == "PUT":
return JsonResponse({"code":200,"message":"PUT"})
if request.method == "DELETE":
return JsonResponse({"code":200,"message":"DELETE"})
#CBV
class UserView(View):
def get(self,request):
return JsonResponse({"code": 200, "message": "GET"})
def post(self,request):
return JsonResponse({"code": 200, "message": "POST"})
def delete(self,request):
return JsonResponse({"code": 200, "message": "DELETE"})
def put(self,request):
return JsonResponse({"code": 200, "message": "PUT"})
# django rest-framework CBV
class InfoView(APIView):
def get(self, request):
return Response({"code:200", "message:GET"})
def post(self, request):
return JsonResponse({"code": 200, "message": "POST"})
def delete(self, request):
return JsonResponse({"code": 200, "message": "DELETE"})
def put(self, request):
return JsonResponse({"code": 200, "message": "PUT"})
我们实际开发中推荐使用的是CBV,因为即使项目比较小,总会有做大的时候,相信自己有一天可以开发复杂的难度大的项目(手动狗头!)。CBV的书写方式结构也更加清晰,当然也要了解FBV的模式。
效果
上述代码的效果,访问网站看下:
FBV
CBV
django rest-framework CBV
其实就是界面上的区别,django rest-framework更加好看好一些。