基于django开发项目时,对于视图可以使用 FBV 和 CBV 两种模式编写。

FBV

  • FBV,function base views,其实就是编写函数来处理业务请求。
    1. from django.contrib import admin
    2. from django.urls import path
    3. from app01 import views
    4. urlpatterns = [
    5. path('users/', views.users),
    6. ]
  1. from django.http import JsonResponse
  2. def users(request,*args, **kwargs):
  3. if request.method == "GET":
  4. return JsonResponse({"code":1000,"data":"xxx"})
  5. elif request.method == 'POST':
  6. return JsonResponse({"code":1000,"data":"xxx"})
  7. ...

CBV

  • CBV,class base views,其实就是编写类来处理业务请求。
    1. from django.contrib import admin
    2. from django.urls import path
    3. from app01 import views
    4. urlpatterns = [
    5. path('users/', views.UserView.as_view()),
    6. ]
  1. from django.views import View
  2. class UserView(View):
  3. def get(self, request, *args, **kwargs):
  4. return JsonResponse({"code": 1000, "data": "xxx"})
  5. def post(self, request, *args, **kwargs):
  6. return JsonResponse({"code": 1000, "data": "xxx"})

其实,CBV和FBV的底层实现本质上相同的。
image.png

image.png

CBV,其实就是在FBV的基础上进行的功能的扩展,根据请求的方式不同,直接定位到不同的函数中去执行。
如果是基于django编写restful API,很显然使用CBV的方式会更加简洁,因为restful规范中就是根据method不同来执行不同操作。


CBV应用

  1. # urls.py
  2. from django.urls import path
  3. from app01 import views
  4. urlpatterns = [
  5. # http://www.xxx.com/api/v1/users/
  6. path('api/<str:version>/users/', views.UserView.as_view()),
  7. # http://www.xxx.com/api/v1/users/2/
  8. path('api/<str:version>/users/<int:pk>/', views.UserView.as_view()),
  9. ]
  1. # views.py
  2. from django.views import View
  3. from django.http import JsonResponse
  4. class UserView(View):
  5. def get(self, request, version, pk=None):
  6. if not pk:
  7. # 请求用户列表
  8. info = {
  9. "code": 0,
  10. "data": [
  11. {"id": 1, "name": "武沛齐"},
  12. {"id": 1, "name": "武沛齐"},
  13. ]
  14. }
  15. return JsonResponse(info)
  16. else:
  17. # 获取ID=pk的用户信息,并返回
  18. info = {
  19. "code": 0,
  20. "data": {"id": 1, "name": "武沛齐"}
  21. }
  22. return JsonResponse(info)
  23. def post(self, request, version):
  24. # 新增用户,读取 request.POST 中提交的数据并添加到数据库中
  25. info = {
  26. "code": 0,
  27. "data": {"id": 1, "name": "武沛齐"}
  28. }
  29. return JsonResponse(info)
  30. def delete(self, request, version, pk):
  31. # 删除id=pk的用户
  32. info = {
  33. "code": 0,
  34. "data": {}
  35. }
  36. return JsonResponse(info)
  37. def put(self, request, version, pk):
  38. # 读取request.POST中的数据 + pk,更新数据库中的用户信息
  39. info = {
  40. "code": 0,
  41. "data": {"id": 1, "name": "武沛齐"}
  42. }
  43. return JsonResponse(info)
  44. def patch(self, request, version, pk):
  45. # 读取request.POST中的数据 + pk,更新数据库中的用户信息
  46. info = {
  47. "code": 0,
  48. "data": {"id": 1, "name": "武沛齐"}
  49. }
  50. return JsonResponse(info)

从上面的示例看来,基于django框架完全可以开发restful API。
django restframework框架 是在django的基础上又给我们提供了很多方便的功能,让我们可以更便捷基于django开发restful API。

  • 更好看的返回界面
  • 更丰富的组件: 权限、限流等