当前位置:   article > 正文

Django如何定义视图函数?FBV-CBV的使用场景

Django如何定义视图函数?FBV-CBV的使用场景

目录

1. 前言

2. FBV与CBV

2.1 FBV

2.2 CBV

2.3 两种区别

3. request参数

4. 返回值

 5. 结尾


1. 前言

在Django中,我们通过浏览器URL发送了请求,请求通过路由层,最后匹配到相应的视图函数

在视图函数中,也分两种编写形式:FBV、CBV

接下来,我们来看看CBV和FBV两种范式

2. FBV与CBV

2.1 FBV

所谓FBV就是function based views ,函数式编写视图,也就是通过函数的形式,来编写视图:

  1. def test(request):
  2. print(request.resolver_match)
  3. return HttpResponse('code')

这就是最简单的FBV编写视图的形式。

但是我们请求是分为很多种的,我们需要额外进行判断:

  1. def test(request):
  2. if request.method == 'GET':
  3. print(request.resolver_match)
  4. return HttpResponse('get')
  5. else:
  6. return HttpResponse('这是post')

2.2 CBV

所谓CBV就是clss based views ,类编写视图,也就是通过类的形式,来编写视图:

  1. class User(View):
  2. def get(self , request):
  3. print('hello')
  4. return HttpResponse('我是get')
  5. def post(self , request):
  6. return HttpResponse('我是post')

在CBV中,一种函数代表一种请求方式

2.3 两种区别

  • 定义路由的形式不同

FBV: 

path('test/', views.test)

CBV:

path('user/' , views.User.as_view())
  • 应用范围一般不同

FBV:

一般用于前后端不分离

CBV:

一般用于前后端分离(小程序API ,DRF)

3. request参数

request封装了HTTP请求对象,本质上是一个WSGIRequest对象,源码如下:

我们大致可以看看request里面都有什么,这肯定少不了源码啦(这个时候,研究源码的好处就来咯)

  1. def __init__(self, environ):
  2. script_name = get_script_name(environ)
  3. # If PATH_INFO is empty (e.g. accessing the SCRIPT_NAME URL without a
  4. # trailing slash), operate as if '/' was requested.
  5. path_info = get_path_info(environ) or "/"
  6. self.environ = environ
  7. self.path_info = path_info
  8. # be careful to only replace the first slash in the path because of
  9. # http://test/something and http://test//something being different as
  10. # stated in RFC 3986.
  11. self.path = "%s/%s" % (script_name.rstrip("/"), path_info.replace("/", "", 1))
  12. self.META = environ
  13. self.META["PATH_INFO"] = path_info
  14. self.META["SCRIPT_NAME"] = script_name
  15. self.method = environ["REQUEST_METHOD"].upper()
  16. # Set content_type, content_params, and encoding.
  17. self._set_content_type_params(environ)
  18. try:
  19. content_length = int(environ.get("CONTENT_LENGTH"))
  20. except (ValueError, TypeError):
  21. content_length = 0
  22. self._stream = LimitedStream(self.environ["wsgi.input"], content_length)
  23. self._read_started = False
  24. self.resolver_match = None

我们大概可以梳理一下:

当然,下面还有很多方法可以使用,常用的就这几个:

  1. request.method # 请求方法
  2. request.GET # get请求参数,也就是url的?后面的
  3. reqeust.POST # post请求参数
  4. request.FILES # 文件参数
  5. request.path_info # 路径
  6. request.body # 原始请求数据

4. 返回值

  1. from Django.http import JsonResponse
  2. from django.shortcuts import render, HttpResponse,redirect
  • HttpResponse:构建响应体和响应头,返回字符串
  • JsonResponse:json格式

一般JsonResponse返回的数据中文是乱码的 , 这个时候就要加上后面的参数.

  1. 中文显示:
  2. JsonResponse({"吊毛": 1}, json_dumps_params={'ensure_ascii': False})
  • render:返回html页面
  • redirect:重定向 301/ 302
  1. 301302
  2. 301:永久重定向,相当于直接替换掉,一般用于域名跳转
  3. 302:临时重定向,相当于保留原地址,一般用作临时的跳转

 5. 结尾

Django业务开发离不开视图层,熟练掌握视图层,能让我们更好的开发业务需求。

我们经常都会用到requets封装的参数,例如获取请求方法、请求体等

最后就是返回值问题,HttpResponse一般用于返回字符串内容,而JsonResponse一般返回json数据等等,采用合适的返回值能让业务走的更流通。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/389193
推荐阅读
相关标签
  

闽ICP备14008679号